こんな経験はありませんか?
いい記事をブックマークして、数ヶ月後に開いてみると——空白のページ、延々と読み込みスピナーが回り続ける、あるいは存在しなくなった analytics サーバへのリクエストが原因でページ全体が固まる。そのページはそもそもあなたのものではなく、誰かの JavaScript の薄いクライアントにすぎません。
別のシナリオ:ネットワークなしでドキュメントサイトを読む必要がある場合(飛行機の中、野外作業、あるいはあるサーバールームなど)、またはある日突然サイトが消えてしまう前に、その内容を永久に保存しておきたい場合。
今日紹介する kage(日本語で「影」、読みは /ka-ge/)は、まさにそうした問題を解決するために生まれたツールです。
kage とは?
kage は Go で書かれたオープンソースの CLI ツールで、headless Chrome で実際にページをレンダリングし、読み込み完了後の DOM スナップショットを撮り、すべての JavaScript を自動的に削除した上で、CSS、画像、フォントなどの静的リソースをローカルにダウンロードします。最終的に得られるのは、ディスク上で直接開ける .html ファイルの集合です。ネットワーク不要、スクリプト実行も一切ありません。
- ⭐ GitHub Stars: 2600+(2026 年 6 月作成、急成長中)
- 🏷️ 言語: Go
- 📜 ライセンス: MIT
- 🧑💻 作者: tamnd
kage vs 従来の「名前を付けて保存」
| 特徴 | ブラウザの「名前を付けて保存」 | wget / curl | kage |
|---|---|---|---|
| JavaScript レンダリング | ❌ | ❌ | ✅ headless Chrome で完全レンダリング |
| JS 自動除去 | ❌ | ❌ | ✅ 全スクリプトを完全に削除 |
| SPA/動的コンテンツ対応 | ❌ | ❌ | ✅ Vue/React/Angular ページに対応 |
| サイト全体のクローン | ❌ | ⚠️ 制限あり | ✅ リンクを自動追跡、幅優先でクロール |
| 単一ファイルにパッケージング | ❌ | ❌ | ✅ ZIM / 自己完結型の実行ファイル |
| オフラインで利用可能 | ⚠️ 失敗しがち | ⚠️ 失敗しがち | ✅ 完璧なオフライン対応 |
仕組みの概要
URL にアクセス → headless Chrome でレンダリング → ページ安定を待機 → 最終 DOM をスナップ → 全 <script> を削除 → CSS/画像/フォントをダウンロード → ローカルに保存 → リンクを追跡して続行
kage は単に HTML ソースをダウンロードするのではなく、本物のブラウザのようにページをレンダリングします。そのため、最終的に保存されるのはユーザーが実際に目にする完全なページです。
kage のインストール
kage は Linux、macOS、Windows の 3 プラットフォームに対応した複数のインストール方法を提供しています。
方法 1:Go 経由でインストール
Go がインストール済みであれば(Go 1.21+ を推奨):
go install github.com/tamnd/kage/cmd/kage@latest
方法 2:Homebrew(macOS)
brew install --cask tamnd/tap/kage
方法 3:Scoop(Windows)
scoop bucket add tamnd https://github.com/tamnd/scoop-bucket
scoop install kage
方法 4:apt(Ubuntu/Debian)
# リポジトリキーとソースを追加
curl -fsSL https://tamnd.github.io/linux-repo/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/tamnd.gpg
echo "deb [signed-by=/usr/share/keyrings/tamnd.gpg] https://tamnd.github.io/linux-repo/apt stable main" | sudo tee /etc/apt/sources.list.d/tamnd.list
sudo apt update && sudo apt install kage
方法 5:dnf(Fedora/RHEL)
sudo dnf config-manager --add-repo https://tamnd.github.io/linux-repo/dnf/tamnd.repo
sudo dnf install kage
方法 6:Docker(Chrome をインストールする必要なし)
Docker イメージには Chromium が同梱されており、すぐに使えます:
docker run --rm -v "$PWD/out:/out" ghcr.io/tamnd/kage clone paulgraham.com
インストール後の確認
kage --version
kage completion bash # または zsh / fish。タブ補完を有効にする
注意:kage には Chrome または Chromium が必要です。Docker 以外の方法では、ホストマシンに Chrome/Chromium をインストールする必要があります。kage はシステム上のインストールパスを自動的に検索しますが、
--chromeパラメータまたはKAGE_CHROME環境変数で指定することもできます。
クイックスタート:3 分でウェブサイトをクローン
Paul Graham のブログを例に、サイト全体をローカルにクローンしてみましょう:
# 1. サイト全体を $HOME/data/kage/paulgraham.com/ にクローン
kage clone paulgraham.com
# 2. ローカルでプレビュー
kage serve $HOME/data/kage/paulgraham.com
# ブラウザで http://127.0.0.1:8800 を開く
これだけ! すべての記事、すべての画像、すべてのスタイルファイルがあなたのディスク上に凍結され、ネットワークゼロ依存で動作します。
クローン範囲の制限
動作を軽く試したいだけなら、クローンの深さを制限できます:
# 最初の 50 ページのみ、リンクは最大 2 階層まで追跡
kage clone paulgraham.com --max-pages 50 --max-depth 2
# サイトのサブディレクトリのみをクローン
kage clone go.dev --scope-prefix /doc
# 特定のパスをスキップ(広告や無関係なページを除外)
kage clone example.com --exclude /ads --exclude /track
パラメータクイックリファレンス
| パラメータ | デフォルト値 | 説明 |
|---|---|---|
-o, --out |
$HOME/data/kage |
出力ルートディレクトリ |
-p, --max-pages |
0(無制限) |
最大 N ページをクローン |
-d, --max-depth |
0(無制限) |
リンク追跡の深さ |
--scope-prefix |
なし | 指定プレフィックスで始まるパスのみをクローン |
--subdomains |
false |
サブドメインを含める |
--scroll |
false |
ページを自動スクロール(遅延読み込みをトリガー) |
--workers |
4 |
同時レンダリングページ数 |
--no-robots |
false |
robots.txt を無視 |
--refresh |
false |
既存クローンの差分更新 |
高度な機能
1. 自動スクロールで遅延読み込みをトリガー
最近のウェブサイトの多くは画像の遅延読み込み(lazy loading)を採用しており、ページをスクロールしないと画像が読み込まれません。kage は自動スクロールに対応しています:
kage clone example.com --scroll
これにより、kage は各ページを自動的に底部までスクロールし、遅延読み込みされる画像や iframe などのコンテンツが完全にレンダリング・保存されることを保証します。
2. 差分更新(--refresh)
1 ヶ月前にクローンしたブログに新しい記事が追加された?最初からやり直す必要はありません:
kage clone paulgraham.com --refresh
--refresh は既存のページを再レンダリングし、新規コンテンツを抓取します。kage のクローンは冪等です:同じページに http と https のどちらでアクセスしても、保存されるのは 1 回だけです。
3. グレースフルな中断とレジューム
クローン中に Ctrl+C を押しても大丈夫。kage が現在の進行状況を自動的に保存します:
# Ctrl+C で中断。次回実行時に自動的に中断箇所から再開
kage clone paulgraham.com
4. サブドメインを含める
kage clone example.com --subdomains
blog.example.com、docs.example.com などのサブドメインも同時にクローンされます。
パッケージング:フォルダから単一ファイルへ
クローン後のミラーは数千の小ファイルを含むフォルダです。そのままコピーするのは時間がかかります。kage はミラー全体を単一ファイルに圧縮することができます。
オプション 1:ZIM ファイルにパッケージング
ZIM は Kiwix プロジェクトが使用するオープンなオフライン形式で、長期アーカイブ向けに設計されています:
# パッケージング
kage pack paulgraham.com # paulgraham.com.zim を生成
# 閲覧
kage open paulgraham.com.zim # ローカルでプレビュー
# Kiwix でも開ける
kiwix-serve paulgraham.com.zim # HTTP サービス
なぜ ZIM? ZIM はパブリックなオープン標準です。今日 kage で作成した
.zimファイルは、10 年後でも Kiwix のどのリーダでも開けます。zstd 圧縮に対応しており、テキストは高度に圧縮され、画像/メディアはそのまま保存されます。
オプション 2:スタンドアロン実行ファイルにパッケージング
これが kage の最もクールな機能——1 つの実行ファイル = 1 つのウェブサイト全体:
# 自己完結型のバイナリファイルにパッケージング
kage pack paulgraham.com --format binary -o paulgraham
# 直接実行、ゼロ依存
./paulgraham
# 自動的に HTTP サービスを起動。ブラウザでアクセスするだけ
このファイルを受け取った人は何もインストールする必要がありません:kage もブラウザも ZIM リーダも不要です。実行するだけで、ウェブサイト全体のオフライン版が手に入ります。
バイナリファイルは約 13 MiB(kage 本体)+ サイトのコンテンツサイズです。
クロスプラットフォームのパッケージング
macOS 上で Windows 向けにパッケージすることもできます:
# Mac 上で Windows 実行ファイルを生成
kage pack paulgraham.com --format binary \
--base kage-windows-amd64.exe
# paulgraham.exe を出力
releases ページからターゲットプラットフォームの kage バイナリを --base として指定するだけです。
オプション 3:ダブルクリックで使えるデスクトップアプリ
--app パラメータを付けると、アイコン付きのデスクトップアプリを生成します:
# macOS → .app パッケージ
kage pack paulgraham.com --app
open paulgraham.app
# Linux → AppImage
kage pack paulgraham.com --app --base kage-linux-amd64
# paulgraham.AppDir / paulgraham.AppImage を出力
ダブルクリックで開くだけで、ターミナルウィンドウは表示されず、直接ウェブサイトに入れます。
実践シナリオ
シナリオ 1:技術ブログをオフラインナレッジベースとして保存
# Paul Graham の全記事をクローン
kage clone paulgraham.com --scroll -o ~/docs/paulgraham
# ZIM にパッケージングして Kindle/スマホでいつでも読む
kage pack paulgraham.com
# または単一ファイルにパッケージングして友人に共有
kage pack paulgraham.com --format binary -o ~/share/paulgraham-essays
シナリオ 2:ドキュメントサイトのオフライン版
# Go 公式ドキュメントをクローン
kage clone go.dev --scope-prefix /doc --max-depth 3
# 出張で飛行機の中、ネットなし?ローカルで serve すればいい
kage serve ~/data/kage/go.dev
シナリオ 3:長期アーカイブ
サイトが閉鎖されたり移行したりすることがあります。kage で定期的にアーカイブできます:
# cron に追加して毎月自動更新
# 0 2 1 * * kage clone example.com --refresh
注意事項
- robots.txt:kage はデフォルトで
robots.txtを遵守します。開発/テスト環境で無視する必要がある場合は--no-robotsを付けてください。 - Chrome 依存:Docker 以外はホストマシンに Chrome/Chromium のインストールが必要です。
- ディスク容量:大規模なサイトの場合、クローン後に数 GB を占有することがあります。
- 法的配慮:ウェブサイトの著作権と robots.txt を尊重してください。商用目的や著作権侵害には使用しないでください。
まとめ
kage は現在最もエレガントなウェブサイトオフラインクローンツールです。headless Chrome で実際にページをレンダリングし、すべての JavaScript を除去することで、動的ウェブページを真に「あなたのもの」である静的 HTML に変換します。ZIM パッケージングと自己完結型実行ファイルにより、長期アーカイブと共有に最適なソリューションです。
- GitHub: tamnd/kage
- 公式サイト: kage.tamnd.com
- ライセンス: MIT
- インストール:
go install github.com/tamnd/kage/cmd/kage@latest
オフライン環境でドキュメントを読むことが多い方や、特定サイトのコンテンツを永久に保存しておきたい方には、kage は間違いなくツールボックスに加える価値があります。