kage (影, 'shadow') is an open-source (MIT), pure-Go command-line tool that clones an entire website into a plain folder of .html files with every script removed. It drives headless Chrome per page, waits for the page to settle, snapshots the rendered DOM, deletes all script tags, event handlers, and javascript: URLs, and downloads CSS, images, and fonts rewritten to relative local paths. Commands cover clone, serve, pack, and open; a mirror can be collapsed into a ZIM archive (the open format behind Kiwix) or into a self-contained binary of about 13 MiB plus content that serves the site offline with nothing installed, with an optional --app desktop build and a webview build that opens in a native window. It ships as a ghcr container with Chromium bundled, plus Homebrew, Scoop, apt, and dnf packages.

Users want whole sites, not single pages: render with headless Chrome, snapshot the DOM a human sees, strip every script, and keep the result browsable offline.

Duc-Tam Nguyen (tamnd) built kage out of the familiar failure of 'Save As': months later a saved page opens blank, shows an endless spinner, or still phones home to a dead analytics server. He described the page as never really yours - a thin client for someone else's JavaScript - and released the tool as a Show HN on 2026-06-14 with the tagline 'Shadow any website to a single binary for offline viewing'.

The thread took off with 712 points and 141 comments. Commenters compared kage to SingleFile and asked how it differed from Save As; Nguyen clarified that kage mirrors an entire website with all its subpages - his example was all of Paul Graham's essays for offline reading - while SingleFile packs a single page. He also mentioned a larger umbrella ambition: building an open-source 'Google from scratch' with crawler, indexer, storage, and serving layers. Gigazine covered kage in English on 2026-07-25, walking through a Docker clone of gigazine.biz, ZIM packing, and a 24.4 MiB single-binary Windows viewer built from the 0.3.10 release.

As of 2026-09-02 kage remains an independent, MIT-licensed open-source project with no company or funding; the repository documents package-manager installs, a Chrome-bundled container, and a full test suite including Chrome-driven end-to-end tests, and the docs site kage.tamnd.com continues to grow.

Save As produces copies that still phone home or render blank when markup is built by JavaScript at runtime.

SingleFile solved single pages, leaving whole-site mirroring - the actual archive use case - to less faithful tools.

Headless Chrome lets the mirror capture what a human sees before any JavaScript is removed.

Open formats such as ZIM keep the archive readable by other tools (Kiwix) instead of locking users into the project.

A self-contained binary means the recipient needs nothing installed to read the mirror.

Render first, strip second: snapshot what a human sees, then remove the runtime, and a 'Save As' copy becomes a durable artifact anyone can open offline.

As of 2026-09-02 kage remains an independent MIT project with no company or funding. Development is active: the crawler reads robots.txt, seeds from sitemap.xml, resumes interrupted runs, and fetches each URL once; packing is deterministic and mirror-relative paths map into the archive. Release automation ships multi-platform binaries, packages, a Chrome-bundled container, SBOMs, and signatures. The author ties kage to a larger open-source search stack. Known trade-offs: crawling needs Chrome/Chromium, ZIM packs omit Kiwix's full-text index, and a binary adds about 13 MiB before content.

FOLLOW THE EVIDENCE

The sources

  1. tamnd/kage: Shadow any website for offline viewing, with the JavaScript stripped out GitHub · github.com
  2. Show HN: Kage - Shadow any website to a single binary for offline viewing Hacker News · news.ycombinator.com ·
  3. 'kage' removes JavaScript from web pages, saves the entire site locally, and allows you to view it offline Gigazine · gigazine.net ·
  4. About - Duc-Tam Nguyen tamnd.github.io · tamnd.github.io