世界を動かす技術を、日本語で。

Show HN: Kage – ウェブサイトをオフラインで閲覧するための単一バイナリに変換するツール

2026年6月15日原文(github.com)

概要

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.compaulgraham.com.zim
        • kage open paulgraham.com.zim
      • 自己完結型バイナリ 化:
        • kage pack paulgraham.com --format binary -o paulgraham ./paulgraham
        • 実行だけで閲覧可能、追加インストール不要

主なコマンド一覧

| コマンド | 機能概要 | |---|---| | 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
  • 特定セクションだけ取得
    • 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.compaulgraham.com.zim
    • kage 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
    • サイズはkage本体分(約13MiB)+ミラー分

ネイティブウィンドウ表示

  • WebViewタグ付きビルドで独立ウィンドウ表示
    • make build-webviewCGO_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/kage
    • cd kage
    • make 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参照

Hackerたちの意見

SingleFile [0]は、これのもっと強力なバージョンだと思う。JavaScriptも全部削除してくれるし、すべてを一つのHTMLファイルにまとめてくれるから、転送も簡単だよ。バイナリアセット(ウェブフォントや画像など)はbase64文字列としてパックされるし、Puppeteerを使ったCLIも提供してる。

このリポジトリは1つのウェブページしか保存できないみたいだね?俺がやろうとしてるのは、全体のウェブサイトをミラーリングして、すべてのサブページをオフラインでブラウジングできるようにすることなんだ。例えば、paulgraham.comの全エッセイとか。

リンクありがとう!このシングルHTML機能を実装してみるよ、見た目がいいからね!

コンピュータのウェブブラウザで「ファイル -> 名前を付けて保存」と何が違うの?

SingleFileも大好き!FFの拡張機能はクリーンな保存に結構いい感じ。とはいえ、OPがSingleFileの再現品質とHTTPTrackのスパイダリングアプローチを組み合わせられたら、Kageは期待できそうだね。SPAはアーカイブにはちょっと厄介だから、Kageがそれをどう扱うか気になるな。

これが最初に思ったことで、とてもエレガントな解決策だし、無駄に複雑でもないね。

これ、サイトにかなりの負荷をかける可能性があるみたいだけど、クローンの速度を設定したり、画像や動画を避ける設定はあるのかな?ウェブサイトの一部だけを取得する方法はある?

それに関して新しいイシューを作成してもらえる?後でやるつもり。もう午前1時なんだけど、誰かが興味を持ってくれて嬉しいよ。 :)

これを使う一つの用途は、会社のウィキで、オフラインで簡単にアクセスできるようにしたいってことかな(ウィキに、携帯の電波がない場所でも役立つドキュメントがあるかもしれないし)。いいね!別のサーバープロセスが必要ないバージョンがあったら特にクールだな。全体のサイトを一つのバイナリとしてパッケージできるのはすごいけど、少しのJavaScriptでアーカイブ(埋め込み可能)にインデックスできるシングルHTMLエントリポイントのシムがあったらいいな。

これをHacker Newsに投稿するのが正しい場所だね!アイデアありがとう。実装を考えてみるよ :) それと、俺の頭の中にはHTMLをMarkdownに変換するスクリプト/プログラムがもうあるから、実際にはすべてをMarkdownファイルのフォルダとしてディスクに保存して、Gitリポジトリにコミットできるかも。

いいプロジェクトだね、アイデアが気に入った!ちょっと読んだ感じだけど、Chromeを--no-sandboxで起動してるみたい。理由があるのかな?セキュリティ的にはあんまり良くない気がするけど。理由がなければ、サンドボックスはオンにしておいた方がいいと思うよ!とにかく、面白いことしてるね :)

フライト中に読むためにウィキをダウンロードするのにhttrack(https://www.httrack.com)を使ってるんだけど、完璧ではないけど、前に見つけたものよりはマシだよ。これも試してみるつもり。いい結果が出たら嬉しいな。投稿ありがとう!

Hacker Newsで議論の続きを見る