# DuckFind - The Modern Web in Plain HTML for Vintage Browsers
Date: 2026-07-06
It started with an iBook.
I wanted my Mac OS 9 machine to browse the *modern* web — not a museum snapshot, but today's internet. The first wall you hit is encryption: nearly everything is HTTPS now, and a browser from the TLS-1.0 era can't complete the handshake. The fix for that is a wonderful little tool called **[Crypto Ancienne](https://github.com/classilla/cryanc)** (`carl`) — an HTTPS-over-HTTP proxy that does the modern TLS on behalf of the old browser. I set it up on my homelab, pointed **Classilla 9.3.4b** at it, and suddenly the iBook could *reach* HTTPS sites.
Reach them, but not *read* them. Because the second wall is the web itself. A modern page is megabytes of JavaScript, CSS, web fonts, and lazy-loaded images — a layout engine from 2001 takes one look and falls over. Encryption was only half the problem. The pages themselves are the other half.
So I built **[DuckFind](https://duckfind.com)**.
## The Idea
DuckFind does all the hard work on a server and hands the old browser something it actually understands: clean **HTML 3.2** — no CSS, no scripts, no web fonts. It fetches the real, modern, TLS-only page, strips it down to its bones, and re-serves it as the kind of markup a System 7 Mac, a Windows 3.1 box, or even an Apple II with a text browser can render.
If you know **[FrogFind](https://frogfind.com)** by Action Retro, the concept will be familiar — but DuckFind is my own independent take (none of FrogFind's code), and it does quite a bit more.
## What It Does
- **Search** — DuckDuckGo results, reformatted as plain HTML with pagination.
- **Reader** — point it at any page and it distills the article down to readable HTML with a home-grown Readability-style extractor. Tables keep their borders, multi-page articles get stitched together, and anti-bot "checking your browser" pages are detected and skipped.
- **Inline images** — an image proxy downscales JPEG/PNG/WebP/AVIF and re-encodes to **GIF**, the one format every old browser renders. There are **grayscale** and **dithered black-and-white** modes for 1-bit displays, so a 4000px DSLR photo becomes a 3 KB GIF a compact Mac can show.
- **Wayback mode** — read any page as it existed in a past year, with images and links kept in the same era. Archived pages that were *built* for old browsers render in their original table layout instead of being flattened.
- **AI answers** — type `!ai your question` and get a concise, plain-text answer rendered in HTML 3.2. A large language model, on a 1994 laptop. It still feels like a magic trick.
- **News, weather, a dictionary, plain-text output** for terminal browsers, a site-wide dark mode, and character-set handling for non-English pages — all in markup that works on the oldest machines.
## How It's Built
DuckFind is a single-file-per-page **PHP** app with **zero dependencies** — no Composer, no frameworks, just PHP with the standard `curl`, `dom`, `gd`, and `mbstring` extensions. The browser only ever speaks plain HTTP to DuckFind; DuckFind handles the TLS, the JavaScript-free fetching, the content extraction, the image conversion, and the character-set normalization, then emits minimal HTML.
```
vintage browser ──HTTP/1.0, plain HTML── DuckFind (PHP) ──modern TLS/HTTP2── the web
```
Because it fetches arbitrary user-supplied URLs, it's hardened against [SSRF](https://owasp.org/www-community/attacks/Server_Side_Request_Forgery): it resolves DNS itself, rejects any non-public IP, pins connections to the validated address to defeat DNS rebinding, and re-validates every redirect hop.
## Try It
It's live at **[duckfind.com](https://duckfind.com)**, and the full source is on **[GitHub](https://github.com/d4rkwyng/duckfind)** under the MIT license — self-host it, point your own vintage machine at it, or just poke around the code.
There's something genuinely satisfying about watching an iBook from the Clinton administration load a current news site, cleanly, in a browser that shipped before the iPhone existed. The old hardware was never the problem. The web just forgot how to be simple.
**[duckfind.com](https://duckfind.com)** | **[GitHub](https://github.com/d4rkwyng/duckfind)**