概要
kage はWebサイトを オフライン用に完全クローン するツール。 JavaScriptを完全に除去 し、 CSSや画像もローカル化。 実際のChromeで描画後のDOMを保存 し、人間が見る状態を再現。 ZIMファイルや自己完結型バイナリ としてパックも可能。 インストールやコマンド、仕組みも簡単 で、長期保存や共有に最適。
kageとは何か
- Webサイトをフォルダに完全クローン し、オフライン閲覧を実現するツール
- 全JavaScriptを除去 し、追跡・ネットワーク通信・動的挙動を排除
- CSS・画像・フォントもローカル化 し、オリジナルの見た目を再現
- 本物のChrome/Chromiumで描画後のDOMをスナップショット、人間が見た状態を保存
- 保存したHTMLは完全静的、ディスクから直接開け、友人への配布や長期保存も容易
- 公式ドキュメント: kage.tamnd.com
インストール方法
- Goでのインストール
go install github.com/tamnd/kage/cmd/kage@latest
- プリビルドバイナリ配布
- アーカイブ、.deb/.rpm/.apk、チェックサムをGitHub Releasesで提供
- Dockerイメージ利用
- Chrome/Chromium同梱、追加インストール不要
- 例:
docker run --rm -v "$PWD/out:/out" ghcr.io/tamnd/kage clone paulgraham.com
- シェル補完機能 も同梱
kage completion bash|zsh|fish|powershell
クイックスタート
- 例: Paul Grahamのエッセイをオフライン化
- サイトのクローン:
kage clone paulgraham.com
- ローカルで閲覧:
kage serve $HOME/data/kage/paulgraham.com- ブラウザで http://127.0.0.1:8800 を開く
- オプション:
- 1ファイル(ZIM)にパック:
kage pack paulgraham.com→paulgraham.com.zimkage open paulgraham.com.zim
- 自己完結型バイナリ 化:
kage pack paulgraham.com --format binary -o paulgraham ./paulgraham- 実行だけで閲覧可能、追加インストール不要
- 1ファイル(ZIM)にパック:
- サイトのクローン:
主なコマンド一覧
| コマンド | 機能概要 |
|---|---|
| kage clone <url> | サイトをヘッドレスChromeで描画・スクリプト除去ミラー作成 |
| kage serve [dir] | クローン済みフォルダをローカルHTTPサーバでプレビュー |
| kage pack <mirror-dir> | ミラーをZIMアーカイブや自己完結型バイナリに圧縮 |
| kage open <file.zim> | パック済みZIMをオフラインで閲覧 |
クローン機能詳細
- 全サイト一括クローン
kage clone https://paulgraham.com
- ページ数・階層を制限
- 例: 50ページ・2階層まで
kage clone paulgraham.com --max-pages 50 --max-depth 2
- 例: 50ページ・2階層まで
- 特定セクションだけ取得
kage clone go.dev --scope-prefix /doc
- サブドメインも含めて取得
kage clone example.com --subdomains --scroll
- 再クローン・差分取得
kage clone paulgraham.com --refresh
- クローン時の特徴
- robots.txtの遵守、sitemap.xmlの利用、幅広いクロール
- idempotent設計で同一ページは一度だけ取得
- 中断時は状態保存、再実行で続きから再開可能
- --forceで一からやり直しも簡単
主なフラグ一覧
-o, --out: 出力先ルートディレクトリ(デフォルト:$HOME/data/kage)-p, --max-pages: 最大ページ数制限-d, --max-depth: 最大リンク深度--scope-prefix: 特定パス配下のみクロール--subdomains: サブドメインも対象に含める--exclude: 除外パス指定(複数指定可)--scroll: 各ページで自動スクロール(遅延画像読込対策)--workers: 並列レンダリング数--no-robots: robots.txt無視-f, --force: 既存ミラー削除して新規作成--chrome: Chrome/Chromiumバイナリのパス指定
サーバ機能
- ローカルHTTPサーバ起動
kage serve $HOME/data/kage/paulgraham.com- 実際のホスト同様にリンク・アセット解決
パック機能(ZIM・自己完結型バイナリ)
- ZIMアーカイブ化
kage pack paulgraham.com→paulgraham.com.zimkage open paulgraham.com.zimで即閲覧- Kiwix互換 で他のZIMリーダーやモバイルアプリでも利用可
- 検索インデックスは未構築のため、検索機能は限定的
- 完全再現性 (同じミラーからは常に同一バイト列で生成)
- 自己完結型バイナリ化
kage pack paulgraham.com --format binary -o paulgraham ./paulgraham- どの環境でも即実行・閲覧可能
- クロスビルド対応
- 例: Mac上でWindows用バイナリ生成
kage pack paulgraham.com --format binary --base kage-windows-amd64.exe
- 例: Mac上でWindows用バイナリ生成
- サイズはkage本体分(約13MiB)+ミラー分
ネイティブウィンドウ表示
- WebViewタグ付きビルドで独立ウィンドウ表示
make build-webviewやCGO_ENABLED=1 go build -tags webview ./cmd/kage- ネイティブアプリのような体験
- デフォルトはブラウザタブ表示(純Goビルド)
動作原理
- 処理フロー
- seed URL → ヘッドレスChrome → DOMスナップショット → JS除去 → アセットローカル化 → ディスク保存
- アーキテクチャ
- Chromeタブのプールでページ描画
- アセット取得は別プールで並列化
- URLはローカルパスに決定論的にマッピング
- 保存構成例:
- index.html, 各エッセイ.html, _kage/配下にアセット・状態ファイル
ソースビルド・構成
- ビルド方法
git clone https://github.com/tamnd/kagecd kagemake build(純Go、ブラウザ表示)make build-webview(WebView対応、cgo必須)make test(Chrome利用のE2E含む)make test-short(ブラウザ起動テスト省略)
- ディレクトリ構成
- cmd/kage/: メイン
- cli/: コマンド・フラグ管理
- clone/: クロール・レンダリング・アセット取得
- browser/: Chrome制御・DOMスナップ
- sanitize/: スクリプト除去
- asset/: アセットローカル化
- urlx/: URL→パス変換
- zim/: ZIMリーダー・ライター
- pack/: パック処理
- viewer/: サイト表示(ブラウザorネイティブ)
- docs/: ドキュメントサイト
リリース・ライセンス
- GitHub Actions+GoReleaserで自動ビルド・配布
- アーカイブ・パッケージ・Dockerイメージ・チェックサム・署名を生成
- Homebrew/Scoop対応はトークン未登録時はスキップ
- MITライセンス
- 詳細はLICENSE参照