
Kage: клонируй любой сайт в один бинарник без JS
Kage — open-source инструмент на Go, который клонирует сайты через headless Chrome, вырезает весь JavaScript и упаковывает результат в один исполняемый файл.
Сайт — ваш навсегда: Kage клонирует и замораживает любой ресурс
Разработчик под ником tamnd выложил на GitHub инструмент Kage (影, «тень») — утилиту командной строки на Go, которая открывает каждую страницу сайта в настоящем headless Chrome (браузер без графического интерфейса), ждёт полной отрисовки, делает снимок DOM и вырезает весь JavaScript. Каждая страница проходит через реальный headless Chrome, поэтому контент, собираемый JavaScript, захватывается полностью, а не в виде пустой оболочки. На выходе — статичный сайт без трекеров, без сетевых вызовов, без сюрпризов.
Проблема, которую решает Kage
Стандартная функция браузера «Сохранить страницу» давно устарела. Современные сайты — это thin client (тонкий клиент) для чужого JavaScript: сохранённая страница открывается как пустой экран или бесконечный спиннер, потому что данные всё равно тянутся с удалённого сервера.
Страница никогда по-настоящему не была вашей. Она была тонким клиентом для чужого JavaScript.
После захвата DOM kage удаляет все теги <script>, обработчики событий on* и любые javascript: URL. Сохранённая страница не делает сетевых вызовов и не исполняет никакого кода.
Стили, изображения, шрифты и медиа скачиваются и переписываются на относительные локальные пути, так что офлайн-копия выглядит как оригинал. Внутренние ссылки переписываются так, чтобы можно было кликать по зеркалу точно так же, как по живому сайту.
Как это работает: от клона до бинарника
graph LR
A[kage clone URL] --> B[Headless Chrome\nрендерит страницу]
B --> C[Снимок DOM]
C --> D[Удаление всего JS]
D --> E[Скачивание CSS,\nизображений, шрифтов]
E --> F[Офлайн-зеркало\nна диске]
F --> G1[kage serve\nлокальный HTTP-сервер]
F --> G2[kage pack → .zim\nархив]
F --> G3[kage pack --format binary\nсамодостаточный .exe/.bin]
Быстрый старт
Установка через Go или готовый бинарник:
# Через Go
go install github.com/tamnd/kage/cmd/kage@latest
# Через Docker (Chromium уже внутри)
docker run --rm -v "$PWD/out:/out" ghcr.io/tamnd/kage clone paulgraham.com
Полный цикл — три команды:
# 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 # запускается без зависимостей
--base kage-windows-amd64.exe. Kage прочитает заголовок исполняемого файла и автоматически добавит расширение .exe.Ключевые флаги команды kage clone
| Флаг | По умолчанию | Что делает |
|---|---|---|
-p, --max-pages | 0 (без лимита) | Остановиться после N страниц |
-d, --max-depth | 0 (без лимита) | Глубина обхода по ссылкам |
--scope-prefix | — | Crawl только путей с этим префиксом |
--subdomains | false | Включить поддомены в область охвата |
--scroll | false | Автоскролл для lazy-loaded изображений |
--workers | 4 | Параллельных рендеров одновременно |
--refresh | false | Перерендерить на месте, не удаляя зеркало |
-f, --force | false | Удалить существующее зеркало и начать заново |
robots.txt, берёт начальные URL из sitemap.xml и строго идемпотентен: одна и та же страница, доступная по http и https, с трейлинг-слешем и без, скачивается ровно один раз. Прерванный обход можно возобновить — прогресс сохраняется при Ctrl-C.Два формата хранения: ZIM и бинарник
ZIM-архив — открытый стандарт
ZIM — открытый файловый формат для хранения контента сайтов в офлайн-режиме; формат определён проектом openZIM, который также поддерживает open-source ZIM-ридер Kiwix.
ZIM-архивы можно читать офлайн с помощью приложений вроде Kiwix, которое работает как браузер. Например, можно скачать Wikipedia, хранить её на компьютере и просматривать без интернета.
Kage записывает всё зеркало в ZIM-архив: текст сжимается через zstd, медиа хранится как есть. Файл совместим со всей экосистемой Kiwix — настольным приложением и мобильными версиями для Android и iOS.
Самодостаточный бинарник
Флаг --format binary приклеивает архив к копии kage и отдаёт единственный исполняемый файл, запускающий сайт офлайн. Получателю не нужно устанавливать ни kage, ни ZIM-ридер — вообще ничего.
Упаковка детерминирована: одно и то же зеркало всегда даёт побайтово идентичный файл, UUID архива выводится из содержимого, а не генерируется случайно — это делает пакет безопасным для контрольных сумм и кеширования.
Контекст и значение
Инструменты для офлайн-копирования сайтов существуют давно — wget, HTTrack, PyWebCopy. Но все они работают со статичным HTML и не справляются с современными SPA (Single Page Application — одностраничными приложениями), где контент генерируется JavaScript.
Kage закрывает этот пробел, используя реальный браузерный движок. Проект ориентирован сразу на несколько аудиторий: разработчики хотят зафиксировать документацию, исследователи — заархивировать источники, путешественники — читать без интернета. Это особенно актуально для пользователей с дорогим, нестабильным или ограниченным доступом в интернет.
Проект опубликован на GitHub под открытой лицензией. Документация — на kage.tamnd.com.
kage clone paulgraham.com && kage pack paulgraham.com --format binary -o paulgraham