Сайт — ваш навсегда: 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  # запускается без зависимостей
💡 Кросс-компиляция
Находясь на Mac, можно собрать бинарник для Windows: достаточно указать --base kage-windows-amd64.exe. Kage прочитает заголовок исполняемого файла и автоматически добавит расширение .exe.

Ключевые флаги команды kage clone

ФлагПо умолчаниюЧто делает
-p, --max-pages0 (без лимита)Остановиться после N страниц
-d, --max-depth0 (без лимита)Глубина обхода по ссылкам
--scope-prefixCrawl только путей с этим префиксом
--subdomainsfalseВключить поддомены в область охвата
--scrollfalseАвтоскролл для lazy-loaded изображений
--workers4Параллельных рендеров одновременно
--refreshfalseПеререндерить на месте, не удаляя зеркало
-f, --forcefalseУдалить существующее зеркало и начать заново
ℹ Умный краулер
Kage читает 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.

⚠ Ограничение поиска
Kage создаёт структурно корректный архив со стандартными метаданными, но не строит индекс полнотекстового поиска, который есть в официальных ZIM-пакетах Kiwix. Навигация и клики работают везде, а встроенный поиск — ограниченно.

Самодостаточный бинарник

Флаг --format binary приклеивает архив к копии kage и отдаёт единственный исполняемый файл, запускающий сайт офлайн. Получателю не нужно устанавливать ни kage, ни ZIM-ридер — вообще ничего.

Упаковка детерминирована: одно и то же зеркало всегда даёт побайтово идентичный файл, UUID архива выводится из содержимого, а не генерируется случайно — это делает пакет безопасным для контрольных сумм и кеширования.


Контекст и значение

Инструменты для офлайн-копирования сайтов существуют давно — wget, HTTrack, PyWebCopy. Но все они работают со статичным HTML и не справляются с современными SPA (Single Page Application — одностраничными приложениями), где контент генерируется JavaScript.

Kage закрывает этот пробел, используя реальный браузерный движок. Проект ориентирован сразу на несколько аудиторий: разработчики хотят зафиксировать документацию, исследователи — заархивировать источники, путешественники — читать без интернета. Это особенно актуально для пользователей с дорогим, нестабильным или ограниченным доступом в интернет.

Проект опубликован на GitHub под открытой лицензией. Документация — на kage.tamnd.com.

📝 Практический кейс
Заархивировать эссе Пола Грэма для чтения в самолёте или через 25 лет после редизайна сайта: kage clone paulgraham.com && kage pack paulgraham.com --format binary -o paulgraham