TUI for viewing Claude Code JSONL session logs.
Built for those who run Claude Code with --output-format stream-json and want to inspect what happened. Particularly useful when orchestrating multiple sessions via scripts.
nix run github:albertov/cclv # static binary, no glibcOr download a release
nix build github:albertov/cclv
# From source
cargo build --release
# Read a log file
cclv session.jsonl
# Follow a live scripted session
claude -p "do something" --verbose --output-format stream-json | tee session.jsonl | cclv
# Or tail a log being written by another process
tail -c+0 -f session.jsonl | cclv
# Start at specific line with search active
cclv session.jsonl -l 50 -s "error"
# Show stats panel on startup
cclv session.jsonl --stats| Flag | Description |
|---|---|
FILE |
JSONL log file (reads stdin if omitted) |
-l, --line N |
Start at line N |
-s, --search QUERY |
Start with search query active |
--stats |
Show statistics panel on startup |
--theme NAME |
Syntax theme: base16-ocean (default), solarized-dark, solarized-light, monokai |
--no-color |
Disable colors |
--config PATH |
Custom config file |
Navigation: Main conversation and subagent tabs. Each tab shows the model name and entry count. Switch tabs with number keys (1-9) or Tab/Shift-Tab.
Rendering: Markdown with syntax highlighting. Long messages collapse automatically; expand with Enter or Space. Tool invocations display as formatted JSON.
Statistics: Token counts and cost estimation per agent. Toggle with s, filter with f (global), m (main), S (subagent). Note: stats parsing is currently broken for some log formats.
Live tailing: When reading from stdin, shows LIVE indicator and auto-scrolls. Scroll up to pause, a to resume.
Press ? for a scrollable help overlay. Key bindings:
Navigation
j/kor arrows: scroll up/downh/lor left/right: scroll horizontally (long lines)g/G: top/bottomCtrl-d/uor PageDown/Up: page down/up
Tabs
1-9: select tab directlyTabor]: next tabShift-Tabor[: previous tab
Messages
EnterorSpace: toggle expand/collapsee: expand allc: collapse all
Search
/orCtrl-f: start searchCtrl-s: submit search (Enter not yet wired up)Esc: canceln/N: next/previous match
Stats
s: toggle stats panelf/m/S: filter global/main/subagent
Other
w/W: toggle item/global line wrapa: toggle auto-scroll (live mode). This happens automatically when at the end of the scrollr: refresh displayq: quit
Requires Rust 1.83+.
nix develop # Enter dev shell
cargo test # Run tests (1200+)
cargo clippy # Lint
nix fmt # Format everythingMIT
