The archive · Developer & Business Tools · Product decision · 2026
Kage 2026: freeze any website into an offline, JavaScript-free mirror
Duc-Tam Nguyen's Go CLI renders pages in headless Chrome, strips all JavaScript, then packs the site as a ZIM file or single binary; Show HN: 712 points.
Kage
What the business is
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.
How it started
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'.
What happened
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.
How it ended up
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.
Background
kage (影, 'shadow') is a Go command-line tool by Duc-Tam Nguyen that mirrors a whole website into a folder of static .html files with every script removed. Each page goes through real headless Chrome, waits for the page to settle, and snapshots the DOM a human would have seen; then kage strips all script tags, event handlers, and javascript: URLs, downloads CSS, images, and fonts, and rewrites them to relative local paths so the saved page runs no code and makes no network calls.
The bet was that people want to keep whole sites rather than single pages. kage crawls via robots.txt and sitemap.xml with resume and refresh support, then packs a mirror 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 an optional --app desktop build. Distribution covers GitHub releases, Homebrew, Scoop, apt, dnf, and a Chrome-bundled container image.
Nguyen posted kage as a Show HN on 2026-06-14; the item drew 712 points and 141 comments that compared it with SingleFile, wget --mirror, and HTTrack, and the author answered questions about whole-site versus single-page saving in real time. Gigazine's English site covered it on 2026-07-25, demonstrating cloning gigazine.biz in Docker, packing a ZIM, and producing a 24.4 MiB Windows viewer binary. As of 2026-09-02 kage remains an independent MIT-licensed project with no company or funding.
What has to be true
- 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.
What can be applied
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.
Aftermath
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.
Sources
- tamnd/kage: Shadow any website for offline viewing, with the JavaScript stripped out
- Show HN: Kage - Shadow any website to a single binary for offline viewing
- 'kage' removes JavaScript from web pages, saves the entire site locally, and allows you to view it offline
- About - Duc-Tam Nguyen
spotted an error? The archive wants to know.
Your turn
You just read one. Describe what you are building, and see who is betting on the same thing.
Free account · 3 free questions · no card