My dashboard always knew my Claude Code sessions existed — title, project, token count, date — but it never showed what was actually said. The full conversation was sitting on disk the whole time as JSONL. So I built two routes: one reads any session into a clean, parsed thread in the browser; the other reaches back into the terminal and resumes it. Three buttons, one click — and a dead session from three days ago picks up exactly where it stopped.
Claude Code sessions die the moment you close the terminal. My dashboard listed each one — title, project, token count, timestamp — but never the actual back-and-forth. The frustrating part: the whole transcript was on disk the entire time, sitting in ~/.claude/projects as line-delimited JSON. The UI just never read it. EP.16 already mines those same JSONL files for episode ideas — this time I wanted to read one live, in the browser, and walk back into it.
/api/sessions/transcript opens the real ~/.claude/projects/<project>/<session>.jsonl, parses every message and tool call into structured turns, and returns JSON the drawer renders. It's injection-guarded on purpose: old session content is data, never instructions — every byte is escaped and displayed, never executed. And the tool calls render visibly, not collapsed, so you watch the AI think, not just read its prose.
/api/sessions/resume spins up a git worktree and runs claude --resume <session-id> — launched straight from the browser button. Click a session from three days ago and the terminal opens mid-thread. Three buttons live in the drawer: Resume in terminal (continuity), Copy resume cmd (paste it yourself), and Load full conversation (the reading angle) — both jobs, one surface.
Straight about the trade: the transcript route is read-only and injection-guarded, so it's harmless. The resume route is the opposite — it runs a real claude --resume on my machine. That's powerful, so it stays local-only, behind localhost, gated to my own session ids, never opened to the internet. A web button that reaches into your shell is a great feature and a terrible thing to leave public.
Four outputs from the build: the session drawer with all three buttons, a fully loaded conversation with tool calls rendered, the JSONL-to-parsed path diagram, and the terminal resuming mid-thread after one browser click. Tap any image to enlarge it and read the exact prompt that drew it.




The loop closes. One click opens any past session in the browser, reads it whole — tool calls and all — and resumes it in the terminal. The AI's own work history is now searchable, readable, and continuable from the same surface it ships from. Sessions stopped being disposable the moment the dashboard learned to read them.
Sixty seconds: a dead session drawer that only showed metadata, the read-only transcript route that parses the raw JSONL into a readable thread, the resume route that reaches into the terminal, and one click that reopens a conversation from three days ago exactly where it stopped.
The read-only transcript route (injection-guarded), the JSONL-to-turns parser, the resume launcher, and a demo that runs on synthetic sessions so you never expose your own logs. Everything in this episode is free and open — clone it, run it, make it yours. Repo lands shortly — buttons go live the moment it's public.
gh repo clone tellingtechnology/claude-session-bridge ~/claude-session-bridge && cd ~/claude-session-bridge && cat README.md
No GitHub? Comment RESUME on the post and the bot DMs you the repo the moment it's public.
This resume button shipped without the live dashboard flickering once. Next: the staging-first workflow behind it — 3002 for dev, 3001 for prod. I build risky changes on the dev server, watch them run, then promote to prod instead of rebuilding. The live view never breaks mid-edit.