Skip to content

go-session

go-session parses Claude Code JSONL session transcripts into structured event arrays, computes per-tool analytics, renders self-contained HTML timelines with client-side search, and generates VHS tape scripts for MP4 video output. It has no external runtime dependencies -- stdlib only.

Module path: forge.lthn.ai/core/go-session Go version: 1.26 Licence: EUPL-1.2

Quick Start

import "forge.lthn.ai/core/go-session"

// Parse a single session file
sess, stats, err := session.ParseTranscript("/path/to/session.jsonl")

// Or parse from any io.Reader (streaming, in-memory, HTTP body, etc.)
sess, stats, err := session.ParseTranscriptReader(reader, "my-session-id")

// Compute analytics
analytics := session.Analyse(sess)
fmt.Println(session.FormatAnalytics(analytics))

// Render an interactive HTML timeline
err = session.RenderHTML(sess, "timeline.html")

// Search across all sessions in a directory
results, err := session.Search("~/.claude/projects/my-project", "git commit")

// List sessions (newest first)
sessions, err := session.ListSessions("~/.claude/projects/my-project")

// Prune old sessions
deleted, err := session.PruneSessions("~/.claude/projects/my-project", 30*24*time.Hour)

Package Layout

The entire package lives in a single Go package (session) with five source files:

File Purpose
parser.go Core types (Event, Session, ParseStats), JSONL parsing (ParseTranscript, ParseTranscriptReader), session listing (ListSessions, ListSessionsSeq), pruning (PruneSessions), fetching (FetchSession), tool input extraction
analytics.go SessionAnalytics type, Analyse (pure computation), FormatAnalytics (CLI-friendly text output)
html.go RenderHTML -- self-contained dark-theme HTML timeline with collapsible panels, search, and XSS protection
video.go RenderMP4 -- VHS tape script generation and invocation for MP4 video output
search.go Search and SearchSeq -- case-insensitive cross-session search over tool call inputs and outputs

Test files mirror the source files (parser_test.go, analytics_test.go, html_test.go, video_test.go, search_test.go) plus bench_test.go for benchmarks.

Dependencies

Dependency Scope Purpose
Go standard library Runtime All parsing, HTML rendering, file I/O, JSON decoding
github.com/stretchr/testify Test only Assertions and requirements in test files
vhs (charmbracelet) Optional external binary Required only by RenderMP4 for MP4 video generation

The package has zero runtime dependencies beyond the Go standard library. testify is fetched automatically by go test and is never imported outside test files.

Supported Tool Types

The parser recognises the following Claude Code tool types and formats their input for human readability:

Tool Input format Example
Bash command # description ls -la # list files
Read file_path /tmp/main.go
Edit file_path (edit) /tmp/main.go (edit)
Write file_path (N bytes) /tmp/out.txt (42 bytes)
Grep /pattern/ in path /TODO/ in /src
Glob pattern **/*.go
Task [subagent_type] description [research] Code review
Any other (MCP tools, etc.) Sorted top-level JSON keys body, repo, title

Unknown tools (including MCP tools like mcp__forge__create_issue) are handled gracefully by extracting and sorting the JSON field names from the raw input.

Iterator Support

Several functions offer both slice-returning and iterator-based variants, using Go's iter.Seq type:

Slice variant Iterator variant Description
ListSessions() ListSessionsSeq() Enumerate sessions in a directory
Search() SearchSeq() Search across sessions
-- Session.EventsSeq() Iterate over events in a session

The iterator variants avoid allocating the full result slice upfront and support early termination via break or return in range loops.

Further Reading

  • Architecture -- JSONL format, parsing pipeline, event model, analytics, HTML rendering, XSS protection, data flow
  • Development Guide -- Prerequisites, build commands, test patterns, coding standards, how to add new tool types
  • Project History -- Completed phases, known limitations, future considerations