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