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] Kagi bangs! We are able to grab the bangs from [kagisearch/bangs](https://github.com/kagisearch/bangs/) and Kagi is far more responsive than DuckDuckGo when it comes to updating their bangs. 42 43I would love to add these but they don't seem possible / feasible at the moment: 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- [x] ~Weekly bang checks to ensure that all bangs still work and excludes those that don't~ this ended up being unreliable because of cloudflare rate limiting and switching to kagi bangs helped a lot with this 46 47## Fancy smancy technical graphs 😮 48 49The total size of the app is `717.4 KB` (one time download) 50 51### Resource Breakdown 52 53```mermaid 54graph TD 55 subgraph Resources by Size 56 A[index-B8HLUc3J.js<br/>contains all the ddg bangs<br/>482.5 KB] 57 B[Font File<br/>25.1 KB] 58 subgraph Audio Files 59 C[Audio Files<br/>198.5 KB Total] 60 end 61 subgraph Small Assets 62 D[SVGs & CSS<br/>~11 KB] 63 end 64 end 65``` 66 67### Network Performance 68 69```mermaid 70gantt 71 title Network Waterfall Chart 72 dateFormat HH:mm:ss.SSS 73 axisFormat %L 74 75 section Initial HTML 76 GET / (2.8 KB) :done, h1, 10:07:29.038, 208ms 77 78 section JavaScript 79 beacon.min.js :done, b1, 10:07:29.279, 0ms 80 index-B8HLUc3J.js (482.5 KB) :done, j1, 10:07:29.286, 32ms 81 registerSW.js (2.2 KB) :done, j2, 10:07:29.287, 60ms 82 beacon.min.js (2nd) :done, b2, 10:07:29.383, 0ms 83 84 section Styles 85 Main CSS (3.8 KB) :done, c2, 10:07:29.287, 60ms 86 Font File (25.1 KB) :done, f1, 10:07:29.379, 46ms 87 88 section Assets 89 gear.svg (2.5 KB) :done, s1, 10:07:29.494, 58ms 90 clipboard.svg (2.4 KB) :done, s2, 10:07:29.495, 63ms 91 search.svg (2.4 KB) :done, s3, 10:07:29.589, 32ms 92 93 section Audio 94 heavier-tick-sprite.mp3 (22.4 KB) :done, a1, 10:07:29.495, 33ms 95 toggle-off.mp3 (34.3 KB) :done, a2, 10:07:29.495, 32ms 96 toggle-on.mp3 (34.3 KB) :done, a3, 10:07:29.496, 46ms 97 click.mp3 (34.3 KB) :done, a4, 10:07:29.497, 35ms 98 double.mp3 (34.3 KB) :done, a5, 10:07:29.498, 44ms 99 foot-switch.mp3 (34.3 KB):done, a6, 10:07:29.498, 38ms 100``` 101 102 103## Screenshots 104 105<details> 106 <summary>Spoiler Alert: There is both a light and a dark mode 🤯</summary> 107 108### Light Mode 109 110![Light Mode](https://raw.githubusercontent.com/taciturnaxolotl/unduckified/main/.github/images/light.webp) 111![Light Mode with Search History](https://raw.githubusercontent.com/taciturnaxolotl/unduckified/main/.github/images/light-history.webp) 112![Light Mode 404](https://raw.githubusercontent.com/taciturnaxolotl/unduckified/main/.github/images/light-404.webp) 113 114### Dark Mode 💪 115 116![Dark Mode](https://raw.githubusercontent.com/taciturnaxolotl/unduckified/main/.github/images/dark.webp) 117![Dark Mode with Search History](https://raw.githubusercontent.com/taciturnaxolotl/unduckified/main/.github/images/dark-history.webp) 118![Dark Mode 404](https://raw.githubusercontent.com/taciturnaxolotl/unduckified/main/.github/images/dark-404.webp) 119 120</details> 121 122<p align="center"> 123 <img src="https://raw.githubusercontent.com/taciturnaxolotl/carriage/main/.github/images/line-break.svg" /> 124</p> 125 126<p align="center"> 127 <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> 128</p> 129 130<p align="center"> 131 <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> 132</p>