๐ฎ clustervision
Vibecoding is a clusterfuck. When it gets hazy, you need clustervision.
Your AI coding sessions are gold. Stop letting them rot in scattered folders.
Find, search, port, prune, and even resurrect every AI coding-agent session you've ever run โ across 22 harnesses, through one unified format.
claude ยท codex ยท grok ยท opencode ยท gemini ยท antigravity ยท hermes ยท openclaw ยท cursor ยท โฆ
search full-text or exact code ยท read behind every compaction ยท port across harnesses ยท resurrect a maxed-out session ยท pack a new task from your whole history
No database server, no import step, no telemetry: clustervision reads your real local session storage. cv index builds full-text search, cv index --exact adds trigram substring acceleration.
the desktop app reading 2,245 real local sessions across 8 harnesses โ heatmap, harness legend, and a live feed
The problem (you've felt this)
You spent three hours teaching an agent your codebase: the dead ends, the decisions, the understanding. Then:
- ๐ You can't find it. It's one of hundreds of
.jsonlfiles in a folder named after a path. - โ๏ธ It's trapped. Most harnesses resume a session only from the exact directory it ran in.
- ๐๏ธ It's stranded. Started in Claude Code, want to continue in Codex? Every tool speaks its own dialect.
clustervision means you never restart from scratch.
What you can actually do with it
# ๐ find that session from last week by what it was ABOUT, not where it lived
# ๐ take a Claude session and continue it in Codex. for real.
# โฆ wrote ~/.codex/sessions/2026/โฆ/rollout-โฆ.jsonl
# โณ codex resume 019e75e0-โฆ
# ๐งณ break a session out of its directory jail (brings CLAUDE.md / MEMORY.md along)
# ๐ชฆ a session hit the context wall and won't reopen? prune the bulk and revive it
# โฆ recorded context 976k โ 149k ยท resume with: claude --resume <new-id>
# ๐ the orchestrator crashed mid-swarm? move its lanes into your live session, context intact
# โณ resume, from session 945e6fa2: SendMessage {"to": "a5d8fd7aa0b73f0e7", โฆ}
# ๐๏ธ archive and follow every agent on your machine live, or replicate to a fleet hub
โฆand a couple that didn't exist before:
- ๐ฐ๏ธ A fleet hub & archive:
cv watch --toandcv archive sync --toreplicate scrubbed Zstd-Seekable session packs and events tocv serve --hub. - ๐ A zero-install web viewer: drop a zip of any harness folder into your browser. Nothing uploaded, all WASM.
๐ช 22 harnesses, one IR
| Harness | Parse | Port to | Harness | Parse | Port to | |||
|---|---|---|---|---|---|---|---|---|
| โ | Claude Code | โ | โ | โ | Cursor | โ | โ | |
| โ | Codex CLI | โ | โ | โ | Kimi CLI | โ | โยฒ | |
| โ | Grok CLI | โ | โ | โ | Qwen Code | โ | โ | |
| โ | OpenCode | โ | โ | โ | LM Studio | โ | โ | |
| โ | Gemini / Antigravity | โ | โ | โ | Cline | โ | โ | |
| โ | Hermes (Nous) | โ | โ | โ | Roo Code | โ | โ | |
| โ | OpenClaw | โ | โ | โ | Continue | โ | โ | |
| โ | Zed (agent panel) | โ | โ | โ | Goose (Block) | โ | โ | |
| โ | Devin CLI (Cognition) | โ | โ | โ | Kimi Code | โ | โ | |
| โ | OpenSession (cv export --format json) |
โ | โ | โ | ChatGPT / Claude.ai exports | โ | โ |
The Claude and ChatGPT desktop apps are not harnesses: one keeps transcripts server-side, the other encrypts them at rest; why neither is readable is recorded in docs/FORMATS.md. ยฒ Kimi CLI's ~/.kimi store has been frozen since 2026-06 (kimi-cli migrates it to ~/.kimi-code), so cv stopped writing there in 0.14.
Conversion is N-way among the 12 emit-capable harnesses, through one IR. Every format is reverse-engineered in docs/FORMATS.md. Bringing your own? โ Adding a harness ๐
โจ More than a viewer
- ๐งต Splice & loom โ compose a session from spans of others (
cv splice A:0..12 B:6..), fork a lane (cv splice A:..40 --session), or graft branches (cv splice A:..20 B:35..). A Janus loom for agent transcripts, across harnesses. - ๐ Full-text & exact search โ Tantivy BM25 over sessions plus live unindexed suffixes (
cv search <query>), and positional trigram substring search (cv search --exact <literal>) verified against source text. - ๐งฌ Provenance โ the event catalog classifies every tool call in every session.
cv touched <file>lists every session that edited a file;cv blame <file>ties each commit and hunk to the conversation that wrote it, with acv show --rangejump to the edit, and an exact match when the session's tool output shows the commit. - ๐ณ Anatomy of a run โ
cv workflow <id>renders aWorkflow-tool run: phase tree, agents per phase, their outcomes, tokens and tool calls, and the driving script.cv tools <id>gives per-agent tool histograms and a timeline over the whole forest.cv show <id> --kind compaction_boundary,compaction_summaryfinds every compaction seam;cv show --pre-compactionreads back what the continued agent lost.cv dataset --subagentsexports the forest. - โ๏ธ Prune โ custom compaction:
cv prune <id>moves bulky old tool payloads (file reads, logs, screenshots) into a sidecar behind a[PRUNED id=โฆ]marker and writes a new, resumable session. Prompts stay verbatim, recent turns intact;cv cat <new-id> <tool_use_id>restores any payload.--drop-thinkinglifts the oldest reasoning too. It also revives a session stuck at the context wall by rewriting the stale recordedusageClaude Code's resume gate trusts (--no-reviveopts out). (Adapted from flatten-mcp.) - โช Rewind โ
cv rewind <id> --at <sha>rebuilds an agent as it was when it landed a commit: from the last compaction before it to the tool result showing the commit, under a new id, soclaude --resume <new-id> --fork-sessionwakes up as the author. Works on sub-agents and message indexes; leaves a provenance sidecar.cv blameranks such sessions first (exact: commit created here) with thecv rewindline to paste. - ๐ Adopt โ a Claude Code session crashed with lanes in flight?
cv adopt <agent-id>โฆ [--into <live-session>]moves each sub-agent into a live session, whereSendMessageresumes it with its whole transcript. The transcript is copied withsessionIdrestamped (no other byte changes) and.meta.jsonverbatim.--intodefaults to the project's newest session;--fromnames the dead one;--dry-runprints the plan;--forceoverwrites;--model <ID>sets the model it resumes on โ and for an agent already in the live session (say one that hit a usage limit)--into <S> --model <ID>rewrites its meta in place and copies nothing.cv lanes --recent N --unfinishedlists candidates. Only the transcript moves: keep the dead session's directory, which holdstool-results/and any prune sidecar. Workflow-run agents are not adoptable. - ๐ Redact โ
cv export <id> --redactscrubs secrets and PII. - ๐ Share โ
cv share <id>writes one self-contained, redacted-by-default HTML file: collapsible thinking and tool folds, opens offline, CSP-pinned so it can't upload. - ๐ฆ Pack โ
cv pack "<task>"compiles relevant past spans and the files those sessions touched into a CLAUDE.md digest, a system prompt, or a resumable session in any harness. - ๐ฅ๏ธ Desktop app + ๐ web viewer โ the Tauri app reads all your local sessions natively, zero setup:
- a Projects lens: every repo and every agent that touched it, over time;
- an activity heatmap timeline;
- Compare, Stats, and a visual splice composer;
- sub-agent trees, nested inline and labeled with their task prompts;
- a Structure explorer (
<cv-forest>): Overview, Forest, Workflows, Tools and Compaction tabs.
- ๐ Hooks โ
cv hooks install claude(orcodex) installs five hooks (plus opt-in--retiredand--receipts): compactions become visible and reversible, a new session starts knowing this directory's history, lanes land instate.db, owed decisions surface, and an edit to a file another live session holds asks first (Codex: denies). See hooks.
๐ Manual
Every CLI command, the HTTP API, the app, conversion and the harness table: the user manual (mdBook, under manual/).
๐ ๏ธ Install
Prebuilt binaries for macOS, Linux and Windows (arm64 ยท x64 ยท x86) are on Releases, or:
|
Or from source:
๐ Dispatch work you can trust (cv task)
If you are the human the fleet is waiting on:
export CV_ENDPOINT=ember implies --from. cv task inbox ember --md renders the inbox as Markdown;
--unread keeps items someone else touched last. Bare list/inbox show 14 days (or anything
involving you) and count what they hid: --all or --since 90d.
Decisions are tasks with a default that stands if you say nothing, alternatives, and an
optional deadline; resolve records who chose.
For agents: cv never claims to have observed what it has not. A completion is labeled
self-reported; what git suggests (a merged branch, a vanished issue file) is a sweep candidate, never a close.
The same over cv serve (/api/tasks, /api/tasks/inbox/{who},
/api/inbox, /api/task/<id>/{resolve,done,note,discuss,claim,release}, /api/events). State lives in
~/.clustervision/state.db (SQLite WAL), refusing events its reducer would reject.
๐ก Archive your whole fleet (cv watch)
๐งฌ The OpenSession standard
OpenSession is the format seven harnesses should have agreed on: small, harness-neutral, and cwd is metadata, not identity. clustervision's IR is its reference implementation. Ship a harness? Emit OpenSession and its sessions are portable by construction. ๐ค
๐๏ธ Under the hood
One IR (Session โ Message โ Block{Text|Thinking|ToolUse|ToolResult|File|Image}), one Adapter per harness (roots + discover + stream, reading through one record codec per wire format) with an emitter beside the twelve that are port targets, plus splice / redact / prune / watch / ingest modules โ and small crates on top: cv (the one binary: the CLI, cv serve, cv watch, cv archive, and hooks) ยท cv-search (tantivy + trigram + columnar events) ยท cv-web (WASM) ยท app/ (Tauri desktop).
parse(any harness) โ ๐ฎ unified IR โ search ยท port ยท prune ยท splice ยท pack ยท archive ยท view
๐งช Status
Built largely by swarms of agents. โจ The edges:
- 22 harnesses parse; 12 also emit (N-way conversion). The rest โ Antigravity, Cursor, Goose, Zed, Devin CLI, Kimi CLI (frozen store), Kimi Code, OpenSession, and the ChatGPT/Claude.ai account data exports (
chatgpt-export/claude-exportโ register their location withcv config --add-export <path>) โ are parse-only for now. - Robustness: the maintainer's fleet (about 7,000 sessions, 95 GB) lists and indexes without a panic; a per-version corpus of real harness output is golden-tested; parsers are checked against malformed input (
crates/cv-core/tests/robustness.rs). - The full-text index trades disk for speed; Gemini's protobuf
.pbis opaque; a few sidecar tool-call streams aren't merged yet. - Historical format variants are a goal: see Adding a harness, and please send your harness logs.
PRs and weird old transcripts deeply welcome. ๐