the session manager for coding agents

Every chat you've had.
One terminal. Searchable.

ThreadHop indexes every coding-agent transcript on your machine — Claude Code, Codex, OpenCode, pi, Cursor, Antigravity, Gemini CLI — into one local SQLite store, searches them in milliseconds, and lets any session borrow another's context with a single ticket.

macOS · SQLite + FTS5 · MIT — manual install →
reads transcripts fromClaude CodeCodexOpenCodepiCursorAntigravityGemini CLI
7
agent CLIs read
1
local SQLite index
0
bytes leave your machine
201
tests passing
the tui, over real transcripts — click a sessionthreadhop v0.4 · ~/.config/threadhop/sessions.db
youpull the text-rendering decision from my gpui chat and apply it to the vim cursor
claudeBorrowing context from gpui text rendering (codex) — no LLM call, just the ticket.
!threadhop prepare --session 2c9e04b1 ✓ ticket tk_1a2b3c4d · 1 haiku call · head summarised, last 3 exchanges verbatim paste in the target chat: !threadhop receive tk_1a2b3c4d
claudeGot it. Decisions carried over: subpixel positioning stays on; glyph atlas is per-scale-factor; cursor is drawn in the same pass as selections. Updating crates/vim/src/cursor.rs now.
reply · Enter send · Alt+Enter newlineclaude -p --resume
/ searchb bookmarksB kanbans statusm selecty copyt theme? help
01

Search everything you ever said to an agent.

Every transcript on the machine is indexed into one SQLite FTS5 table as it changes. Press /, type, and results jump you to the exact message — across projects, across agents, in milliseconds.

/ retry backoff 12 hits · 4 sessions
~/oss/astro · codex · 9h
…the glob loader needs exponential backoff on EBUSY, not a fixed retry
~/oss/zed · claude · 3d
…rust-analyzer retry: keep the old server id until initialized lands…
02

Borrow context. Don't re-explain it.

One chat already worked it out. prepare freezes that session into a ticket — a short summary of the head plus the last exchanges verbatim. receive pastes it into any other chat, on any other agent. Reading a ticket costs zero LLM calls.

!threadhop prepare --session 2c9e04b1
✓ tk_1a2b3c4d · head summarised · last 3 exchanges verbatim
!threadhop receive tk_1a2b3c4d
→ 41 lines into the current chat · 0 LLM calls
03

Mark what matters.

Select a message or a range, then copy it with source labels, export it, or bookmark it — as a keeper or a research follow-up. Every session carries a status, and the board shows them as columns.

in_progress

vim mode: dot-repeat
gpui text rendering
content layer caching

in_review

lsp restart flakiness
f-string lexer rewrite

done

view transitions bug
rule docs generator
14 bookmarks · 6 research
04

Lives where you already work.

Nothing to switch to. From inside any agent chat, !threadhop … runs instantly with no model turn, and the plugin adds /threadhop:* slash commands. The TUI is there when you want the whole picture.

!threadhop tag in_review
✓ tagged 7f3a91c2 as in_review
/threadhop:bookmark --note "cursor pass decision"
✓ bookmarked · kind=bookmark
05

Nothing leaves the machine.

Transcripts are read in place from each agent's own folder. The index, bookmarks and tickets live in ~/.config/threadhop. No server, no account, no telemetry. The only network call is the one you asked your agent to make.

~/.config/threadhop/sessions.dbsqlite · fts5
~/.config/threadhop/transfers/tickets
~/.claude/projects · ~/.codex/sessions · …read only

Give your sessions a memory.

One command. Your agents keep working exactly as they do — ThreadHop just reads what they write down.

then: /plugin marketplace add parzival1l/threadhop