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>