こんな経験はありませんか?

いい記事をブックマークして、数ヶ月後に開いてみると——空白のページ、延々と読み込みスピナーが回り続ける、あるいは存在しなくなった 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+ を推奨):

BASH
go install github.com/tamnd/kage/cmd/kage@latest

方法 2:Homebrew(macOS)

BASH
brew install --cask tamnd/tap/kage

方法 3:Scoop(Windows)

BASH
scoop bucket add tamnd https://github.com/tamnd/scoop-bucket
scoop install kage

方法 4:apt(Ubuntu/Debian)

BASH
# リポジトリキーとソースを追加
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)

BASH
sudo dnf config-manager --add-repo https://tamnd.github.io/linux-repo/dnf/tamnd.repo
sudo dnf install kage

方法 6:Docker(Chrome をインストールする必要なし)

Docker イメージには Chromium が同梱されており、すぐに使えます:

BASH
docker run --rm -v "$PWD/out:/out" ghcr.io/tamnd/kage clone paulgraham.com

インストール後の確認

BASH
kage --version
kage completion bash  # または zsh / fish。タブ補完を有効にする

注意:kage には Chrome または Chromium が必要です。Docker 以外の方法では、ホストマシンに Chrome/Chromium をインストールする必要があります。kage はシステム上のインストールパスを自動的に検索しますが、--chrome パラメータまたは KAGE_CHROME 環境変数で指定することもできます。


クイックスタート:3 分でウェブサイトをクローン

Paul Graham のブログを例に、サイト全体をローカルにクローンしてみましょう:

BASH
# 1. サイト全体を $HOME/data/kage/paulgraham.com/ にクローン
kage clone paulgraham.com

# 2. ローカルでプレビュー
kage serve $HOME/data/kage/paulgraham.com
# ブラウザで http://127.0.0.1:8800 を開く

これだけ! すべての記事、すべての画像、すべてのスタイルファイルがあなたのディスク上に凍結され、ネットワークゼロ依存で動作します。

クローン範囲の制限

動作を軽く試したいだけなら、クローンの深さを制限できます:

BASH
# 最初の 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 は自動スクロールに対応しています:

BASH
kage clone example.com --scroll

これにより、kage は各ページを自動的に底部までスクロールし、遅延読み込みされる画像や iframe などのコンテンツが完全にレンダリング・保存されることを保証します。

2. 差分更新(--refresh)

1 ヶ月前にクローンしたブログに新しい記事が追加された?最初からやり直す必要はありません:

BASH
kage clone paulgraham.com --refresh

--refresh は既存のページを再レンダリングし、新規コンテンツを抓取します。kage のクローンは冪等です:同じページに http と https のどちらでアクセスしても、保存されるのは 1 回だけです。

3. グレースフルな中断とレジューム

クローン中に Ctrl+C を押しても大丈夫。kage が現在の進行状況を自動的に保存します:

BASH
# Ctrl+C で中断。次回実行時に自動的に中断箇所から再開
kage clone paulgraham.com

4. サブドメインを含める

BASH
kage clone example.com --subdomains

blog.example.com、docs.example.com などのサブドメインも同時にクローンされます。


パッケージング:フォルダから単一ファイルへ

クローン後のミラーは数千の小ファイルを含むフォルダです。そのままコピーするのは時間がかかります。kage はミラー全体を単一ファイルに圧縮することができます。

オプション 1:ZIM ファイルにパッケージング

ZIM は Kiwix プロジェクトが使用するオープンなオフライン形式で、長期アーカイブ向けに設計されています:

BASH
# パッケージング
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 つのウェブサイト全体:

BASH
# 自己完結型のバイナリファイルにパッケージング
kage pack paulgraham.com --format binary -o paulgraham

# 直接実行、ゼロ依存
./paulgraham
# 自動的に HTTP サービスを起動。ブラウザでアクセスするだけ

このファイルを受け取った人は何もインストールする必要がありません:kage もブラウザも ZIM リーダも不要です。実行するだけで、ウェブサイト全体のオフライン版が手に入ります。

バイナリファイルは約 13 MiB(kage 本体)+ サイトのコンテンツサイズです。

クロスプラットフォームのパッケージング

macOS 上で Windows 向けにパッケージすることもできます:

BASH
# Mac 上で Windows 実行ファイルを生成
kage pack paulgraham.com --format binary \
  --base kage-windows-amd64.exe
# paulgraham.exe を出力

releases ページからターゲットプラットフォームの kage バイナリを --base として指定するだけです。

オプション 3:ダブルクリックで使えるデスクトップアプリ

--app パラメータを付けると、アイコン付きのデスクトップアプリを生成します:

BASH
# 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:技術ブログをオフラインナレッジベースとして保存

BASH
# 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:ドキュメントサイトのオフライン版

BASH
# Go 公式ドキュメントをクローン
kage clone go.dev --scope-prefix /doc --max-depth 3

# 出張で飛行機の中、ネットなし?ローカルで serve すればいい
kage serve ~/data/kage/go.dev

シナリオ 3:長期アーカイブ

サイトが閉鎖されたり移行したりすることがあります。kage で定期的にアーカイブできます:

BASH
# cron に追加して毎月自動更新
# 0 2 1 * * kage clone example.com --refresh

注意事項

  1. robots.txt:kage はデフォルトで robots.txt を遵守します。開発/テスト環境で無視する必要がある場合は --no-robots を付けてください。
  2. Chrome 依存:Docker 以外はホストマシンに Chrome/Chromium のインストールが必要です。
  3. ディスク容量:大規模なサイトの場合、クローン後に数 GB を占有することがあります。
  4. 法的配慮:ウェブサイトの著作権と 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 は間違いなくツールボックスに加える価値があります。