Files
session-viewer/README.md
teernisse b030734915 Add comprehensive README with architecture and usage docs
Introduce a README covering the full project: quick start,
feature inventory (session navigation, message display, search,
filtering, redaction, export), architecture overview with
directory layout, tech stack table, API endpoint reference,
npm scripts, environment variables, and security properties.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-30 10:42:35 -05:00

6.1 KiB

Session Viewer

Browse, filter, redact, and export Claude Code sessions as self-contained HTML files.

Session Viewer reads session data from ~/.claude/projects/ and presents it in a dark-themed web interface with full-text search, message filtering, sensitive data redaction, and one-click HTML export.

Quick Start

# Install dependencies
npm install

# Run in development mode (starts both server and client with hot reload)
npm run dev

# Or run from the CLI entry point (opens browser automatically)
node bin/session-viewer.js

The API server runs on http://localhost:3848 and the Vite dev server on http://localhost:3847 (proxying API requests to the backend).

Features

Session Navigation

  • Project grouping -- Sessions are organized by their originating project directory.
  • Session metadata -- Each session displays its summary, first prompt, message count, duration, and last-modified date.
  • Sorted by recency -- Most recently modified sessions appear first.

Message Display

  • Nine message categories -- user_message, assistant_text, thinking, tool_call, tool_result, system_message, hook_progress, file_snapshot, and summary, each with a distinct color indicator.
  • Collapsible sections -- Thinking blocks, tool calls, and tool results collapse by default to reduce noise.
  • Diff rendering -- Git-style diffs are auto-detected and rendered with line-level syntax coloring.
  • Code blocks -- Fenced code blocks display a language label and a copy-to-clipboard button.
  • Time gap indicators -- Gaps of more than five minutes between messages are shown as labeled dividers.
  • Hash anchor links -- Each message has a copyable anchor link (#msg-{uuid}) for deep linking.
  • Full-text search across message content and tool input.
  • Match cycling -- Navigate between matches with Enter/Shift+Enter or Ctrl+G/Ctrl+Shift+G.
  • Match counter -- Displays current position and total matches (e.g., "3/12").
  • Minimap -- A scrollbar overlay shows match positions as yellow ticks with a viewport indicator. Click a tick to jump to that match.
  • Dimming -- Non-matching messages are visually dimmed while search is active.
  • Keyboard shortcut -- Press / to focus the search bar; Escape to clear and blur.

Filtering

  • Category toggles -- Show or hide any of the nine message categories. Thinking and hook progress are hidden by default.
  • Filters compose with search -- Category filters and search operate independently.

Redaction

  • Manual redaction -- Click the eye icon on any message to select it, then confirm to redact. Redacted messages are replaced by a visual divider.
  • Auto-redaction -- Toggle automatic detection of sensitive data (API keys, tokens, secrets, PII) using 37 regex patterns derived from gitleaks. Matching content is replaced with [REDACTED] inline.
  • Export-aware -- Both manual and auto-redaction states are respected during export.

Export

  • Self-contained HTML -- Export the current session view as a standalone HTML file with embedded CSS and syntax highlighting.
  • Respects filters -- The export includes only visible messages and applies the current redaction state.
  • Clean filenames -- Output files are named session-{id}.html with sanitized IDs.

Architecture

src/
  client/          React + Vite frontend
    components/    UI components (SessionList, SessionViewer, MessageBubble, etc.)
    hooks/         useSession, useFilters
    lib/           Markdown rendering, sensitive redactor, types, utilities
    styles/        CSS custom properties, Tailwind, design tokens
  server/          Express backend
    routes/        /api/sessions, /api/export
    services/      Session discovery, JSONL parser, HTML exporter
  shared/          Types shared between client and server
bin/               CLI entry point
tests/
  unit/            Vitest unit tests
  e2e/             Playwright end-to-end tests
  fixtures/        Test data

Tech Stack

Layer Technology
Frontend React 18, Tailwind CSS, Vite
Backend Express 4, Node.js
Markdown marked + marked-highlight + highlight.js
Testing Vitest (unit), Playwright (e2e)
Language TypeScript (strict mode)

API Endpoints

Method Path Description
GET /api/health Health check
GET /api/sessions List all sessions (30s server cache)
GET /api/sessions/:id Get session detail with parsed messages
POST /api/export Generate self-contained HTML export

Scripts

Script Description
npm run dev Start server + client with hot reload
npm run build TypeScript compile + Vite production build
npm run test Run unit tests (Vitest)
npm run test:e2e Run end-to-end tests (Playwright)
npm run typecheck TypeScript type checking
npm run lint ESLint

Configuration

Variable Default Description
PORT 3848 API server port
SESSION_VIEWER_OPEN_BROWSER unset Set to 1 to auto-open browser on start

Security

  • Path traversal protection -- Session discovery validates all paths stay within ~/.claude/projects/.
  • HTML escaping -- All user content is escaped before interpolation in exports.
  • Filename sanitization -- Export filenames strip non-alphanumeric characters.
  • Localhost binding -- Both the API server and Vite dev server bind to 127.0.0.1 only.