
2026/06/15 2:25
Show HN: Kage(ケーヂ)——あらゆるウェブサイトを手元で単一のバイナリ化してオフライン閲覧可能にします。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Kage は、headless Chrome によるレンダリング後、複雑な JavaScript を除去し資産をローカライズすることで、動作的 Web サイトを完全オフラインアクセス用に複製することを目的とした、強力なオープンソースコマンドラインユーティリティです。このプロセスは、ライブサイトを静的で閲覧可能なフォルダまたは Kiwix エコシステムと互換性のあるポータブル ZIM ファイルに変換し、研究者や旅行者にとって信頼性の高いデータアーカイブの必要性に応えるのに最適です。本ツールは Kiwix エコシステムとシームレスに統合され、標準的なリーダーと互換性のあるポータブル ZIM ファイルを容易に生成することを可能にします。インストール方法は柔軟で、バイナリ、Docker コンテナ、および自己完結型フォーマットをサポートし、異なるシステム上の依存関係の問題を排除します。ユーザーは
clone や serve のようなコマンドを使用して複製の範囲を制御でき、資源使用量を管理しつつ Web クローリングの規範を遵守するように --max-pages などの設定を調整できます。Kage は MIT ライセンスによるオープンソースライセンスと礼儀正しい幅優先アプローチを採用することで、現代の Web アプリケーションの包括的なオフラインライブラリを作成する際の産業全体の採用を促進しており、アクセシビリティやパフォーマンスを犠牲にすることなく実現します。本文
Kage: オフラインで使えるウェブサイトのアーカイブツール
Kage は、ウェブサイトをローカルフォルダに保存し、オフラインで閲覧できるようにするツールです。JavaScript コードを実行せずとも、実在のブラウザ(ヘッドレス Chrome)によってレンダリングされた状態をスナップショットとして取得します。その結果、コードは一切実行されずとも、サイトが正常に表示される HTML ファイルとしてディスク上に保存されます。
目次
インストール
バイナリからのインストール
基本的には以下コマンドを実行します:
go install github.com/tamnd/kage/cmd/kage@latest
注意: 事前に構築されたバイナリ(.deb, .rpm, .apk)や Docker コンテナを使いたい場合は、公式リリースページ を確認してください。
Docker コンテナでの利用
Chrome を別途インストールせずに使用したい場合は、以下のコマンドで実行可能です:
docker run --rm -v "$PWD/out:/out" ghcr.io/tamnd/kage clone paulgraham.com
Kage は実際のブラウザを動作させるため、ホストマシンに Chrome または Chromium がインストールされている必要があります。指定場所を使用したい場合は
--chrome オプションまたは KAGE_CHROME 環境変数を利用します。コンテナイメージの場合は追加設定不要です。
シェル補完もパッケージに含まれています:
kage completion bash|zsh|fish|powershell
素早く始める
Paul Graham のエッセイをオフラインで保存・閲覧してみましょう(飛行機上や、Wi-Fi が使えない環境でも)。
手順 1: サイトのクローン
kage clone paulgraham.com
手順 2: オフライン閲覧
クローンされたフォルダをローカルサーバーとして起動します:
kage serve $HOME/data/kage/paulgraham.com
ブラウザで
http://127.0.0.1:8800 を開くと、ゼロのネットワーク接続でも完全に動作します。
手順 3: オプション操作(単一ファイル化)
ファイルを圧縮して持ち運びやすくしたい場合は以下のコマンドを使用します:
kage pack paulgraham.com # -> paulgraham.com.zim kage open paulgraham.com.zim
手順 4: オプション操作(自立型バイナリ化)
実行可能な単一ファイルとして作成することも可能です:
kage pack paulgraham.com --format binary -o paulgraham ./paulgraham # サーバーを立てずとも動作
コマンド一覧
| コマンド | 説明 |
|---|---|
| ヘッドレス Chrome でサイトをレンダリングし、スクリプトを除去した閲覧可能な鏡像を書き出します。 |
| クローンされたフォルダを静的ファイルサーバーとしてプレビュー表示します(ポート 8800)。 |
| 鏡像を単一の ZIM アーカイブ、または自立型のビューアーバイナリに圧縮します。 |
| パッキングされた ZIM ファイルを Kage または Kiwix で読み込めます。 |
クローン作成
基本的な使用方法とオプションです。
基本コマンド
# サイト全体をクローン kage clone https://paulgraham.com # 最初の 50 ページのみ(2 リンク深さ)を取得(試す用途) kage clone paulgraham.com --max-pages 50 --max-depth 2 # より大きなサイトの一部分だけを取得 kage clone go.dev --scope-prefix /doc # サブドメインも取得し、自動スクロールで遅延読み込み画像をトリガー kage clone example.com --subdomains --scroll # 新しいコンテンツ(例:新しいエッセイ)が追加されたら再レンダリング kage clone paulgraham.com --refresh
クローンの仕組み
- 礼儀正しい crawl:
を読み込み、指定範囲内で動作します。robots.txt - 冪等性 (Idempotent): 同じページは一度だけ取得されます(URL のプロトコルやスラッシュの有無に依存しません)。
- 中断復旧:
で中断しても、再度実行すると中断箇所から再開します。Ctrl-C
は再レンダリングし、--refresh
は一切をリセットします。--force
頻繁に使われるフラグ一覧
| フラグ | デフォルト | 意味 |
|---|---|---|
| | 出力ルートディレクトリ |
| | クローンする最大ページ数(0 = リミットなし) |
| | フォローするリンクの深さ(0 = リミットなし) |
| `` | クロール対象のパスプレフィックスを指定 |
| | シードホストのサブドメインもクロールするか |
| `` | クロールしないパスプレフィックス(複数可) |
| | 各ページを自動スクロールして遅延読み込みをトリガー |
| | 並列でレンダリングするワーカー数 |
| | robots.txt を無視 |
| | 既存の鏡像フォルダを削除して再作成 |
| `` | Chrome/Chromium の実行ファイルパス指定 |
詳細オプションは
kage clone --help で確認できます。
パッキング(単一ファイル化)
クローンされたフォルダは閲覧には適していますが、移動や共有には不便です。数千のファイルをコピーするよりも、単一のアーカイブまたは実行可能ファイルの方が圧倒的に便利です。
単一 ZIM ファイル
ZIM はオープン標準規格で、キウィックス(Kiwix)など多くのオフラインリーダーで利用可能です。
kage pack paulgraham.com # -> paulgraham.com.zim kage open paulgraham.com.zim # Kage で再読み込み kiwix-serve paulgraham.com.zim # Kiwix サーバー起動
ZIM ファイルの利点:
- 互換性: 数年後でもあらゆる ZIM リーダーで開けます。
- 検索制限: 内部ファイル検索はサポートしますが、Kiwi クライアント自体が提供するフルテキストインデックスとは別です。
- 決定論的: 同じ出力ディレクトリに対して常に同一のファイルを生成するため、キャッシュやチェックサムと相性が良いです。
自立型バイナリ(実行可能ファイル)
--format binary を使うと、インストール不要で動く実行可能ファイルを作成できます。
kage pack paulgraham.com --format binary -o paulgraham ./paulgraham # すぐに動作開始
特徴:
- サイズ: バイナリには Kage のコピーが含まれるため、約 13 MiB 程度になります(ZIM より重いですが、インストールなしですぐ使えます)。
- プラットフォーム対応:
オプションでターゲット OS のビューアを指定できます。--base
# Mac から Windows の exe を作成 kage pack paulgraham.com --format binary --base kage-windows-amd64.exe -o paulgraham
ネイティブウィンドウでの起動
デフォルトではシステムブラウザを開きますが、ネイティブアプリのように表示したい場合は WebView 機能を使います。
make build-webview # または: CGO_ENABLED=1 go build -tags webview kage pack paulgraham.com --format binary --base bin/kage -o paulgraham ./paulgraham # ブラウザの UI が見えないネイティブウィンドウで表示
注意点:
- CGO が必須: ネイティブビルドにはプラットフォーム固有のライブラリ(WebKitGTK, WebView2 など)が必要です。
- デフォルト: 純粋な Go ビルド(
)はブラウザを開きます。ZIM ファイルも同じCGO_ENABLED=0
でビルドすればネイティブウィンドウで開けます。-tags webview
ネイティブウィンドウについて
WebView を使用すると、ブラウザのように「タブが並ぶ」のではなく、独立したネイティブウィンドウとしてアプリケーションのように動作します:
- macOS: WKWebView
- Windows: WebView2
- Linux: WebKitGTK
これで、Paul Graham のエッセイをまるでアプリのようにオフラインで楽しむことができます。
仕組み
Kage は以下のフローで HTML ファイルを生成します:
シード URL ─▶ ヘッドレス Chrome ─▶ 最終的 DOM ─▶ スクリプト削除 ─▶ ローカライズアセット ─▶ ディスク (レンダリング) (スナップショット) (サニタイズ) (リンク書き換え)
プール構成
- Chrome タブプール: 実際のページをレンダリングします。
- アセットプール: プレーンな HTTP で画像や CSS を取得します。
ディレクトリ構造例
paulgraham.com/ ├── index.html # スクリプト除去済みのホームページ ├── greatwork.html # /greatwork.html のエッセイ └── _kage/ # 内部データ ├── paulgraham.com/site.css # URL をローカルパスに書き換えた CSS ├── paulgraham.com/pg.png # ローカルの画像 └── state.json # クロール再開用の状態情報
パッキングの原理
ZIM ファイルも同様の考え方に基づいています。鏡像内のリンクはすべて「鏡像相対パス」で、アーカイブ内のコンテンツに 1 対 1 マップされるため、ユーザーがクリックするたびに正しくアクセスできます(再マッピング不要)。
ソースからビルド
GitHub リポジトリをクローンして構築することも可能です。
git clone https://github.com/tamnd/kage cd kage # 通常ビルド(ブラウザを開く) make build # ネイティブウィンドウ付きビルド(cgo 必要) make build-webview # テスト実行(エンドツーエンドテストを含む) make test # ブラウザを起動するテストをスキップ make test-short
コード構造概要
: メインスレッドと CLI エントリポイントcmd/kage/
: Cobra 命令ツリーとフラグ定義cli/
: クロールロジック(フロントエンド、ワーカーなど)clone/
: ヘッドレス Chrome コントロールと DOM スナップショットbrowser/
: JavaScript 削除sanitize/
: CSS/画像のローカライズasset/
: URL からローカルパスへの決定論的マップurlx/
: ZIM アーカイブの作成・復元zim/
: ZIM やバイナリの圧縮処理pack/
: システムブラウザまたはネイティブウィンドウでの表示制御viewer/
リリース
新しいバージョンをリリースするには、以下の手順を実行します:
git tag v0.1.1 git push --tags
GitHub Actions が自動的に以下を生成します:
- 複数のアーキテクチャ用のバイナリ
- .deb / .rpm / .apk パッケージ
- Chromium をバンドルした Docker イメージ(GHCR)
- チェックサムと SBOMs
- cosign サイン
Docker イメージ名:
ghcr.io/tamnd/kage:0.1.1 (プレフィックスなし)
Homebrew や Scoop などのパッケージマネージャーへの追加は、トークン認証があるまで自動無効化されます。
ライセンス
MIT ライセンスです。
LICENSE ファイルを参照してください。