Claude Code Viewer: a web client for browsing and resuming Claude Code sessions
A full-featured web-based Claude Code client that provides complete interactive functionality for managing Claude Code projects
At a glance
- What is it?
- d-kimuson/claude-code-viewer is a TypeScript web client that reads Claude Code session logs, resumes conversations and runs a built-in terminal. It installs with npx, but chat sending depends on which authentication mode you pick.
- Who is it for?
- Adopt Claude Code Viewer if you want to read and resume Claude Code sessions from a browser, especially on an always-on machine reached over Tailscale, and you are comfortable with the Agent SDK boundary described in the README. Do not adopt it if you need Windows support or if you expect subscription-based chat sending to work out of the box, because the README makes those features opt-in.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 29 days ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.
DEEP OPEN-SOURCE ANALYSIS
What Claude Code Viewer is for
Claude Code writes session logs to disk, and reading them back through a terminal is awkward once a project has dozens of conversations. Claude Code Viewer puts those logs in a browser. The repository describes it as a web-based Claude Code client focused on session log analysis, with a stated philosophy of zero data loss, effective organization and remote-friendly design. The audience is developers who already run Claude Code and want history, not a replacement for the CLI.
The README is explicit about the split between reading and writing. Real-time conversation log viewing, session history browsing and Git operations are implemented independently of the Agent SDK. Chat sending, session resuming, permission approval and AskUserQuestion are the parts that touch the SDK, and those are opt-in. That distinction decides whether the tool is a viewer or a full client for you.
How the server, session logs and terminal fit together
The package ships a single binary entry, claude-code-viewer, mapped to ./dist/main.js in package.json. The backend is TypeScript run under Node, the frontend is built with Vite, and the two are bundled by tsdown and a build script. At runtime the server reads the Claude directory (configurable with --claude-dir), renders sessions, and streams updates to the browser over SSE. The terminal panel is a separate WebSocket, which is why the documented reverse proxy config turns off buffering and forwards Upgrade headers.
Persistence is local. The Dockerfile copies node_modules and dist into the runner image, and docker-compose.yml mounts a workspace volume plus a commented-out claude_home volume. Nothing in the README describes a hosted service or a database you have to run, so the session data stays in the Claude directory you point it at. The README positions the tool as a persistent server you reach from a phone, and it is a PWA, so on mobile you add it to the home screen and get push notifications when sessions complete.
Installing Claude Code Viewer and opening a first session
The README gives two install paths. The quickest runs the published package without installing anything. Node.js 22.13.0 or later is required, and macOS or Linux only, since Windows is not supported.
npx @kimuson/claude-code-viewer@latest --port 3400The server starts on port 3400 (the default when you omit --port is 3000). Open http://localhost:3400 and the interface loads. If you prefer a global install, the README shows the equivalent pair of commands:
npm install -g @kimuson/claude-code-viewer
claude-code-viewer --port 3400On first launch you pick an authentication mode. API Key is the default and enables every feature, including chat sending. Subscription opts out of the Agent SDK chat features; the chat input becomes a copy mode where you fill in session options and press Copy to get the equivalent claude CLI command, then paste it into a terminal. The built-in terminal panel at the bottom of the screen is one place to paste it.
To expose the server to another device, bind it to all interfaces and set a password:
claude-code-viewer --hostname 0.0.0.0 --port 3400 --password your-secretBehind a URL prefix, --base-path (or the CCV_BASE_PATH environment variable) rewrites the UI, API, SSE connection, terminal WebSocket, auth cookies, PWA manifest and service worker to that prefix. Nested segments such as /tools/ccv are accepted; values containing traversal segments, backslashes, query strings, fragments, spaces or percent-encoding are rejected.
The Agent SDK boundary is the real constraint
The README carries a warning that as of April 2026 Anthropic's Terms of Service prohibit using the Agent SDK to send chat messages with a subscription account, and that the boundary between permitted and prohibited personal use remains ambiguous. The project's response was to make chat sending, session resuming, permission approval and AskUserQuestion opt-in. That is a design decision driven by licensing, not by capability, and it means the feature set you get depends on a choice you make on first launch.
Two consequences follow. First, a subscription user cannot send messages from the web UI at all; the workflow becomes copy a command, run it elsewhere, watch the log stream here. Second, if you later switch modes, the parts of the interface that depend on the SDK change with it. The README does not describe a migration path between modes or what happens to in-flight sessions, so treat the first-launch choice as close to permanent until you verify otherwise.
There are smaller constraints too. Windows is unsupported. The base path validator rejects percent-encoded values, which will surprise anyone whose reverse proxy normalizes URLs before forwarding. And the docker-compose file references CCV_PASSWORD, ANTHROPIC_BASE_URL, ANTHROPIC_API_KEY and ANTHROPIC_AUTH_TOKEN from the host environment; if those are unset, the container starts with empty values.
Claude Code Viewer compared with plain claude and third-party UIs
The obvious alternative is the claude CLI itself. It is the source of truth for sessions, it runs anywhere Node runs, and it has no authentication-mode split because it is the first-party client. What it does not give you is a browsable history across projects, a mobile-friendly view, or a way to watch a running session from another device. Claude Code Viewer is a layer over the same logs, so the two are complementary rather than competing: the README even tells subscription users to start the session in the CLI and watch it here.
The other category is third-party web front ends for Claude Code. The difference in approach is what they read. A front end that drives the SDK owns the conversation and needs API credentials to do anything useful. Claude Code Viewer reads the Claude directory and renders what is already there, which is why log viewing, history browsing and Git operations keep working regardless of authentication mode. That is the trade-off: less control over the conversation, more durability for the record of it.
Licence and upgrade cost
The package is MIT licensed, and the repository carries a LICENSE file and a PRIVACY.md. MIT is permissive: you can use, modify and redistribute the code, and the licence text must travel with copies. That is a statement about the licence, not legal advice about your situation, and the Terms of Service question around Agent SDK chat sending sits outside the licence entirely.
Upgrade cost is low but not zero. Releases are frequent (v0.8.0, v0.8.1 and v0.8.2 all landed within about a week in August 2026), and the last push to main was on 2026-08-18. There is a CHANGELOG.md at the repository root, which is where you should look before bumping. The runtime dependencies are narrow (@anthropic-ai/claude-code and @replit/ruspty), so a version bump mostly means a new frontend bundle and server build. If you run it under Docker, note that the compose file pins no image tag; it builds from the Dockerfile in the repository, so an upgrade means rebuilding rather than pulling.
Editorial conclusion
Adopt Claude Code Viewer if you want to read and resume Claude Code sessions from a browser, especially on an always-on machine reached over Tailscale, and you are comfortable with the Agent SDK boundary described in the README. Do not adopt it if you need Windows support or if you expect subscription-based chat sending to work out of the box, because the README makes those features opt-in. Before installing, check Node.js 22.13.0 or later and Claude Code v1.0.125 or later, then decide whether you are running API key or subscription mode, since that choice determines whether the chat input sends messages or only copies a CLI command.
Frequently asked questions
What is Claude Code Viewer used for?
It is a web-based Claude Code client for browsing and managing Claude Code projects: starting conversations, resuming sessions, monitoring running tasks and reading history. The README describes it as focused on comprehensive session log analysis, and read-oriented features work regardless of authentication mode.
Can Claude Code Viewer see your screen?
No. The README and repository files describe a browser client that reads the Claude directory and renders session logs; nothing there mentions screen capture or screen access.
What is Claude Code?
The README treats Claude Code as the underlying CLI whose sessions this project displays, and lists it as a system requirement at v1.0.125 or later. Claude Code Viewer reads the session logs that CLI writes and can launch it in a built-in terminal.
Does Claude Code Viewer support Windows?
No. The system requirements list macOS and Linux, and state that Windows is not supported. Node.js 22.13.0 or later and Claude Code v1.0.125 or later are also required.
How do I install Claude Code Viewer?
The README gives a quick start with npx @kimuson/claude-code-viewer@latest --port 3400, or a global install with npm install -g @kimuson/claude-code-viewer followed by claude-code-viewer --port 3400. The server then serves the interface on that port.
Community notes