claude-replay
An interactive, read-only viewer for AI coding-agent session transcripts — like claude --resume, but you can only read: scroll, fold, search, and live-tail. Reads both Claude Code (~/.claude/projects/) and Codex (~/.codex/sessions/) transcripts, auto-detecting each. A Rust + ratatui TUI that renders a session the way the agent does (assistant text, thinking, tool calls, +/- diffs, markdown, syntect-highlighted code) without ever continuing or mutating the session.
Extracted from claude-toolbox (the justdoit/ module), where it began life as claude-peek-v2. Its bash predecessor, claude-peek, still ships there.
Install
Homebrew (macOS / Linux) — recommended:
brew install tanghong123/tap/claude-replayThis taps tanghong123/tap and puts the claude-replay command on your PATH, so you can run it from anywhere:
claude-replay --latest # open your most recent session
claude-replay --versionOn macOS and Linux (x8664 and arm64) this downloads a prebuilt binary — no Rust toolchain, no compile. Later, brew upgrade claude-replay updates it and brew uninstall claude-replay removes it. (Equivalent two-step: brew tap tanghong123/tap then brew install claude-replay.)
Prebuilt binary (no Homebrew, no Rust) — cargo-binstall grabs the release tarball for your platform:
cargo binstall claude-replayOr download a claude-replay-<target.tar.gz from the releases page directly (static musl builds for Linux; run on any distro).
From source (needs a Rust toolchain):
cargo install --path . # → ~/.cargo/bin/claude-replay
# or
cargo build --release # → target/release/claude-replayUsage
claude-replay pick from this dir's sessions (Claude + Codex)
claude-replay <session-id | path/to.jsonl> render that transcript (agent auto-detected)
claude-replay --latest newest session for THIS dir or an ancestor (not the global newest)
claude-replay --agent codex only show Codex sessions (or --agent claude)
claude-replay <id> -f follow a running session live
claude-replay <id|--latest> --dump - plain text to stdout (no TUI) — for pipes/tests
claude-replay <id|--latest> --dump [stem] write <stem>.txt + <stem>.ansi (deduced stem if omitted)
claude-replay <id|--latest> --dump --width N dump at width N (default: terminal width, else 100)
claude-replay <id|--latest> --dump --full dump with everything expanded (default folds like the TUI)
claude-replay <id|--latest> --dump-html [stem] export a single self-contained <stem>.html (deduced stem if omitted)
claude-replay <id|--latest> --dump-html - write the HTML page to stdout (no TUI) — for pipes/tests
claude-replay <id> -f --dump-html [stem] live: also write an append-only <stem>.jsonl the page followsclaude-replay <id -f --html live HTML: also follows the session (new turns stream in)
**Multi-agent.** With no argument, the picker merges this directory's sessions from
**every agent** — Claude Code (`~/.claude/projects/`) and Codex
(`~/.codex/sessions/`) — into one list, each row tagged with its agent; one session
opens straight in. The agent for any opened file is auto-detected from its contents,
so an explicit path or `--latest` just works. `--agent claude|codex` filters the
picker/`--latest` to a single agent. (`CODEX_HOME` / `CODEX_SESSIONS_DIR` override
the Codex root.)
`--dump` renders through the same pipeline as the live viewer and applies the same
default fold policy, so its output matches what the TUI shows (add `--full` to expand
every block).