Kage: the executable website archive replaces wget --mirror

5 min read 1 source clear_take
├── "The breakthrough is shipping an archive that IS a server, not just files"
│  ├── top10.dev editorial (top10.dev) → read below

The editorial argues Kage's novelty isn't the crawler or embed.FS — both are well-trodden — but the artifact itself: a single OS-native binary that is simultaneously archive and HTTP server. This reframes web archiving as program distribution rather than file distribution, sidestepping decades of replay-tool friction.

│  └── tamnd (GitHub) → read

The project's one-line pitch — 'shadow any website to a single binary' — frames the tool around the artifact rather than the crawl. By using Go's embed.FS plus a built-in HTTP server, tamnd treats the output as an executable program you run, not a folder you open.

├── "Client-side routing has made file-based archives obsolete for modern apps"
│  └── top10.dev editorial (top10.dev) → read below

The editorial argues that React/Vue SPAs treat the application as a runtime, not a document tree, so opening a wget mirror from file:// breaks the moment the router resolves a virtual path. A tiny embedded server — not more disk space or a smarter crawler — is what's actually required to replay the modern web.

└── "Kage's traction reflects real demand — prior art like HTTrack and ArchiveBox doesn't solve this"
  └── @Hacker News community (Hacker News, 510 pts) → view

510 points and 106 comments on a Show HN signals the developer community sees a genuine gap that 25+ years of file-based mirroring tools (HTTrack, wget --mirror, ArchiveBox, Conifer, SingleFile) haven't filled. The vote count suggests engineers recognize the single-binary form factor as meaningfully different, not just another crawler.

What happened

Kage, a Go tool from tamnd on GitHub, crossed 510 points on Hacker News with a one-line pitch: shadow any website to a single binary for offline viewing. The mechanism is unsentimental. You point it at a URL, it crawls, it writes every byte — HTML, CSS, JavaScript bundles, fonts, images — into a Go source tree via `embed.FS`, and `go build` produces a single executable. Run the binary, it opens a local HTTP server, and the site is back. No nginx, no docker compose, no static-site renderer. One file, one process, one origin you control.

The project is intentionally small. The README fits on a screen. The novelty isn't in the crawler — every language has a dozen — and it isn't really in `embed.FS` either, which has been in the standard library since Go 1.16. The novelty is the artifact: an archive that is also a server, shippable as one OS-native binary, runnable on any machine that can execute it.

For context, the prior art is older than most engineers reading this. HTTrack shipped in 1998. `wget --mirror` predates the modern web. ArchiveBox and Conifer (formerly WebRecorder) handle the WARC standard. SingleFile collapses a page into one HTML document. All of them produce *files*. The user is responsible for opening them, sometimes with a special replay tool. Kage produces a *program*.

Why it matters

File-based archives have a fault line that has gotten worse over the last decade: client-side routing. Open a wget mirror of a React or Vue app from `file://` and the router blows up the first time it tries to resolve a route that doesn't map to an actual file path. The application is a runtime, not a tree of documents. To replay it you don't need disk; you need a server, and a tiny one is enough.

That reframing changes who the tool is for. The HN comments are full of the usual offline-reading use cases — flight mode, expedition laptops, kids on a tablet without WiFi — but those have been served, badly, for twenty years. The more interesting buyers are the ones with compliance reasons to freeze a surface.

Vendoring a docs site is one. If your platform depends on a third-party API whose docs are the source of truth for what `429` actually means this quarter, a binary called `stripe-docs-2026-06.bin` in your repo gives you something `git log` can hold accountable. Link rot is another: studies of academic citations put the half-life of a cited URL somewhere between four and seven years, and a tutorial that was canonical when your codebase was written is one TLD expiry away from being a 404 for the next engineer to inherit your service. A binary in `vendor/` doesn't 404.

Air-gapped environments are the third category and probably the most underserved. Defense and finance teams routinely need reference material on networks that cannot reach the public internet. The current state of the art is either printing PDFs or paying a vendor for a sneakernet appliance. An executable site snapshot is a credible delivery format for any environment where 'install a web server, configure it, serve these files' is three conversations with security longer than 'run this binary'.

The community reception reflects this. The top comments aren't quibbling about Go vs Rust or the size of the resulting binary. They're listing use cases the original author probably didn't have in mind: shipping internal wikis as quarterly snapshots, packaging Storybook docs to send to a client without giving them repo access, freezing a tutorial mid-course so a workshop isn't held hostage by the conference WiFi. The conversation suggests a latent demand the existing archival tools never quite met.

What Kage does not solve is also worth naming. Anything the page fetches at runtime — XHRs to a live API, third-party analytics, embedded iframes from a different origin — is gone the moment the binary leaves the network. The crawl freezes the surface. It does not freeze the substrate. A Notion-style app where 90% of the content arrives via API call after page load will produce a hauntingly empty Kage binary. Server-rendered docs, marketing sites, blog posts, generated reference material — those replay cleanly. Anything closer to an application than a document does not.

What this means for your stack

The practical move is to stop treating offline copies as something users do and start treating them as something you ship. If your product has documentation, a Kage build of it is a release artifact you can attach to a GitHub release the same way you attach a tarball. Customers who want to read your docs on a plane don't need your CDN to be up. Customers running your tool inside a classified environment don't need to negotiate a docs-site exception with their security team.

For internal use, the pattern is even simpler. Pick the three external sites your team consults during incidents — the cloud provider's status methodology page, the upstream library's troubleshooting guide, the framework's migration doc — and bake a Kage snapshot into your runbook repo. The next time the provider's docs site is the thing that's down, you have a working copy. Treat external docs you depend on the same way you treat dependencies: pin them, vendor them, and only upgrade on a schedule you control.

There is also a quieter implication for the single-binary movement Go has been driving for a decade. `embed.FS` was sold as a way to stop shipping CLIs with adjacent template files. Kage is what happens when you take that primitive seriously and apply it past its original scope. Expect more: a CMS preview shipped as a binary, a documentation generator that emits servers instead of sites, a marketing-page-as-executable for the trade-show laptop that can't be trusted to have internet.

Looking ahead

The open question is whether executable site snapshots become a recognized archival format alongside WARC and MHTML, or remain a clever utility that solves a narrow pain. The signal to watch is enterprise adoption: if compliance and security teams start accepting a signed binary as a valid form of vendored documentation, the category exists. If it stays a hobbyist tool for plane-mode reading, it joins HTTrack on the long list of useful things nobody puts in a procurement doc. Either way, the artifact is the interesting part. A website you can hand someone, in one file, without a server to administer, is a deliverable the web has been missing for a long time.

Hacker News 670 pts 130 comments

Show HN: Kage – Shadow any website to a single binary for offline viewing

→ read on Hacker News

// share this

// get daily digest

Top 10 dev stories every morning at 8am UTC. AI-curated. Retro terminal HTML email.