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](https://raw.githubusercontent.com/taciturnaxolotl/unduckified/main/.github/images/both.webp) 4 5> 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. 6 7## Quick Start 8 9Add this URL as a custom search engine to your browser to use DuckDuckGo's bangs, but faster: 10``` 11https://s.dunkirk.sh?q=%s 12``` 13 14## How is it that much faster? 15 16DuckDuckGo does their redirects server side. Their DNS is...not always great. Result is that it often takes ages. 17 18I solved this by doing all of the work client side. Once you've went to https://s.dunkirk.sh once, the JS is all cached and will never need to be downloaded again. Your device does the redirects, not me or any other server. 19 20## How is this different from Theo's version again? 21 22This is primarily my personal fork to experiment with PWAs but I do have a few ideas that I would love to add to this. 23 24<img align="right" width="140" height="140" src="https://raw.githubusercontent.com/taciturnaxolotl/unduckified/main/public/goose.gif" alt="goose walking animation"/> 25 26- [x] Bangs 27- [x] Dark Mode 28- [x] Settings (for things like disabling search history and changing default bang) 29- [x] Search counter 30- [x] [OpenSearch](https://developer.mozilla.org/en-US/docs/Web/XML/Guides/OpenSearch) support 31- [x] Search History (clearable, all local, and disabled by default ofc) 32- [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) 33- [x] Cute little text animations 34- [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) 35- [x] Hashmapped bangs for faster searching 36- [x] local font file to avoid google fonts 37- [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) 38- [x] Suffix bangs (e.g. `ghr! taciturnaxolotl/unduckified` will take you to this github repo) 39- [x] Quick settings (e.g. `!settings` or `!` will take you to the settings page) 40- [x] Custom local bangs! (thanks to [@ayoubabedrabbo@mastodon.social](https://mastodon.social/@ayoubabedrabbo/114114311682366314) for the suggestion) 41- [x] Weekly bang checks to ensure that all bangs still work and excludes those that don't 42 43I would love to add: 44- [ ] ~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) 45 46and then some more really ambitious stuff like: 47 48- [ ] Optimistic UI chat wrapper (basically [t3.chat](https://t3.chat) but entirely on your own machine and completely free and unlimited and oss) 49- [ ] 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. 50 51> 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. 52 53## Fancy smancy technical graphs 😮 54 55The total size of the app is `717.4 KB` (one time download) 56 57### Resource Breakdown 58 59```mermaid 60graph TD 61 subgraph Resources by Size 62 A[index-B8HLUc3J.js<br/>contains all the ddg bangs<br/>482.5 KB] 63 B[Font File<br/>25.1 KB] 64 subgraph Audio Files 65 C[Audio Files<br/>198.5 KB Total] 66 end 67 subgraph Small Assets 68 D[SVGs & CSS<br/>~11 KB] 69 end 70 end 71``` 72 73### Network Performance 74 75```mermaid 76gantt 77 title Network Waterfall Chart 78 dateFormat HH:mm:ss.SSS 79 axisFormat %L 80 81 section Initial HTML 82 GET / (2.8 KB) :done, h1, 10:07:29.038, 208ms 83 84 section JavaScript 85 beacon.min.js :done, b1, 10:07:29.279, 0ms 86 index-B8HLUc3J.js (482.5 KB) :done, j1, 10:07:29.286, 32ms 87 registerSW.js (2.2 KB) :done, j2, 10:07:29.287, 60ms 88 beacon.min.js (2nd) :done, b2, 10:07:29.383, 0ms 89 90 section Styles 91 Main CSS (3.8 KB) :done, c2, 10:07:29.287, 60ms 92 Font File (25.1 KB) :done, f1, 10:07:29.379, 46ms 93 94 section Assets 95 gear.svg (2.5 KB) :done, s1, 10:07:29.494, 58ms 96 clipboard.svg (2.4 KB) :done, s2, 10:07:29.495, 63ms 97 search.svg (2.4 KB) :done, s3, 10:07:29.589, 32ms 98 99 section Audio 100 heavier-tick-sprite.mp3 (22.4 KB) :done, a1, 10:07:29.495, 33ms 101 toggle-off.mp3 (34.3 KB) :done, a2, 10:07:29.495, 32ms 102 toggle-on.mp3 (34.3 KB) :done, a3, 10:07:29.496, 46ms 103 click.mp3 (34.3 KB) :done, a4, 10:07:29.497, 35ms 104 double.mp3 (34.3 KB) :done, a5, 10:07:29.498, 44ms 105 foot-switch.mp3 (34.3 KB):done, a6, 10:07:29.498, 38ms 106``` 107 108 109## Screenshots 110 111<details> 112 <summary>Spoiler Alert: There is both a light and a dark mode 🤯</summary> 113 114### Light Mode 115 116![Light Mode](https://raw.githubusercontent.com/taciturnaxolotl/unduckified/main/.github/images/light.webp) 117![Light Mode with Search History](https://raw.githubusercontent.com/taciturnaxolotl/unduckified/main/.github/images/light-history.webp) 118![Light Mode 404](https://raw.githubusercontent.com/taciturnaxolotl/unduckified/main/.github/images/light-404.webp) 119 120### Dark Mode 💪 121 122![Dark Mode](https://raw.githubusercontent.com/taciturnaxolotl/unduckified/main/.github/images/dark.webp) 123![Dark Mode with Search History](https://raw.githubusercontent.com/taciturnaxolotl/unduckified/main/.github/images/dark-history.webp) 124![Dark Mode 404](https://raw.githubusercontent.com/taciturnaxolotl/unduckified/main/.github/images/dark-404.webp) 125 126</details> 127 128<p align="center"> 129 <img src="https://raw.githubusercontent.com/taciturnaxolotl/carriage/main/.github/images/line-break.svg" /> 130</p> 131 132<p align="center"> 133 <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> 134</p> 135 136<p align="center"> 137 <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> 138</p>