startpage

Simple text centric startpage
Log | Files | Refs | README

index.html (29758B)


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