Claude Code plugin that records your project's development history as a session-lane timeline: decisions, actions and merges judged by the LLM, every prompt captured, zero dependencies.
JavaScript
0
20 commits
updated Sep 17, 2026
Your project's development history, as a timeline.
session-trail is a Claude Code plugin that records what actually happened in a project (sessions, decisions, completed work, and the files they touched) and renders it as an interactive left-to-right timeline.
It looks like a git graph, but the branches and merges aren't git commands: they're judgment calls recorded by the LLM as it works. Each Claude Code session becomes a lane; significant decisions and actions become nodes on that lane; work that continues an earlier session's line becomes a merge edge across lanes.

session-trail captures history three ways, layered so you get a useful timeline even if you never think about it:
title / what / why / how, with why required to include the rejected alternatives) and records it. The main agent only judges significance; the scribe does the writing in the background, so the conversation is never slowed down.The prompt ticks matter: they are the mechanical, complete record of what you asked, independent of the LLM's judgment. Click a tick to read the prompt; together with the session id and transcript path shown on every node, a person or another agent can always get back to the original conversation.
Every node carries its artifacts: the files created or modified around that point, attached automatically. Click a node to see what/why/how and the artifact list, with inline file preview.

Code-graph tools remember what the code looks like right now: functions, calls, dependencies. session-trail remembers why it got that way: sessions, decisions, rejected alternatives, and the words that asked for them. The two answer different questions and run side by side in the same session without stepping on each other. What session-trail adds:
why, is asked for the rejected alternatives, and is bound automatically to its time, session, and touched files./plugin marketplace add jsk4581/session-trail
/plugin install session-trail@session-trail
Requires Node.js ≥ 18 (for the hooks, CLI, and viewer server). Zero npm dependencies.
| Command | What it does |
|---|---|
/session-trail:view | Start the timeline viewer and get its URL |
/session-trail:note <what happened> | Manually record a milestone |
The viewer: scroll to zoom, drag to pan, double-click to fit, click a node to open its detail card. Long idle gaps are compressed (· 3 days ·) so months of history fit on one screen. Filter chips toggle decision/action/merge/auto nodes and the faint prompt ticks (every user message).
Everything also works without Claude Code:
node bin/session-trail.mjs add # append a milestone (JSON on stdin)
node bin/session-trail.mjs recent # list recent nodes [--n 10] [--session last|<sid>]
node bin/session-trail.mjs show <id> # one node in full: what/why/how, artifacts, session, merges
node bin/session-trail.mjs why <path> # milestones that touched a file or directory
node bin/session-trail.mjs search <text> # search milestones and recorded prompts
node bin/session-trail.mjs serve # start the viewer [--host] [--port]
node bin/session-trail.mjs build # force-rebuild the graph cache
node bin/session-trail.mjs doctor # sanity-check the installation
All data lives in .session-trail/ inside your project: a single append-only events.jsonl plus a derived graph cache. Nothing leaves your machine.
.session-trail/ to share the timeline with your team, orNote that events.jsonl contains your prompts verbatim (truncated at 2000 characters). Check it before committing the directory to a shared repository.
The viewer binds 127.0.0.1 by default and gates data endpoints behind a per-start token. To serve on another interface (e.g. to view from a different machine), pass --host <address>; the token still applies.
events.jsonl is the single source of truth; the graph is a pure reduction over it (safe under concurrent sessions: appends only, ordered by timestamp).
| Event | Written by | Meaning |
|---|---|---|
session | SessionStart hook | new lane |
title | Stop hook | session title backfill |
touch | PostToolUse hook | file created/edited |
prompt | UserPromptSubmit hook | every user message (shown as faint lane ticks) |
milestone | the LLM (or you, or the safety net) | decision / action / merge node |
session_end | SessionEnd hook | lane closed |
MIT
20 commits
JavaScript
85.3%
CSS
8.2%
HTML
3.8%
Shell
2.7%
Claude Code plugin that records your project's development history as a session-lane timeline: decisions, actions and merges judged by the LLM, every prompt captured, zero dependencies.
JavaScript
0
20 commits
updated Sep 17, 2026
Your project's development history, as a timeline.
session-trail is a Claude Code plugin that records what actually happened in a project (sessions, decisions, completed work, and the files they touched) and renders it as an interactive left-to-right timeline.
It looks like a git graph, but the branches and merges aren't git commands: they're judgment calls recorded by the LLM as it works. Each Claude Code session becomes a lane; significant decisions and actions become nodes on that lane; work that continues an earlier session's line becomes a merge edge across lanes.

