The unified history viewer for AI coding assistants.
Browse, search, and analyze conversations from Claude Code, Codex CLI, and OpenCode — as a desktop app or headless server. 100% offline.
Desktop app — download and run:
| Platform | Download |
|---|---|
| macOS (Universal) | .dmg |
| Windows (x64) | .exe |
| Linux (x64) | .AppImage |
Homebrew (macOS):
brew install --cask jhlee0409/tap/claude-code-history-viewerHeadless server — access from any browser:
brew install jhlee0409/tap/cchv-server # or: curl -fsSL https://...install-server.sh | sh
cchv-server --serve # → http://localhost:3727See Server Mode for Docker, VPS, and systemd setup.
AI coding assistants generate thousands of conversation messages, but none of them provide a way to look back at your history across tools. CCHV solves this.
Three assistants. One viewer. Switch between Claude Code, Codex CLI, and OpenCode sessions seamlessly — compare token usage, search across providers, and analyze your workflow in a single interface.
| Provider | Data Location | What You Get |
|---|---|---|
| Claude Code | ~/.claude/projects/ |
Full conversation history, tool use, thinking, costs |
| Codex CLI | ~/.codex/sessions/ |
Session rollouts with agent responses |
| OpenCode | ~/.local/share/opencode/ |
Conversation sessions and tool results |
No vendor lock-in. No cloud dependency. Your local conversation files, beautifully rendered.
- Features
- Installation
- Build from Source
- Server Mode (WebUI)
- Usage
- Accessibility
- Tech Stack
- Data Privacy
- Troubleshooting
- Contributing
- License
| Feature | Description |
|---|---|
| Multi-Provider Support | Unified viewer for Claude Code, Codex CLI, and OpenCode — filter by provider, compare across tools |
| Conversation Browser | Navigate conversations by project/session with worktree grouping |
| Global Search | Search across all conversations from all providers instantly |
| Analytics Dashboard | Dual-mode token stats (billing vs conversation), cost breakdown, and provider distribution charts |
| Session Board | Multi-session visual analysis with pixel view, attribute brushing, and activity timeline |
| Settings Manager | Scope-aware Claude Code settings editor with MCP server management |
| Message Navigator | Right-side collapsible TOC for quick conversation navigation |
| Real-time Monitoring | Live session file watching for instant updates |
| Feature | Description |
|---|---|
| WebUI Server Mode | Run as a headless web server with --serve — access from any browser, deploy on VPS/Docker |
| Screenshot Capture | Long screenshot with range selection, preview modal, and multi-selection export |
| Archive Management | Create, browse, rename, and export session archives with per-file download |
| Accessibility | Full keyboard navigation, screen reader support, font scaling, and high contrast mode |
| Mobile UI | Responsive 390px viewport support with bottom tab bar |
| External Links | All links open in system browser instead of the app's WebView |
| Feature | Description |
|---|---|
| Session Context Menu | Copy session ID, resume command, file path; native rename with search integration |
| ANSI Color Rendering | Terminal output displayed with original ANSI colors |
| Multi-language | English, Korean, Japanese, Chinese (Simplified & Traditional) |
| Recent Edits | View file modification history and restore |
| Auto-update | Built-in updater with skip/postpone options |
brew tap jhlee0409/tap
brew install --cask claude-code-history-viewerOr install directly with the full cask path:
brew install --cask jhlee0409/tap/claude-code-history-viewerIf you see No Cask with this name exists, run the full cask path command above.
To upgrade:
brew upgrade --cask claude-code-history-viewerTo uninstall:
brew uninstall --cask claude-code-history-viewerMigrating from manual (.dmg) installation? Remove the existing app before installing via Homebrew to avoid conflicts. Choose one installation method — do not mix manual and Homebrew installs.
# Remove the manually installed app first rm -rf "/Applications/Claude Code History Viewer.app" # Then install via Homebrew brew tap jhlee0409/tap brew install --cask claude-code-history-viewer
git clone https://github.com/jhlee0409/claude-code-history-viewer.git
cd claude-code-history-viewer
# Option 1: Using just (recommended)
brew install just # or: cargo install just
just setup
just dev # Development
just tauri-build # Production build
# Option 2: Using pnpm directly
pnpm install
pnpm tauri:dev # Development
pnpm tauri:build # Production buildRequirements: Node.js 18+, pnpm, Rust toolchain
Run the viewer as a headless HTTP server — no desktop environment required. Ideal for VPS, remote servers, or Docker. The server binary embeds the frontend — a single file is all you need.
New to server deployment? See the full Server Mode Guide (한국어) for step-by-step instructions covering local testing, VPS setup, Docker, and more.
# Homebrew (macOS / Linux)
brew install jhlee0409/tap/cchv-server
# Or one-line script
curl -fsSL https://raw.githubusercontent.com/jhlee0409/claude-code-history-viewer/main/install-server.sh | shBoth methods install cchv-server to your PATH.
cchv-server --serveOutput:
🔑 Auth token: b77f41d4-ec24-4102-8f7a-8a942d6dd4a0
Open in browser: http://192.168.1.10:3727?token=b77f41d4-ec24-4102-8f7a-8a942d6dd4a0
👁 File watcher active: /home/user/.claude/projects
🚀 WebUI server running at http://0.0.0.0:3727
Open the URL in your browser — the token is saved automatically.
| Platform | Asset |
|---|---|
| Linux x64 | cchv-server-linux-x64.tar.gz |
| Linux ARM64 | cchv-server-linux-arm64.tar.gz |
| macOS ARM | cchv-server-macos-arm64.tar.gz |
| macOS x64 | cchv-server-macos-x64.tar.gz |
Download from Releases.
CLI options:
| Flag | Default | Description |
|---|---|---|
--serve |
— | Required. Starts the HTTP server instead of the desktop app |
--port <number> |
3727 |
Server port |
--host <address> |
0.0.0.0 |
Bind address (127.0.0.1 for local only) |
--token <value> |
auto (uuid v4) | Custom authentication token |
--no-auth |
— | Disable authentication (not recommended for public networks) |
--dist <path> |
embedded | Override built-in frontend with external dist/ directory |
All /api/* endpoints are protected by Bearer token authentication. The token is auto-generated on each server start and printed to stderr.
- Browser access: Use the
?token=...URL printed at startup. The token is saved tolocalStorageautomatically. - API access: Include
Authorization: Bearer <token>header. - Custom token:
--token my-secret-tokento set your own. - Environment variable:
CCHV_TOKEN=your-token cchv-server --serve(useful for systemd/Docker). - Disable:
--no-authto skip authentication entirely (only use on trusted networks).
The server watches ~/.claude/projects/ for file changes and pushes updates to the browser via Server-Sent Events (SSE). When you use Claude Code in another terminal, the viewer updates automatically — no manual refresh needed.
docker compose up -dCheck the token after startup:
docker compose logs webui
# 🔑 Auth token: ... ← paste this URL in your browserThe docker-compose.yml mounts ~/.claude, ~/.codex, and ~/.local/share/opencode as read-only volumes.
For persistent server on Linux, use the provided systemd template:
sudo cp contrib/cchv.service /etc/systemd/system/
sudo systemctl edit --full cchv.service # Set User= to your username
sudo systemctl enable --now cchv.servicejust serve-build # Build frontend + embed into server binary
just serve-build-run # Build and run (embedded assets)
# Or run in development (external dist/):
just serve-dev # Build frontend + run server with --distGET /health
→ { "status": "ok" }
- Launch the app
- It automatically scans for conversation data from all supported providers (Claude Code, Codex CLI, OpenCode)
- Browse projects in the left sidebar — filter by provider using the tab bar
- Click a session to view messages
- Use tabs to switch between Messages, Analytics, Token Stats, Recent Edits, and Session Board
The app includes accessibility features for keyboard-only, low-vision, and screen-reader users.
- Keyboard-first navigation:
- Skip links for Project Explorer, Main Content, Message Navigator, and Settings
- Project tree navigation with
ArrowUp/ArrowDown/Home/End, type-ahead search, and*to expand sibling groups - Message navigator navigation with
ArrowUp/ArrowDown/Home/EndandEnterto open the focused message
- Visual accessibility:
- Persistent global font size scaling (
90%,100%,110%,120%,130%) - High contrast mode toggle in settings
- Persistent global font size scaling (
- Screen reader support:
- Landmark and tree/list semantics (
navigation,tree,treeitem,group,listbox,option) - Live announcements for status/loading and project tree navigation/selection changes
- Inline keyboard-help descriptions via
aria-describedby
- Landmark and tree/list semantics (
| Layer | Technology |
|---|---|
| Backend | |
| Frontend | |
| State | |
| Build | |
| i18n |
100% offline. No conversation data is sent to any server. No analytics, no tracking, no telemetry.
Your data stays on your machine.
| Problem | Solution |
|---|---|
| "No Claude data found" | Make sure ~/.claude exists with conversation history |
| Performance issues | Large histories may be slow initially — the app uses virtual scrolling |
| Update problems | If auto-updater fails, download manually from Releases |
Contributions are welcome! Here's how to get started:
- Fork the repository
- Create a feature branch (
git checkout -b feat/my-feature) - Run checks before committing:
pnpm tsc --build . # TypeScript pnpm vitest run # Tests pnpm lint # Lint
- Commit your changes (
git commit -m 'feat: add my feature') - Push to the branch (
git push origin feat/my-feature) - Open a Pull Request
See Development Commands for the full list of available commands.
MIT — free for personal and commercial use.



