See everything Claude Code did — locally, instantly.
A native desktop viewer and analyzer for Claude Code sessions. Reads the logs already on your machine and reconstructs the full trace: file paths, diffs, thinking, subagents, token usage. No account, no API key, no upload.
English · 简体中文
Claude Code hides what it does. The terminal collapses each step into a
one-line summary — Read 3 files, Searched for 1 pattern, Edited 2 files —
with no paths, no content, no diffs. Thinking is invisible, subagent activity is
buried, and the context window is a three-segment bar with no breakdown. The
only escape hatch is --verbose, which dumps raw JSON and thousands of lines of
noise. There is no middle ground.
claude-devtools-rs reads the logs already saved under ~/.claude/ and
reconstructs everything — in a native desktop app, not a browser tab or an
Electron shell.
| What the terminal hides | What claude-devtools-rs shows |
|---|---|
Read 3 files |
Exact paths, syntax-highlighted content with line numbers |
Searched for 1 pattern |
The pattern, every matching file, the matched lines |
Edited 2 files |
Inline diffs with added / removed highlighting |
| Three-segment context bar | Per-category token attribution (CLAUDE.md, skills, @-files, tool I/O, thinking, …) |
| Collapsed subagent output | Full execution trees per agent with token / model / error metrics |
| Nothing about thinking | Extended thinking content, fully rendered |
--verbose JSON dump |
A structured, searchable, navigable interface |
Built in Rust + Tauri — it's a port of the Electron claude-devtools, rewritten for performance: a thousand-message session opens in well under a second, idle CPU stays near zero, and it won't spin your fan while it sits in the background.
Everything stays local. No account, no API key, no network calls — it only reads files already on your disk, and updates the view live as sessions run.
![]() |
![]() |
| Session Detail — execution trace, tool-call cards, inline diffs | Sidebar + Search — projects, live session list, Cmd+K |
![]() |
|
| Tool Viewer — specialised viewers for Read / Edit / Write / Bash with syntax highlighting | |
~/.claude/projects/, groups history by project,
and follows running sessions live.Cmd+F within a session, Cmd+K across sessions.asset:// images,
lazy subagent / tool output) keeps thousand-message sessions snappy.Download the installer for your platform from Releases:
.dmg (Apple Silicon / Intel).deb / .AppImage.msi / .exeThe app is not signed with an Apple Developer ID (ad-hoc signature only) or a Windows code-signing certificate.
macOS first launch: after dragging the app from the
.dmgto/Applications, right-click → Open (not double-click) and confirm. If it's still blocked, System Settings → Privacy & Security has an "Open anyway" button. If you see "…is damaged and can't be opened" (browser downloads carry a quarantine attribute), run:sudo xattr -rd com.apple.quarantine "/Applications/Claude DevTools.app"Windows: SmartScreen → "More info" → "Run anyway".
cdt)The CLI queries session data from the terminal and integrates with Claude Code via MCP / Skills.
One-line install (macOS / Linux):
curl -fsSL https://raw.githubusercontent.com/snowzhaozhj/claude-devtools-rs/main/install.sh | sh
Other methods:
| Method | Command |
|---|---|
| Manual download | Grab cdt-{platform}.tar.gz from Releases |
| Build from source | cargo install --git https://github.com/snowzhaozhj/claude-devtools-rs cdt-cli |
After installing, run cdt setup mcp --apply to register the MCP server, or
cdt setup skills to install the session-analysis skill. Update with
cdt self-update (or re-run the install script).
Environment variables:
| Variable | Purpose | Default |
|---|---|---|
CDT_INSTALL_DIR |
Install directory | ~/.local/bin |
CDT_VERSION |
Pin a version (e.g. v0.5.14) |
latest |
The cdt CLI plugs into Claude Code two ways: as an MCP server and as a skill.
Register cdt so Claude can call session-query tools directly:
cdt setup mcp --apply # automatic
# or manually:
claude mcp add cdt-devtools -- cdt mcp serve
Claude Code then has list_projects, list_sessions, search_sessions,
get_session_detail, get_session_stats, and more.
cdt setup skills # install to .claude/skills/
cdt setup skills --force # overwrite existing
Installs the session-insights skill (error analysis, token accounting,
full-text search, single-session diagnostics). Trigger it with
/session-insights in Claude Code, or just describe what you want. The skill
shells out to cdt directly — no MCP config required.
Enable a local HTTP server under Settings → General → Browser Access. The app
shows a http://localhost:<port> URL (default 3456); open it in any browser
to get the same UI.
Security model: the server binds 127.0.0.1 only, CORS allows just
localhost / 127.0.0.1 origins, and there is no token or password auth. It's
meant for the local browser, iframe embedding, or local scripts — it is not
exposed to the LAN. For remote access, put your own reverse proxy, TLS, and auth
in front of it.
Desktop-only capabilities (system tray, Dock badge, native notifications, in-app updates, Rosetta detection) are hidden or disabled in the browser runtime.
Prerequisites: Rust stable (rust-toolchain.toml pins 1.85+), Node.js 20+,
pnpm 8+, just.
brew install just pnpm # if you don't have them
just bootstrap # install frontend deps (pnpm install)
just dev # launch the desktop app in dev mode
This repo uses pnpm (not npm) for frontend deps; the lockfile is
ui/pnpm-lock.yaml. After a worktree switch / rebase, runpnpm --dir ui installto sync.
Common recipes (full list: just or just -l):
| Command | Purpose |
|---|---|
just build |
Compile the workspace |
just build-tauri |
Build the desktop app |
just test |
Rust + frontend tests |
just lint |
clippy (strict) |
just fmt |
rustfmt |
just check-ui |
svelte-check + tsc |
just test-e2e |
Playwright user-story tests |
just preflight |
fmt + lint + test + spec-validate, all at once |
pnpm --dir ui run dev
# open http://127.0.0.1:5173/?mock=1&fixture=multi-project-rich
?mock=1 enables dev-only mockIPC backed by fixture data (empty /
single-project / multi-project-rich). The production bundle contains no
mockIPC (verified by vite DCE).
crates/
├── cdt-core # shared types (no runtime deps)
├── cdt-parse # session-parsing
├── cdt-analyze # chunk-building / tool-linking / context-tracking / team-metadata
├── cdt-discover # project-discovery / session-search
├── cdt-watch # file-watching
├── cdt-config # configuration-management / notification-triggers
├── cdt-ssh # ssh-remote-context
├── cdt-api # ipc-data-api / http-data-api
└── cdt-cli # binary entrypoint (`cdt`)
ui/ # Svelte 5 + Vite frontend
src-tauri/ # Tauri 2 Rust backend (excluded from workspace)
openspec/
├── specs/ # behaviour contract (authoritative source of truth)
└── TS_BASELINE_DEVIATIONS.md # TS-port deviation notes
main is the release branch — don't commit to it directly. Use a feature
branch + PR:
git checkout -b feat/xxx
# ...changes
just preflight
git commit -m "..."
git push -u origin feat/xxx
gh pr create --base main
CI (.github/workflows/ci.yml) runs fmt / clippy / test and must be green before
merge. Project conventions and architecture live in CLAUDE.md;
behaviour contracts in openspec/specs/<capability>/spec.md.
Versions are kept in sync across three files: Cargo.toml (workspace),
src-tauri/Cargo.toml, and src-tauri/tauri.conf.json.
git checkout main && git pull
just release-check # verify versions + clean tree + preflight
git tag v0.2.0
git push origin v0.2.0 # triggers .github/workflows/release.yml
The tag build (tauri-apps/tauri-action) produces macOS arm64/x64 + Linux +
Windows bundles into a Draft Release. The app integrates tauri-plugin-updater
for in-app updates (macOS / Windows / Linux AppImage; .deb excluded). See
CHANGELOG.md for release history.
CLAUDE.mdopenspec/specs/<capability>/spec.mdopenspec/README.md