session-trail captures history three ways, layered so you get a useful timeline even if you never think about it:
title / what / why / how, with why required to include the rejected alternatives) and records it. The main agent only judges significance; the scribe does the writing in the background, so the conversation is never slowed down.The prompt ticks matter: they are the mechanical, complete record of what you asked, independent of the LLM's judgment. Click a tick to read the prompt; together with the session id and transcript path shown on every node, a person or another agent can always get back to the original conversation.
Every node carries its artifacts: the files created or modified around that point, attached automatically. Click a node to see what/why/how and the artifact list, with inline file preview.

Code-graph tools remember what the code looks like right now: functions, calls, dependencies. session-trail remembers why it got that way: sessions, decisions, rejected alternatives, and the words that asked for them. The two answer different questions and run side by side in the same session without stepping on each other. What session-trail adds:
why, is asked for the rejected alternatives, and is bound automatically to its time, session, and touched files./plugin marketplace add jsk4581/session-trail
/plugin install session-trail@session-trail
Requires Node.js ≥ 18 (for the hooks, CLI, and viewer server). Zero npm dependencies.
| Command | What it does |
|---|---|
/session-trail:view | Start the timeline viewer and get its URL |
/session-trail:note <what happened> | Manually record a milestone |
The viewer: scroll to zoom, drag to pan, double-click to fit, click a node to open its detail card. Long idle gaps are compressed (· 3 days ·) so months of history fit on one screen. Filter chips toggle decision/action/merge/auto nodes and the faint prompt ticks (every user message).
Everything also works without Claude Code:
node bin/session-trail.mjs add # append a milestone (JSON on stdin)
node bin/session-trail.mjs recent # list recent nodes [--n 10] [--session last|<sid>]
node bin/session-trail.mjs show <id> # one node in full: what/why/how, artifacts, session, merges
node bin/session-trail.mjs why <path> # milestones that touched a file or directory
node bin/session-trail.mjs search <text> # search milestones and recorded prompts
node bin/session-trail.mjs serve # start the viewer [--host] [--port]
node bin/session-trail.mjs build # force-rebuild the graph cache
node bin/session-trail.mjs doctor # sanity-check the installation
All data lives in .session-trail/ inside your project: a single append-only events.jsonl plus a derived graph cache. Nothing leaves your machine.
.session-trail/ to share the timeline with your team, orNote that events.jsonl contains your prompts verbatim (truncated at 2000 characters). Check it before committing the directory to a shared repository.
The viewer binds 127.0.0.1 by default and gates data endpoints behind a per-start token. To serve on another interface (e.g. to view from a different machine), pass --host <address>; the token still applies.
events.jsonl is the single source of truth; the graph is a pure reduction over it (safe under concurrent sessions: appends only, ordered by timestamp).
| Event | Written by | Meaning |
|---|---|---|
session | SessionStart hook | new lane |
title | Stop hook | session title backfill |
touch | PostToolUse hook | file created/edited |
prompt | UserPromptSubmit hook | every user message (shown as faint lane ticks) |
milestone | the LLM (or you, or the safety net) | decision / action / merge node |
session_end | SessionEnd hook | lane closed |
MIT
20 commits
JavaScript
85.3%
CSS
8.2%
HTML
3.8%
Shell
2.7%