One command. All your Claude conversations. One place.
cchist は、複数のマシンに散らばった Claude Code のセッション履歴(~/.claude/projects/**/*.jsonl)と、Claude.ai のエクスポート ZIP を、ローカルの1ディレクトリに集約する CLI ツールです。集約後はそのまま claude -p に投げて「未完了タスク」「宙に浮いた検討事項」を自動抽出できます。
Claude を本気で使っていると、会話履歴が
- ローカルマシン (
~/.claude/projects/) - VPS / リモート開発機 (同上)
- Claude.ai (Web/モバイル)
- API 直叩きしているアプリのログ
…と複数の場所に分散していき、「あの議論どこでやったっけ?」「あの設計、結論出てたっけ?」が即座にわからなくなる問題があります。
cchist は SSH と rsync を裏で叩くだけのシンプルな配管屋で、cchist sync 一発で全部を1ディレクトリにミラーします。さらに --analyze フラグを付けると、集約後に claude -p を spawn して、横断的に未完了タスクを markdown で出してくれます。
# 1. インストール
npm install -g cchist # or: bun add -g cchist / pnpm add -g cchist
# 2. 設定ファイルを作る
cchist init
# 3. ~/.config/cchist/config.toml を編集して SSH ソース等を追加
$EDITOR ~/.config/cchist/config.toml
# 4. 同期
cchist sync
# 5. 横断で「未完了タスク」を抽出
cchist sync --analyze
# または
cchist analyze~/.config/cchist/config.toml:
storage = "~/cchist-archive"
[[source]]
name = "local"
kind = "local"
path = "~/.claude/projects"
[[source]]
name = "vps"
kind = "ssh"
host = "my-vps" # ~/.ssh/config を使う
remote_path = "~/.claude/projects"
[[source]]
name = "claude-ai"
kind = "zip"
path = "~/Downloads/claude-export.zip"| kind | 説明 | 必要なもの |
|---|---|---|
local |
ローカルのディレクトリ | rsync (推奨) または cp |
ssh |
SSH 経由のリモート | rsync, ssh, ~/.ssh/config 設定済み |
zip |
Claude.ai のデータエクスポート ZIP | unzip |
[[remote]] を追加するとローカル sync 完了後にアーカイブを S3 互換オブジェクトストレージへ自動ミラーします。aws CLI を裏で叩くだけなので、AWS S3 / Cloudflare R2 / MinIO / Backblaze B2 / Wasabi いずれも同じ設定で動きます。
# AWS S3
[[remote]]
name = "s3-backup"
kind = "s3"
bucket = "my-cchist-archive"
prefix = "archive"
region = "us-east-1"
# Cloudflare R2 (S3 互換)
[[remote]]
name = "r2-backup"
kind = "s3"
bucket = "my-cchist-archive"
prefix = "archive"
region = "auto"
endpoint = "https://<ACCOUNT_ID>.r2.cloudflarestorage.com"認証は標準 AWS チェーン (環境変数 AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY、~/.aws/credentials、IMDS 等)。cchist 自身は秘密情報を読みません。R2 の場合は R2 API トークンを上記環境変数として export してください。
| フラグ | 効果 |
|---|---|
--skip-remote |
リモートプッシュをスキップ (ローカル sync のみ) |
--remote-only |
ソース sync をスキップし、既存アーカイブをリモートに再 push |
--only-remote <name...> |
指定 remote だけに push |
--dry-run |
aws s3 sync --dryrun を含めて何が転送されるか表示 |
cchist init # ~/.config/cchist/config.toml を生成
cchist sync # 全ソースから同期
cchist sync --only local vps # 特定ソースだけ
cchist sync --dry-run # 何をやるか確認
cchist sync --analyze # 同期 + claude -p で分析
cchist sync --debounce 30 # 30秒以内に実行済みならスキップ
cchist list # アーカイブ内のセッション一覧(新しい順)
cchist list --source vps # ソース絞り込み
cchist list --json # JSON 出力
cchist search "ERC-4337" # 横断 grep
cchist analyze # 同期せずに分析だけ実行
cchist analyze --prompt "..." # プロンプト差し替え
cchist install-hook # Claude Code の Stop hook に cchist sync を登録
cchist install-hook --debounce 60 # debounce 窓を 60 秒に変更
cchist install-hook --dry-run # 書き込まずに確認cchist install-hook を一度実行すると、~/.claude/settings.json の Stop hook に
cchist sync --only local --debounce 30 が登録されます。
Claude Code セッションが終了するたびにローカル履歴が自動同期されます。
cchist install-hook # デフォルト設定で登録
cchist install-hook --debounce 60 # debounce を 60 秒に変更して登録
cchist install-hook --force # 既存の cchist hook を置き換えて再登録注意: SSH ソースは hook では同期されません (--only local 限定)。
マルチマシン集約は引き続き cchist sync を手動実行してください。
- ソース ごとに
~/cchist-archive/<source-name>/を作る - SSH ソースなら
rsync -az --delete --include='*.jsonl' ...でリモートからミラー - ZIP ソースなら
unzipで展開し、conversations.jsonを per-conversation な jsonl に分解 --analyze時はclaude -p "<archive を読んで未完了タスクを抽出して>"を~/cchist-archiveを cwd にして spawn
**重要: cchist 自身に LLM ロジックは無い。**Anthropic API キーも不要。claude CLI が既に認証済みであることだけが前提です。
- 集約された jsonl にはコード差分、コマンド履歴、場合によっては
.envの中身まで含まれます ~/cchist-archiveのパーミッションは自分で管理してください(デフォルトはユーザのデフォルト umask)- SSH ソースは
BatchMode=yesで動くので、ssh-agent or 鍵認証が必要
git clone https://github.com/InterfaceX-co-jp/cchist
cd cchist
bun install # or npm install / pnpm install
bun run src/cli.ts --help # dev
bun run build # → dist/cli.mjsCLI で R2 / S3 に push したアーカイブを、ブラウザで閲覧する読取専用アプリ。コードは web/。
Hono + JSX SSR 単一コードベース → 2 経路でデプロイ可能:
- Cloudflare Workers — R2 native binding 直結。認証情報を Worker 内に持たない。bundle gzip 188KB
- Railway / Node — S3-compatible env vars 経由 (
@aws-sdk/client-s3fallback)
cd web
npm install
npx wrangler r2 bucket create cchist
npx wrangler secret put BASIC_AUTH_USER
npx wrangler secret put BASIC_AUTH_PASS
npm run deploy:cf共通仕様:
- セルフホスト前提 (SaaS 提供なし)
- DB 不要 — bucket をそのまま読む
- HTTP Basic Auth で保護 (
BASIC_AUTH_USER/BASIC_AUTH_PASS)。未設定なら public - 詳細 env vars / scripts / アーキテクチャは
web/README.md参照
Railway ボタンの
REPLACE_MEを referral code に置換、Railway dashboard で template 登録するとワンクリックで env var 入力フォーム → デプロイ。
-
cchist install-hook: hook 経由のリアルタイム同期 (Stophook →cchist sync --only local) - API ログ取り込み(SDK ラッパー or OpenTelemetry コレクタ)
- Web UI —
web/(Hono + JSX, Cloudflare Workers / Railway 両対応) - Web UI: 検索 / セッション差分 / タイムライン
- 個別セッションを markdown にエクスポート
- memory のエクスポート(claude.ai)取り込み
MIT © InterfaceX Co., Ltd.
cchist is a single-command CLI that aggregates Claude conversation history (Claude Code ~/.claude/projects/**/*.jsonl plus claude.ai export ZIPs) from multiple machines into one local archive. Optionally pipes the archive into claude -p to extract unfinished tasks across all sessions.
npm install -g cchist
cchist init
$EDITOR ~/.config/cchist/config.toml # add your SSH hosts
cchist sync --analyzecchist is a thin plumbing layer: rsync for transfers, claude -p for analysis. No API keys needed; uses your existing claude auth. See examples/config.example.toml for full config reference.