GitHub Repos beginner 3 min read Jun 17, 2026
Public Preview Sign in free for the full digest →

kage: Chrome renders it, then kage strips the JavaScript out

“wget can't archive JavaScript-rendered pages. kage renders them in real Chrome first — and a 693-point Show HN says you've been waiting for this fix for years.”

kage: Chrome renders it, then kage strips the JavaScript out
1 Views
0 Likes
0 Bookmarks
Source · github.com

“"You hit 'Save As' on a page you want to keep, and six months later you open it to find a blank screen" — tamnd (kage README, https://github.com/tamnd/kage)”

You know that feeling when you save a documentation page before a long flight, open it at 30,000 feet, and get a blank white screen? Modern sites build their content with JavaScript at runtime — the server sends an empty HTML shell and the real content only appears after JavaScript executes and calls external APIs. wget downloads the empty shell. HTTrack downloads the empty shell. Browser 'Save As' downloads the empty shell plus a folder of files that still reference external servers you cannot reach. The page looks right on screen but is structurally broken the moment your internet connection drops.

gocliweb-archivingofflineheadless-chromezimopen-source

kage runs Chrome in headless mode (no visible window) and opens the target page exactly as your browser would — JavaScript executes, content loads, images appear. Once the page finishes rendering, kage grabs the final HTML (the DOM after JavaScript finished building it), then removes every script tag and event handler from that HTML. It rewrites all links and asset references to point to local copies it downloads alongside the page, marks crawl state in _kage/state.json so interrupted jobs resume cleanly, then moves to the next page. The finished site tree packs into a .zim archive (readable on any platform via Kiwix) or a Go binary that includes its own web server.

01
Headless Chrome rendering — you can archive JavaScript-built documentation, wikis, and single-page apps that wget and HTTrack miss entirely because they only fetch server-side HTML
02
Four output formats — static HTML folder for any web server, .zim archive for Kiwix readers (Android, iOS, desktop), self-contained binary with bundled viewer (~13 MiB overhead), or native macOS .app / Linux AppImage
03
Resumable crawls — kage writes state to _kage/state.json after each page, so an interrupted job picks up exactly where it stopped instead of restarting from zero
04
Crawl scope controls — --max-pages, --max-depth, --scope-prefix /docs, and --subdomains flags let you mirror one section of a large site rather than triggering an uncontrolled crawl of thousands of pages
05
ZIM archive compatibility — output is Kiwix-compatible, so your archived site opens on Android, iOS, Windows, macOS, and Linux via an actively maintained reader that already exists
06
Docker image with bundled Chromium — no Chrome installation required on the host; ghcr.io/tamnd/kage handles everything inside the container
Who it’s for

If you regularly save documentation, wikis, or long-form technical articles for offline reading and keep hitting blank pages, kage solves your exact problem. It also fits developers building a pipeline to snapshot sites before they disappear — the resumable crawl and ZIM output make it scriptable. Not useful yet if your target sites require login cookies (cookie handling is open issue #9 as of 2026-06-17), if you need full-text search within the archive, or if the sites you want to archive depend on JavaScript for navigation.

Worth exploring

Worth a 30-minute experiment if you have ever been burned by blank offline saves of JS-heavy documentation — the Docker one-liner works and gets you a browsable mirror quickly. Hold off on production pipelines: at v0.3.3, open issues include UTF-8/HTML5 failures (#16), Homebrew tap 404 (#21), and Downloads folder pollution (#32), and the project is 3 days old as of 2026-06-17. The 693-point HN response confirms the problem is real and the approach is architecturally sound; stability is not there yet.

Developer playbook
Tech stack, code snippet, sentiment, alternatives.
PM playbook
Adoption angles, user fit, positioning.
CEO playbook
Traction signals, ROI, build vs buy.
Deep-dive insight
Full long-form analysis, no fluff.
Easy mode
Core idea, fast — when you need the gist.
Pro mode
Technical nuance, edge cases, tradeoffs.
Read the full digest
Go beyond the preview

Deep-dive insight, Easy and Pro modes, plus action playbooks — the full breakdown is one tap away.

Underrated tools. Unfiltered takes.

Read the full digest in the Snaplyze app for deep-dive insight, Easy and Pro modes, and the playbooks you can actually use.

Install Snaplyze →