A fast, local-first "redirection engine" for !bang users with a few extra features ^-^
1# Unduckified 2 3![dark and light modes of the app](.github/images/both.webp) 4 5> [!IMPORTANT] 6> This is a fork of [t3dotgg/unduck](https://github.com/t3dotgg/unduck). Check out Theo's hosted version at [unduck.link](https://unduck.link) for the original experience. 7 8## Quick Start 9 10Add this URL as a custom search engine to your browser to use DuckDuckGo's bangs, but faster: 11``` 12https://s.dunkirk.sh?q=%s 13``` 14 15## How is it that much faster? 16 17DuckDuckGo does their redirects server side. Their DNS is...not always great. Result is that it often takes ages. 18 19I solved this by doing all of the work client side. Once you've went to https://s.dunkirk.sh once, the JS is all cache'd and will never need to be downloaded again. Your device does the redirects, not me or any other server. 20 21## How is this different from Theo's version again? 22 23This is primarily my personal fork to experiment with PWAs but I do have a few ideas that I would love to add to this. 24 25<img align="right" width="140" height="140" src="https://raw.githubusercontent.com/taciturnaxolotl/unduckified/main/public/goose.gif" alt="goose walking animation"/> 26 27- [x] Bangs 28- [x] Dark Mode 29- [x] Settings (for things like disabling search history and changing default bang) 30- [x] Search counter 31- [x] [OpenSearch](https://developer.mozilla.org/en-US/docs/Web/XML/Guides/OpenSearch) support 32- [x] Search History (clearable, all local, and disabled by default ofc) 33- [x] Fancy sounds (disabled if you have `prefers-reduced-motion` set; sounds only account for `198.5 KB` of the `717.4 KB` total size) 34- [x] Cute little text animations 35- [x] Auto updating bangs file! (I'm using a [GitHub Action](https://github.com/taciturnaxolotl/unduckified/actions/workflows/update-bangs.yaml) to update the bangs file every 24 hours) 36- [x] Hashmapped bangs for faster searching 37- [x] local font file to avoid google fonts 38- [x] redirects to the base page of a bang if there is no query (e.g. `!g` will take you to google.com and `!yt` will take you to youtube.com) 39- [x] Suffix bangs (e.g. `ghr! taciturnaxolotl/unduckified` will take you to this github repo) 40- [x] Quick settings (e.g. `!settings` or `!` will take you to the settings page) 41- [x] Custom loca bangs! (thnks to [@ayoubabedrabbo@mastodon.social](https://mastodon.social/@ayoubabedrabbo/114114311682366314) for the suggestion) 42- [ ] ~Search suggestions~ (as far as I can tell this essentially impossible to do natively with either firefox or chrome; please correct me if I'm wrong though. In this case I would very much love to be wrong) 43 44and then some more really ambitious stuff like: 45 46> [!NOTE] 47> Umm yeah, I know I might not get to all of that and yes this is essentially me finally discovering PWAs and wanting to smash everything into one lol. 48 49- [ ] Omptimistic UI chat wrapper (basically [t3.chat](https://t3.chat) but entirely on your own machine and completely free and unlimited and oss) 50- [ ] Meta search engine as the default bang (so you can search Google, Bing, Yahoo, etc. all at once) this one is inspired by [mat-1/metasearch2](https://github.com/mat-1/metasearch2) but without the middleman server. 51 52## Fancy smancy technical graphs 😮 53 54The total size of the app is `717.4 KB` (one time download) 55 56### Resource Breakdown 57 58```mermaid 59graph TD 60 subgraph Resources by Size 61 A[index-B8HLUc3J.js<br/>contains all the ddg bangs<br/>482.5 KB] 62 B[Font File<br/>25.1 KB] 63 subgraph Audio Files 64 C[Audio Files<br/>198.5 KB Total] 65 end 66 subgraph Small Assets 67 D[SVGs & CSS<br/>~11 KB] 68 end 69 end 70``` 71 72### Network Performance 73 74```mermaid 75gantt 76 title Network Waterfall Chart 77 dateFormat HH:mm:ss.SSS 78 axisFormat %L 79 80 section Initial HTML 81 GET / (2.8 KB) :done, h1, 10:07:29.038, 208ms 82 83 section JavaScript 84 beacon.min.js :done, b1, 10:07:29.279, 0ms 85 index-B8HLUc3J.js (482.5 KB) :done, j1, 10:07:29.286, 32ms 86 registerSW.js (2.2 KB) :done, j2, 10:07:29.287, 60ms 87 beacon.min.js (2nd) :done, b2, 10:07:29.383, 0ms 88 89 section Styles 90 Main CSS (3.8 KB) :done, c2, 10:07:29.287, 60ms 91 Font File (25.1 KB) :done, f1, 10:07:29.379, 46ms 92 93 section Assets 94 gear.svg (2.5 KB) :done, s1, 10:07:29.494, 58ms 95 clipboard.svg (2.4 KB) :done, s2, 10:07:29.495, 63ms 96 search.svg (2.4 KB) :done, s3, 10:07:29.589, 32ms 97 98 section Audio 99 heavier-tick-sprite.mp3 (22.4 KB) :done, a1, 10:07:29.495, 33ms 100 toggle-off.mp3 (34.3 KB) :done, a2, 10:07:29.495, 32ms 101 toggle-on.mp3 (34.3 KB) :done, a3, 10:07:29.496, 46ms 102 click.mp3 (34.3 KB) :done, a4, 10:07:29.497, 35ms 103 double.mp3 (34.3 KB) :done, a5, 10:07:29.498, 44ms 104 foot-switch.mp3 (34.3 KB):done, a6, 10:07:29.498, 38ms 105``` 106 107 108## Screenshots 109 110<details> 111 <summary>Spoiler Alert: There is both a light and a dark mode 🤯</summary> 112 113### Light Mode 114 115![Light Mode](.github/images/light.webp) 116![Light Mode with Search History](.github/images/light-history.webp) 117![Light Mode 404](.github/images/light-404.webp) 118 119### Dark Mode 💪 120 121![Dark Mode](.github/images/dark.webp) 122![Dark Mode with Search History](.github/images/dark-history.webp) 123![Dark Mode 404](.github/images/dark-404.webp) 124 125</details> 126 127<p align="center"> 128 <img src="https://raw.githubusercontent.com/taciturnaxolotl/carriage/main/.github/images/line-break.svg" /> 129</p> 130 131<p align="center"> 132 <i><code>&copy 2025-present <a href="https://github.com/taciturnaxolotl">Kieran Klukas</a> forked from <a href="https://github.com/t3dotgg/unduck">t3dotgg/unduck</a></code></i> 133</p> 134 135<p align="center"> 136 <a href="https://github.com/taciturnaxolotl/unduckified/blob/main/LICENSE.md"><img src="https://img.shields.io/static/v1.svg?style=for-the-badge&label=License&message=MIT&logoColor=d9e0ee&colorA=363a4f&colorB=b7bdf8"/></a> 137</p>