startpage

Simple text centric startpage
Log | Files | Refs | README

index.html (30391B)


      1 <!doctype html>
      2 <html lang="en">
      3   <head>
      4     <meta charset="UTF-8">
      5     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
      6     <title>New Tab</title>
      7     <link rel="icon" type="image/png" sizes="16x16" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElNRQfmBBsMMCnqv3OaAAAAlUlEQVQoz83PIQvCABQE4E+ZQxQGxpnMgvgXxoqoQVxZWTCvrPpjrDYXzBoG/jHDQBFXBe/BC3f3uHv8BxYSvS+2J7GAyEXReVi4iEg9xJ2G2ENK6SrsNISuSiq1wMDoJYwNQKBWsdOIHJwMtZ3OMjDR2BG7WVnKxGZmpnJzsHZv223k6Ns7Olq/onLb98/tbueT/T2ejsYUrwqCFKkAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDktMTRUMTU6MTE6NTQrMDA6MDCEo9THAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE3LTA1LTExVDA4OjUzOjE4KzAwOjAwRp+EjgAAAABJRU5ErkJggg==">
      8     <link rel="icon" type="image/png" sizes="16x16" media="(prefers-color-scheme: light)" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElNRQfmBBsMMCnqv3OaAAAAlUlEQVQoz83PIQvCABQE4E+ZQxQGxpnMgvgXxoqoQVxZWTCvrPpjrDYXzBoG/jHDQBFXBe/BC3f3uHv8BxYSvS+2J7GAyEXReVi4iEg9xJ2G2ENK6SrsNISuSiq1wMDoJYwNQKBWsdOIHJwMtZ3OMjDR2BG7WVnKxGZmpnJzsHZv223k6Ns7Olq/onLb98/tbueT/T2ejsYUrwqCFKkAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDktMTRUMTU6MTE6NTQrMDA6MDCEo9THAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE3LTA1LTExVDA4OjUzOjE4KzAwOjAwRp+EjgAAAABJRU5ErkJggg==">
      9     <link rel="icon" type="image/png" sizes="16x16" media="(prefers-color-scheme: dark)" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAAXNSR0IB2cksfwAAAARnQU1BAACxjwv8YQUAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAJiS0dEAP+Hj8y/AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH6QQbCRUh+wpbcQAAALFJREFUKM+90SFuAlEUheHvvXRCQ8MkBIHBgxk3onVokgaJYDHsobI7qG3SoNgAhuAq2QCIpqpMeBWQMRAcXPufnHPvuSG5PtFdBIWhcEaCoYIoN9NzvmvSM5NHpa7FRfeFrjIa2NleFGztDKJM5SDTrMGTDBxUsmijo2nqzSPIvXsFLR2bB0t7L1Z+tDXw59M3eFZZhsRIy4dorI+1+Slq4tdXSMebE3UXqW4iEW7/rH+3ICa6+mb3XQAAAABJRU5ErkJggg==">
     10     <style>
     11       #prediction,body{font-family:monospace;font-size:1rem}
     12       #prediction:not(:empty){opacity:1}
     13       #prediction{background-color:#1d1d1d;color:#88c0d0cc;box-shadow:.1rem .1rem .7rem #151515;padding: 1rem 1.8rem 1rem 1.8rem;width:100%;margin:auto;opacity:0;border-radius: 0 0 .3rem .3rem;position:relative;z-index:-1}
     14       .input-container input{all:unset;background-color:#151515;color:#6c99bb;border-radius:.3rem;box-shadow:.1rem .1rem .7rem #151515;padding:1.8rem;width:100%;margin:2rem auto 0;display:block}
     15       .input-container:has(#prediction:not(:empty)) input{border-radius:.3rem .3rem 0 0}
     16       .input-container{position:relative;width:100%}
     17       body{width:56vw;margin:25vh auto;background-color:#2e3440;color:#d6dce8;overflow-y:hidden}
     18       body::before{content:"";position:fixed;inset:0;pointer-events:none;background:radial-gradient(circle, transparent 60%, #15151555 100%);}
     19       input{margin:2rem auto}
     20       li.highlight,li:hover{text-shadow:2px 2px 8px #fff;text-decoration:underline;cursor:pointer}
     21       li{width:fit-content;float:left;margin:.3rem 1rem .3rem 0}
     22       p,svg{vertical-align:middle}
     23       svg{width:1rem;height:1rem;padding-right:.5rem}
     24       ul{list-style:none;padding:0;height:30vh;mask-image:linear-gradient(180deg, #000 10%, transparent)}
     25       ul:hover{mask-image:unset;height:unset}
     26     </style>
     27   </head>
     28   <body>
     29     <p id="datetime">
     30       <svg fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
     31         <path d="m12 8v4l3 3m6-3c0 4.9706-4.0294 9-9 9-4.97056 0-9-4.0294-9-9 0-4.97056 4.02944-9 9-9 4.9706 0 9 4.02944 9 9z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2"/>
     32       </svg><span id="datetime-text"></span>
     33     </p>
     34     <div class="input-container">
     35       <input type="text" id="queryInput" placeholder="Enter bookmark or search prefix..." autocomplete="off" autofocus>
     36       <p id="prediction"></p>
     37     </div>
     38     <ul id="bookmarkList"></ul>
     39     <script>
     40 
     41       const subreddits = [
     42       // sort:start
     43       "2007scape",
     44       "abruptchaos",
     45       "anticonsumption",
     46       "antiwork",
     47       "architecturalrevival",
     48       "askreddit",
     49       "beermoneyuk",
     50       "casualuk",
     51       "catastrophicfailure",
     52       "childrenfallingover",
     53       "chrissimpsonsartist",
     54       "collapse",
     55       "comics",
     56       "commandline",
     57       "compoface",
     58       "confusing_perspective",
     59       "consoom",
     60       "cozyplaces",
     61       "cryptocurrency",
     62       "cyberpunk",
     63       "datahoarder",
     64       "dataisbeautiful",
     65       "designporn",
     66       "diyuk",
     67       "donthelpjustfilm",
     68       "earthporn",
     69       "emulation",
     70       "etymologymaps",
     71       "explainlikeimfive",
     72       "factorio",
     73       "fpgagaming",
     74       "fuckcars",
     75       "gametrade",
     76       "getnoted",
     77       "goodnewsuk",
     78       "hardwareswapuk",
     79       "holdmyredbull",
     80       "homeserver",
     81       "idiotsincars",
     82       "imaginarysliceoflife",
     83       "irleastereggs",
     84       "itsaunixsystem",
     85       "justrolledintotheshop",
     86       "kidsarefuckingstupid",
     87       "leopardsatemyface",
     88       "linux",
     89       "linux_devices",
     90       "linux_gaming",
     91       "malelivingspace",
     92       "mapporn",
     93       "maybemaybemaybe",
     94       "mechanical_gifs",
     95       "minimalism",
     96       "moralityscaling",
     97       "moviedetails",
     98       "moviesinthemaking",
     99       "nixos",
    100       "nonononoyes",
    101       "norge",
    102       "norsk",
    103       "oddlyterrifying",
    104       "orphancrushingmachine",
    105       "outoftheloop",
    106       "pareidolia",
    107       "patientgamers",
    108       "peterexplainsthejoke",
    109       "piracy",
    110       "pizzacrimes",
    111       "praisethecameraman",
    112       "prematuretruncation",
    113       "prepperintel",
    114       "printsf",
    115       "programmerhumor",
    116       "propagandaposters",
    117       "scarysigns",
    118       "schuylkillnotes",
    119       "secondsketch",
    120       "seedboxes",
    121       "selfhosted",
    122       "sffpc",
    123       "shitamericanssay",
    124       "shittyrobots",
    125       "softwaregore",
    126       "spottedonrightmove",
    127       "stallmanwasright",
    128       "startpages",
    129       "stupidfood",
    130       "suckless",
    131       "terraria",
    132       "thatsabooklight",
    133       "theydidthemath",
    134       "theyknew",
    135       "tipofmytongue",
    136       "todayilearned",
    137       "tombstoning",
    138       "trippinthroughtime",
    139       "unixporn",
    140       "vandwellers",
    141       "wellthatsucks",
    142       "whatcouldgowrong",
    143       "whatisthisthing",
    144       "windowsmodding",
    145       "wizardposting",
    146       "worldnews",
    147       "youshouldknow"
    148       // sort:end
    149       ];
    150 
    151       const bookmarks = [
    152       // sort:start
    153       { name: "/g/ Technology", url: "https://boards.4channel.org/g/" },
    154       { name: "/r/Roms Megathread", url: "https://r-roms.github.io/" },
    155       { name: "Aftenposten", url: "https://www.aftenposten.no/" },
    156       { name: "AuroraWatch", url: "https://aurorawatch.lancs.ac.uk/" },
    157       { name: "Bank Holidays", url: "https://www.gov.uk/bank-holidays" },
    158       { name: "BBC News", url: "https://www.bbc.co.uk/news" },
    159       { name: "BBC Sport", url: "https://www.bbc.co.uk/sport" },
    160       { name: "BestInvest Funds", url: "https://www.bestinvest.co.uk/v2/investment-search#/" },
    161       { name: "Bitcoin Rainbow", url: "https://www.blockchaincenter.net/bitcoin-rainbow-chart/" },
    162       { name: "BorgBase", url: "https://www.borgbase.com/repositories" },
    163       { name: "ChatGPT", url: "https://chatgpt.com/" },
    164       { name: "Claude", url: "https://claude.ai/" },
    165       { name: "Cloudflare", url: "https://dash.cloudflare.com/" },
    166       { name: "Codecademy", url: "https://www.codecademy.com/learn" },
    167       { name: "CoinMarketCap Portfolio", url: "https://coinmarketcap.com/portfolio-tracker/" },
    168       { name: "CryptoVision", url: "https://cryptovision.live/" },
    169       { name: "CSS Minifier", url: "https://www.toptal.com/developers/cssminifier/" },
    170       { name: "Diff Merge", url: "https://editor.mergely.com/" },
    171       { name: "DrayTek Firmware", url: "https://fw.draytek.com.tw/" },
    172       { name: "Drive Prices", url: "https://diskprices.com/?locale=uk" },
    173       { name: "Duolingo", url: "https://www.duolingo.com/" },
    174       { name: "Duolinguists", url: "https://duolinguists.wordpress.com/i-speak-english/" },
    175       { name: "eBay Balance", url: "https://www.ebay.co.uk/mes/summary" },
    176       { name: "eBay Dispatch", url: "https://www.ebay.co.uk/sh/ord/?filter=status%3AAWAITING_SHIPMENT" },
    177       { name: "eBay Holiday", url: "https://www.ebay.co.uk/vac/timeaway" },
    178       { name: "Emulation General Wiki", url: "https://emulation.gametechwiki.com/index.php/Main_Page" },
    179       { name: "Epic Games", url: "https://store.epicgames.com/en-US/free-games" },
    180       { name: "EpisodeFeed", url: "https://episodefeed.com/my-feed#currently-in-feed" },
    181       { name: "Fanatical", url: "https://www.fanatical.com/en/" },
    182       { name: "Filter Lists", url: "https://filterlists.com/" },
    183       { name: "FitGirl", url: "https://fitgirl-repacks.site/" },
    184       { name: "Flagle", url: "https://www.flagle.io/" },
    185       { name: "Flight Radar 24", url: "https://www.flightradar24.com/" },
    186       { name: "FreshRSS", url: "https://rss.minskio.co.uk/" },
    187       { name: "Geography Quizes", url: "https://worldswire.com/" },
    188       { name: "GitHub", url: "https://github.com/breadcat/" },
    189       { name: "Google Keep", url: "https://keep.google.com/" },
    190       { name: "HackerNews", url: "https://news.ycombinator.com/news" },
    191       { name: "Hemnet", url: "https://www.hemnet.se/" },
    192       { name: "Home AP", url: "https://192.168.1.2/" },
    193       { name: "Home Router", url: "https://192.168.1.1/" },
    194       { name: "Hugo Local", url: "http://127.0.0.1:1313/" },
    195       { name: "IMDb Top 250", url: "https://www.imdb.com/chart/top" },
    196       { name: "Japanese Class", url: "https://japaneseclass.jp/" },
    197       { name: "JavaScript Minifier", url: "https://www.toptal.com/developers/javascript-minifier/" },
    198       { name: "Klar Tale", url: "https://www.klartale.no/" },
    199       { name: "Kodi", url: "http://kodi:kodi@192.168.1.6:8080/" },
    200       { name: "Limoncello", url: "https://drink.home.minskio.co.uk/" },
    201       { name: "Linode", url: "https://cloud.linode.com/linodes" },
    202       { name: "Lobsters", url: "https://lobste.rs/" },
    203       { name: "Logical Increments", url: "https://www.logicalincrements.com/" },
    204       { name: "Marine Traffic", url: "https://www.marinetraffic.com/" },
    205       { name: "Meetup", url: "https://www.meetup.com/your-events/" },
    206       { name: "Met Office Weather", url: "https://www.metoffice.gov.uk/public/weather/forecast/gcw9rrxn7" },
    207       { name: "Minskio", url: "https://minskio.co.uk/" },
    208       { name: "Mistral", url: "https://chat.mistral.ai/chat" },
    209       { name: "Myrient", url: "https://myrient.erista.me/files/" },
    210       { name: "Nault NANO Wallet", url: "https://nault.cc/" },
    211       { name: "Nexo", url: "https://platform.nexo.io/" },
    212       { name: "Noisli", url: "https://www.noisli.com/" },
    213       { name: "Oracle", url: "https://cloud.oracle.com/compute/instances" },
    214       { name: "Outlook", url: "https://outlook.office.com/mail/inbox" },
    215       { name: "Paperspace", url: "https://console.paperspace.com/" },
    216       { name: "PC Part Picker", url: "https://uk.pcpartpicker.com/list/" },
    217       { name: "Postcode Finder", url: "https://www.royalmail.com/find-a-postcode" },
    218       { name: "Power Cut Map", url: "https://www.northernpowergrid.com/power-cuts-map" },
    219       { name: "Prolific", url: "https://app.prolific.com" },
    220       { name: "Public Directory", url: "https://pub.home.minskio.co.uk/" },
    221       { name: "Radiooooo", url: "https://radiooooo.com/" },
    222       { name: "Real Time Lightning Map", url: "https://www.lightningmaps.org/" },
    223       { name: "Redactle", url: "https://redactle.net/" },
    224       { name: "Reddit", url: "https://reddit.com/r/" + subreddits.join("+") + "/" },
    225       { name: "Rightmove", url: "https://www.rightmove.co.uk/" },
    226       { name: "Showcase", url: "https://www.showcasecinemas.co.uk/showtimes/showcase-cinema-de-lux-leeds" },
    227       { name: "Sliding Puzzle Solver", url: "https://jweilhammer.github.io/sliding-puzzle-solver/" },
    228       { name: "Spotify", url: "https://open.spotify.com/" },
    229       { name: "SQLite Viewer", url: "https://sqliteviewer.app/" },
    230       { name: "Stable Tracker", url: "https://newtrackon.com/list" },
    231       { name: "Stagit", url: "https://git.minskio.co.uk/" },
    232       { name: "Stromboli", url: "https://stream.home.minskio.co.uk/" },
    233       { name: "Suckless", url: "https://suckless.org/" },
    234       { name: "Syncthing", url: "http://127.0.0.1:8384/" },
    235       { name: "Telegram", url: "https://web.telegram.org/k/" },
    236       { name: "Teleport Map", url: "https://oldschool.runescape.wiki/images/Teleport_map.jpg" },
    237       { name: "Time Zone Map", url: "https://upload.wikimedia.org/wikipedia/commons/e/ec/World_Time_Zones_Map.svg" },
    238       { name: "Timer", url: "https://pub.minskio.co.uk/.timer/" },
    239       { name: "Tradle", url: "https://tradle.net/" },
    240       { name: "Transmission", url: "https://tor.minskio.co.uk" },
    241       { name: "Traveline Route Planner", url: "https://www.traveline.info/" },
    242       { name: "TTS NaturalReader", url: "https://www.naturalreaders.com/online/" },
    243       { name: "Tynan Portfolio", url: "https://dashboard.m1finance.com/share/H4sIAAAAAAACA53PzwuCMBQH8H9F3jUP05JK6BDYUSXQIiJirMea2RJdiMn-99ah0y6r43t8P-_HCGpoEGKQ2J8bgeCDpPdPoxgkld66rr09UnXF1gtJSCYm0NWCYQfxcQT1gHj8juiQPVuhBhMRF1OXZJfkFY-yqlyB9qHBlqFUlJtwMNO-K39tLb501Lc-LZilp-SH5anFF466DLNkY38euN9eHWxOfuD8_-08ygubz_VJvwFVDPxOMwIAAA?referrerCode=5QM0YPa-0rCz" },
    244       { name: "Unifi Portal", url: "https://unifi.ui.com/" },
    245       { name: "unRPA", url: "https://im7mortal.github.io/unrpa/" },
    246       { name: "Unsplash", url: "https://unsplash.com/" },
    247       { name: "VaultWarden", url: "https://pass.minskio.co.uk/" },
    248       { name: "Ventu Sky", url: "https://www.ventusky.com/" },
    249       { name: "Vidyaplace Wiki", url: "http://vscape.wikidot.com/" },
    250       { name: "Vidyaplace", url: "https://vidyaplace.org/" },
    251       { name: "Vikunja", url: "https://todo.minskio.co.uk/" },
    252       { name: "Vuniper", url: "https://vuniper.com/movies" },
    253       { name: "W3C validator", url: "https://validator.w3.org/" },
    254       { name: "Walk Mapper", url: "https://onthegomap.com/" },
    255       { name: "Webex Admin", url: "https://admin.webex.com/" },
    256       { name: "Weight Tracker", url: "https://weight.home.minskio.co.uk/" },
    257       { name: "WhatsApp", url: "https://web.whatsapp.com/" },
    258       { name: "WikiQuote Random", url: "https://en.wikiquote.org/wiki/Special:Random" },
    259       { name: "Winget", url: "https://winstall.app/apps/" },
    260       { name: "Wordle", url: "https://www.nytimes.com/games/wordle/index.html" },
    261       { name: "Worldle", url: "https://worldle.teuteuf.fr/" },
    262       { name: "Zoho Mail", url: "https://mail.zoho.eu/zm/#mail" },
    263       { name: "Zoho Sheets", url: "https://sheet.zoho.eu/spreadsheets" },
    264       { name: "Zoopla", url: "https://www.zoopla.co.uk/" }
    265       // sort:end
    266       ];
    267 
    268       const commandMap = {
    269       // sort:start
    270       a: {base: "https://www.amazon.co.uk/",query: "https://www.amazon.co.uk/s?k={q}"},
    271       abb: {base: "http://audiobookbay.fi/",query: "http://audiobookbay.fi/?s={q}"},
    272       alp: {base: "https://pkgs.alpinelinux.org/packages?name=&branch=edge&arch=x86_64",query: "https://pkgs.alpinelinux.org/packages?branch=edge&arch=x86_64&name={q}"},
    273       anna: {base: "https://annas-archive.org/",query: "https://annas-archive.org/search?q={q}"},
    274       ans: {base: "https://galaxy.ansible.com/", query: "https://galaxy.ansible.com/search?deprecated=false&keywords={q}"},
    275       ap: {base: "https://www.archlinux.org/packages/", query: "https://www.archlinux.org/packages/?sort=&q={q}"},
    276       archive: {base: "https://web.archive.org/", query: "https://web.archive.org/web/*/{q}"},
    277       aur: {base: "https://aur.archlinux.org/packages/", query: "https://aur.archlinux.org/packages/?O=0&K={q}"},
    278       aw: {base: "https://wiki.archlinux.org/", query: "https://wiki.archlinux.org/index.php?title=Special:Search&search={q}"},
    279       cb: {base: "https://comicvine.gamespot.com/", query: "https://comicvine.gamespot.com/search/?q={q}"},
    280       cg: {base: "https://www.coingecko.com/", query: "https://www.coingecko.com/en/coins/{q}"},
    281       choco: {base: "https://chocolatey.org/packages", query: "https://chocolatey.org/packages?q={q}"},
    282       cron: {base: "https://crontab.guru/", query: "https://crontab.guru/#{q}"},
    283       d: {base: "https://start.duckduckgo.com/", query: "https://start.duckduckgo.com/?q={q}"},
    284       deb: {base: "https://packages.debian.org/", query: "https://packages.debian.org/{q}"},
    285       dock: {base: "https://hub.docker.com/", query: "https://hub.docker.com/search/?pullCount=1&q={q}"},
    286       down: {base: "https://downforeveryoneorjustme.com/", query: "https://downforeveryoneorjustme.com/{q}"},
    287       e: {base: "https://www.ebay.co.uk/", query: "https://www.ebay.co.uk/sch/i.html?_nkw={q}"},
    288       emu: {base: "https://emulation.gametechwiki.com/index.php", query: "https://emulation.gametechwiki.com/index.php?title=Special:Search&search={q}"},
    289       f: {base: "https://f-droid.org/", query: "https://search.f-droid.org/?lang=en&q={q}"},
    290       fast: {base: "https://fast.com/"},
    291       g: {base: "https://www.google.co.uk", query: "https://www.google.co.uk/search?udm=14&q={q}"},
    292       gamma: {base: "https://www.gamma-portal.com/framework/home.jspa", query: "https://www.gamma-portal.com/voip/ipdc/searchInput.jspa#{q}"},
    293       ge: {base: "https://www.ge-tracker.com/",query: "https://www.ge-tracker.com/names/{q}"},
    294       gf: {base: "https://gamefaqs.gamespot.com/", query: "https://gamefaqs.gamespot.com/search?game={q}"},
    295       gist: {base: "https://gist.github.com/", query: "https://gist.github.com/search?utf8=%E2%9C%93&q={q}"},
    296       git: {base: "https://github.com/", query: "https://github.com/search?q={q}"},
    297       gl: {base: "https://www.google.co.uk", query: "https://www.google.co.uk/search?btnI=1&q={q}"},
    298       gm: {base: "https://www.google.co.uk/maps/", query: "https://www.google.co.uk/maps/search/{q}"},
    299       gmt: {base: "https://www.google.co.uk/maps/",query: "https://www.google.co.uk/maps/dir/Brighouse/{q}/Brighouse/"},
    300       gog: {base: "https://www.gog.com/", query: "https://www.gog.com/games?query={q}"},
    301       gogg: {base: "https://gog-games.to/", query: "https://gog-games.to/?search={q}"},
    302       gr: {base: "https://www.goodreads.com/", query: "https://www.goodreads.com/search?utf8=%E2%9C%93&q={q}"},
    303       gum: {base: "https://www.gumtree.com/", query: "https://www.gumtree.com/search?q={q}&search_location=Brighouse&distance=30"},
    304       hm: {base: "https://home-manager-options.extranix.com", query: "https://home-manager-options.extranix.com/?query={q}"},
    305       i: {base: "https://images.google.co.uk/", query: "https://www.google.co.uk/search?tbm=isch&q={q}"},
    306       im: {base: "https://imdb.com/", query: "https://www.imdb.com/find?ref_=nv_sr_fn&s=all&q={q}"},
    307       ip: {base: "https://ip.minskio.co.uk/", query: "https://www.ip2location.com/demo/{q}"},
    308       ipl: {base: "https://www.bbc.co.uk/iplayer/", query: "https://www.bbc.co.uk/iplayer/search?q={q}"},
    309       jack: {base: "https://jack.minskio.co.uk", query: "https://jack.minskio.co.uk/UI/Dashboard#search={q}"},
    310       last: {base: "https://www.last.fm/", query: "https://www.last.fm/search?q={q}"},
    311       lut: {base: "https://lutris.net/", query: "https://lutris.net/games?q={q}"},
    312       m: {base: "https://wego.here.com/", query: "https://wego.here.com/search/{q}"},
    313       mac: {base: "https://macvendors.com/", query: "https://api.macvendors.com/{q}"},
    314       man: {base: "https://man.archlinux.org/", query: "https://man.archlinux.org/search?go=Go&q={q}"},
    315       mb: {base: "https://musicbrainz.org/", query: "https://musicbrainz.org/search?type=artist&limit=100&method=indexed&query={q}"},
    316       mx: {base: "https://mxtoolbox.com/SuperTool.aspx", query: "https://mxtoolbox.com/SuperTool.aspx?action={q}"},
    317       nitter: {base: "https://nitter.net/", query: "https://nitter.net/search?f=users&q={q}"},
    318       nix: {base: "https://nixos.org/", query: "https://search.nixos.org/packages?query={q}"},
    319       nixo: {base: "https://search.nixos.org/options", query: "https://search.nixos.org/options?query={q}"},
    320       no: {base: "https://enno.dict.cc/", query: "https://enno.dict.cc/?s={q}"},
    321       nyaa: {base: "https://nyaa.si/", query: "https://nyaa.si/?s=seeders&o=desc&q={q}"},
    322       osm: {base: "https://www.openstreetmap.org/", query: "https://www.openstreetmap.org/search?query={q}"},
    323       osrs: {base: "https://oldschool.runescape.wiki/", query: "https://oldschool.runescape.wiki/?title=Special%3ASearch&search={q}"},
    324       pass: {base: "https://pass.minskio.co.uk/"},
    325       pay: {base: "https://12ft.io/", query: "https://12ft.io/{q}"},
    326       pc: {base: "https://pcgamingwiki.com/w/index.php", query: "https://pcgamingwiki.com/w/index.php?title=Special:Search&search={q}"},
    327       pix: {base: "https://www.pixnoy.com/", query: "https://www.pixnoy.com/profile/{q}/"},
    328       play: {base: "https://play.google.com/store/", query: "https://play.google.com/store/search?c=apps&q={q}"},
    329       proton: {base: "https://protondb.com/explore", query: "https://protondb.com/search?q={q}"},
    330       rfc: {base: "https://datatracker.ietf.org/", query: "https://datatracker.ietf.org/doc/search?rfcs=on&name={q}"},
    331       rs3: {base: "https://runescape.wiki/", query: "https://runescape.wiki/?title=Special%3ASearch&go=Go&search={q}"},
    332       rshs: {base: "https://secure.runescape.com/m=hiscore_oldschool/", query: "https://secure.runescape.com/m=hiscore_oldschool/hiscorepersonal?user1={q}"},
    333       rss: {base: "https://rss.minskio.co.uk/"},
    334       rt: {base: "https://www.rottentomatoes.com/", query: "https://www.rottentomatoes.com/search/?search={q}"},
    335       s: {base: "https://store.steampowered.com/", query: "https://store.steampowered.com/search/?term={q}"},
    336       sc: {base: "https://github.com/koalaman/shellcheck/", query: "https://github.com/koalaman/shellcheck/wiki/{q}"},
    337       skey: {base: "https://store.steampowered.com/", query: "https://store.steampowered.com/account/registerkey?key={q}"},
    338       spot: {base: "https://open.spotify.com/", query: "https://open.spotify.com/search/{q}"},
    339       srx: {base: "https://searx.be/", query: "https://searx.be/?q={q}"},
    340       ss: {base: "https://steamspy.com/", query: "https://steamspy.com/search.php?s={q}"},
    341       st: {base: "https://www.startpage.com/", query: "https://www.startpage.com/do/metasearch.pl?query={q}"},
    342       svg: {base: "https://freesvgicons.com/", query: "https://freesvgicons.com/search?q={q}&collectionId=fluent"},
    343       t: {base: "https://tineye.com/", query: "https://tineye.com/parse?url={q}"},
    344       tm: {base: "https://www.themoviedb.org/", query: "https://www.themoviedb.org/search?query={q}"},
    345       tmc: {base: "https://login.themilesconsultancy.com/Driver/TripSummary.aspx"},
    346       tmt: {base: "https://www.themoviedb.org/", query: "https://www.themoviedb.org/search/tv?query={q}"},
    347       todo: {base: "https://todo.minskio.co.uk/"},
    348       tr: {base: "https://translate.google.com/", query: "https://translate.google.com/?sl=auto&tl=en&text={q}"},
    349       track: {base: "https://www.royalmail.com/track-your-item", query: "https://www.royalmail.com/track-your-item#/tracking-results/{q}"},
    350       tv: {base: "https://www.thetvdb.com/", query: "https://www.thetvdb.com/search?query={q}"},
    351       tvt: {base: "https://tvtropes.org/", query: "https://tvtropes.org/pmwiki/search_result.php?q={q}"},
    352       ud: {base: "https://www.urbandictionary.com/", query: "https://www.urbandictionary.com/define.php?term={q}"},
    353       ujs: {base: "https://greasyfork.org/en/scripts", query: "https://greasyfork.org/en/scripts?q={q}"},
    354       valid: {base: "https://validator.w3.org/nu/", query: "https://validator.w3.org/nu/?doc={q}"},
    355       vhs: {base: "https://vidyaplace.org/highscores", query: "https://vidyaplace.org/highscores?player={q}"},
    356       w3c: {base: "https://validator.w3.org/", query: "https://validator.w3.org/nu/?doc={q}"},
    357       w3w: {base: "https://what3words.com/",query: "https://what3words.com/{q}"},
    358       w: {base: "https://en.wikipedia.org/w/index.php", query: "https://en.wikipedia.org/w/index.php?title=Special:Search&search={q}"},
    359       wa: {base: "https://www.wolframalpha.com/", query: "https://www.wolframalpha.com/input/?i={q}"},
    360       whois: {base: "https://whois.gandi.net/", query: "https://whois.gandi.net/en/results?search={q}"},
    361       wikt: {base: "https://en.wiktionary.org/w/index.php", query: "https://en.wiktionary.org/w/index.php?title=Special:Search&search={q}"},
    362       wiktno: {base: "https://no.wiktionary.org/w/index.php", query: "https://no.wiktionary.org/w/index.php?title=Special:Search&search={q}"},
    363       wine: {base: "https://www.winehq.org/",query: "https://www.winehq.org/search?q={q}"},
    364       wno: {base: "https://no.wikipedia.org/w/index.php",query: "https://no.wikipedia.org/w/index.php?title=Special:Search&search={q}"},
    365       y: {base: "https://www.youtube.com/",query: "https://www.youtube.com/results?search_query={q}"}
    366       // sort:end
    367       };
    368 
    369       const input = document.getElementById("queryInput");
    370       const bookmarkList = document.getElementById("bookmarkList");
    371       const predictionDisplay = document.getElementById("prediction");
    372 
    373       let filteredBookmarks = [...bookmarks];
    374       let selectedBookmarkIndex = -1;
    375 
    376       function renderBookmarks() {
    377       bookmarkList.innerHTML = "";
    378       filteredBookmarks.forEach((bm, index) => {
    379       const li = document.createElement("li");
    380       li.textContent = bm.name;
    381       if (index === selectedBookmarkIndex) {
    382         li.classList.add("highlight");
    383         // Scroll the selected item into view
    384         setTimeout(() => li.scrollIntoView({ block: "nearest", behavior: "smooth" }), 0);
    385       }
    386       li.addEventListener("click", () => {
    387         window.open(bm.url, "_self");
    388       });
    389       bookmarkList.appendChild(li);
    390       });
    391 
    392       bookmarkList.style.display = filteredBookmarks.length === 0 ? "none" : "block";
    393       }
    394 
    395       function filterBookmarks(query) {
    396         selectedBookmarkIndex = -1;
    397         const lower = query.toLowerCase();
    398         filteredBookmarks = lower === ""
    399           ? [...bookmarks]
    400           : bookmarks.filter(b => b.name.toLowerCase().includes(lower));
    401         renderBookmarks();
    402       }
    403 
    404       function runCommand(prefix, args) {
    405         const cmd = commandMap[prefix];
    406         if (!cmd) return;
    407         const url = args.length === 0
    408           ? cmd.base
    409           : cmd.query.replace("{q}", encodeURIComponent(args.join(" ")));
    410         window.open(url, "_self");
    411       }
    412 
    413       function hintCommand(prefix, args) {
    414         const cmd = commandMap[prefix];
    415         if (!cmd) return "";
    416         return args.length === 0
    417           ? cmd.base
    418           : cmd.query.replace("{q}", encodeURIComponent(args.join(" ")));
    419       }
    420 
    421       function handleCommand(inputValue) {
    422         const parts = inputValue.trim().split(" ");
    423         const prefix = parts[0].toLowerCase();
    424         const args = parts.slice(1);
    425 
    426         if (commandMap[prefix]) {
    427           runCommand(prefix, args);
    428         } else {
    429           const query = encodeURIComponent(inputValue);
    430           window.open(`https://start.duckduckgo.com/?q=${query}`, "_self");
    431         }
    432       }
    433 
    434       function updatePrediction(inputValue) {
    435         const [prefix, ...args] = inputValue.trim().split(" ");
    436         predictionDisplay.textContent = commandMap[prefix?.toLowerCase()]
    437           ? hintCommand(prefix.toLowerCase(), args)
    438           : "";
    439         }
    440 
    441       function normalizeInput(raw) {
    442         const spaceIndex = raw.indexOf(" ");
    443         if (spaceIndex === -1) return raw.replace(/'/g, "");
    444         return raw.slice(0, spaceIndex).replace(/'/g, "") + raw.slice(spaceIndex);
    445       }
    446 
    447       input.addEventListener("input", (e) => {
    448         const value = normalizeInput(e.target.value);
    449         filterBookmarks(value);
    450         updatePrediction(value);
    451       });
    452 
    453       input.addEventListener("keydown", (e) => {
    454       if (e.key === "Tab") {
    455       e.preventDefault();
    456       if (filteredBookmarks.length > 0) {
    457       if (e.shiftKey) {
    458         selectedBookmarkIndex = (selectedBookmarkIndex - 1 + filteredBookmarks.length) % filteredBookmarks.length;
    459       } else {
    460         selectedBookmarkIndex = (selectedBookmarkIndex + 1) % filteredBookmarks.length;
    461       }
    462       renderBookmarks();
    463       }
    464       }
    465       else if (e.key === "ArrowDown") {
    466           e.preventDefault();
    467           if (filteredBookmarks.length > 0) {
    468             selectedBookmarkIndex = (selectedBookmarkIndex + 1) % filteredBookmarks.length;
    469             renderBookmarks();
    470           }
    471         } else if (e.key === "ArrowUp") {
    472           e.preventDefault();
    473           if (filteredBookmarks.length > 0) {
    474             selectedBookmarkIndex = (selectedBookmarkIndex - 1 + filteredBookmarks.length) % filteredBookmarks.length;
    475             renderBookmarks();
    476           }
    477         } else if (e.key === "Enter") {
    478           if (selectedBookmarkIndex >= 0) {
    479             window.open(filteredBookmarks[selectedBookmarkIndex].url, "_self");
    480           } else {
    481             handleCommand(normalizeInput(input.value));
    482           }
    483         } else if (e.key === "Escape") {
    484           input.value = "";
    485           predictionDisplay.textContent = "";
    486           filterBookmarks("");
    487         }
    488       });
    489 
    490       // Initial load
    491       filterBookmarks("");
    492       function formatDateTime(date) {
    493       const days = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
    494       const months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
    495 
    496       const dayName = days[date.getDay()];
    497       const day = date.getDate();
    498       const month = months[date.getMonth()];
    499       const hours = String(date.getHours()).padStart(2, '0');
    500       const minutes = String(date.getMinutes()).padStart(2, '0');
    501 
    502       const getOrdinal = (n) => {
    503       if (n > 3 && n < 21) return "th";
    504       switch (n % 10) {
    505       case 1: return "st";
    506       case 2: return "nd";
    507       case 3: return "rd";
    508       default: return "th";
    509       }
    510       };
    511 
    512       return `${dayName} ${day}${getOrdinal(day)} ${month}, ${hours}:${minutes}`;
    513       }
    514 
    515       function updateDateTime() {
    516       const now = new Date();
    517       document.getElementById("datetime-text").textContent = formatDateTime(now);
    518       }
    519 
    520       setInterval(updateDateTime, 60000);
    521       updateDateTime();
    522 
    523     </script>
    524   </body>
    525 </html>