把整个网站装进一个文件带走?这个370星的开源工具做到了
一个疯狂的想法:把网站变成”影子”
你有没有想过,把一整个网站——比如 Paul Graham 的全部文章、Snowflake 的海量技术文档——装进一个文件里,然后带着它到没有网络的地方安静阅读?

Kage 做到了。这个诞生于 2026 年 6 月的开源工具,名字取自日文「影」(かげ),意为”影子”。它的核心理念很诗意也很暴力:\1——最后输出一份干净、离线、零脚本的 HTML 文件夹,甚至可以打包成一个可执行二进制文件。
项目在 Hacker News 上一经发布便冲上榜首,斩获 \1和 \1,成为当日最受关注的 Show HN 项目。GitHub 仓库地址:[github.com/tamnd/kage](https://github.com/tamnd/kage)。
“Save As”保存的不是网页,是一个反向代理
很多人会问:浏览器自带的”另存为”不行吗?答案很残酷——\1。现代网站依赖 JavaScript 动态渲染内容,`Ctrl+S` 保存下来的往往是一个空白壳,打开后要么一片白屏,要么疯狂发网络请求。它保存的不是网页,是某个人的 JavaScript 分发客户端。
Kage 走了一条完全不同的技术路线:
种子 URL → 无头 Chrome 渲染 → DOM 快照 → 剥离 JS → 本地化资源 → 写入磁盘这条流水线的核心是一个礼貌的广度优先爬虫。它会自动读取 `robots.txt` 和 `sitemap.xml`,默认只爬取同一域名下的页面,中断后可以断点续传。每一个页面都经过真实的 Chrome 渲染——那些懒加载的图片、异步填充的数据、JavaScript 拼接的 DOM 结构——全部在”影子”中凝固为静态 HTML。
Kage renders every page in headless Chrome, snapshots the final DOM, removes every script and event handler, and downloads and rewrites the CSS, images, and fonts. The result looks like the live site but runs no code.
三行命令,从在线到离线
Kage 的使用门槛极低。以抓取 Paul Graham 的博客为例,只需三个步骤:
# 1. 克隆整个站点
kage clone paulgraham.com
# 2. 本地预览
kage serve $HOME/data/kage/paulgraham.com
# 浏览器打开 http://127.0.0.1:8800
# 3. 打包成独立可执行文件
kage pack paulgraham.com --format binary -o paulgraham
./paulgraham # 启动后自动提供离线浏览服务最后的 `./paulgraham` 是一个自包含的二进制文件——它把自己变成了一个 Web 服务器,打开浏览器就能看。不需要安装任何依赖,不需要联网,甚至不需要 Kiwix。作者 tamnd 在 HN 评论区解释了这个设计动机:
“Actually, Kage has two parts: a crawler that crawls pages and converts them to clean HTML by capturing the DOM after rendering in Chrome/Chromium, and a pack/serve component that packages the result as either a ZIM file for Kiwix or an executable file.”
不只是单个文件:ZIM 格式的生态野心
除了可执行二进制,Kage 还支持打包为 \1——一种开放、压缩、索引化的离线内容格式,由 Kiwix 生态广泛支持。同一个 ZIM 文件可以在 Windows 桌面端、Android 手机、iPhone 上无缝打开。作者选择 ZIM 而非自己造轮子,体现了对开放标准的尊重:
“I chose ZIM format because Kiwix already has desktop apps, Android apps, iPhone apps. The executable option is for users who don’t have Kiwix installed or just want to run the archive directly.”
这种设计哲学让 Kage 的输出产物具有长期可读性——今天生成的 ZIM 文件,十年后的任何 ZIM 阅读器仍然能打开。配合 Kiwix 的全文搜索功能(虽然目前 Kage 本身暂未实现),它几乎是完美的个人知识归档方案。
那些让人眼前一亮的细节
Kage 之所以在 HN 上引发 \1的热烈讨论,很大程度上来自它的工程细节:
\1。你可以限制最大页面数(`–max-pages 50`)、爬取深度(`–max-depth 2`)或路径前缀(`–scope-prefix /doc`),甚至可以爬取子域名(`–subdomains`)。抓取 Snowflake 上万页的文档?没问题。只想抓某个子目录的教程?也完全支持。
\1。`–scroll` 参数会让浏览器自动滚动页面,触发那些只在你往下划时才加载的图片和内容。这个细节对现代图片密集型网站至关重要。
\1。同一个镜像多次打包,生成的 ZIM 文件字节级一致。UUID 也由内容哈希派生,便于校验和去重。
\1。内置 Dockerfile,一行命令就能拉起含 Chromium 的完整环境:`docker run –rm -v “$PWD/out:/out” ghcr.io/tamnd/kage clone paulgraham.com`。
“I maintain a collection of opinionated single-purpose binaries in $HOME/bin/, like delete-all-npm, clean-rust-cache, get-markdown
. My coding agent can sometimes discover and call them.”
这段话透露出作者的一个编程哲学:工具就该是单一用途的小二进制文件。Kage 本身正是这种哲学的最佳实践——\1。
谁需要 Kage?
\1。飞机上、地铁里、偏远地区的网络盲区,Kage 让你提前把资料”预载”好。作者在评论中分享了一个有趣的回忆:
“20 years ago I used HTTrack on a 128MB USB stick to download websites and manga at an internet café.”
从 128MB U 盘上的 HTTrack 到今天的 Kage,离线保存网站的需求从未消失,只是工具在进化。
\1。Snowflake、Kubernetes、React 等大型项目的文档动辄数万页。Kage 可以一键抓取并打包,方便内网分发或历史版本归档。
\1。有 HN 用户提出,用 AI 工具生成的网页原型可以借助 Kage 做快照存档,实现轻量级的版本追溯。
\1。互联网上的内容消失得比想象中快。Kage 提供了一种简单的”快照”机制,把任意公开网页凝固在某个时间点。
局限与未来
Kage 目前只支持公开网站,暂不支持带 Cookie 的认证页面访问。作者表示后续会加入 Cookie 传递功能。此外,ZIM 包的 zstd 压缩支持也在开发计划中。作为一个 v0.1.1 版本的项目,它已经展现出了令人惊讶的完成度。
一个值得关注的信号
Kage 在 HN 上的火爆不是偶然。它踩中了几个技术趋势的交汇点:\1(我的数据该由我掌控)、\1(不是所有场景都有 5G)、以及 \1。更重要的是,它以一种简洁优雅的方式解决了一个存在了二十年的老问题——如何真正地”保存”一个网页。
项目许可证为 MIT,全部代码以 Go 编写(95.6%),辅以少量 Python 脚本。如果你对这个能把网站变成”影子”的工具感兴趣,不妨去 GitHub 给它一颗星:[github.com/tamnd/kage](https://github.com/tamnd/kage)。
正如项目 README 中那句意味深长的话:
“The page was never really yours. It was a thin client for someone else’s JavaScript.”
而 Kage 说:现在它是你的了。
— END —
LC 智趣厅 · 科技与生活的交点
ihygg.cn
