A native terminal for managing your Claude Code sessions — search your whole history, see what's running, and resume any session right where you left off.
Claude Code saves every session as a transcript on disk, but once you have dozens of them scattered across projects and terminal windows, they're easy to lose track of. Drydock is a dedicated terminal app that indexes all of them: search your entire history (semantically, on-device), see which sessions are live in any terminal, and resume any one in its original directory — with an AI-generated briefing of where you left off.
Drydock never wraps the claude binary and never writes inside ~/.claude. It reads your transcripts, hosts real terminals, and keeps a local index. Nothing leaves your machine.
macOS · built with Rust + Tauri · MIT licensed
- Full-history search (⌘K) — keyword and semantic search across every session, English and Chinese, computed locally with an on-device embedding model. Filter with
proj:,starred:,live:. - Cross-project session radar — a sidebar of every session grouped by project, with live 🟢/🟡 indicators for what's running in any terminal (not just Drydock), read from Claude Code's own session registry.
- One-click resume — relaunches
claude --resumein the session's original working directory. Sessions already live elsewhere open as a read-only live transcript instead. - Briefing cards — an optional AI summary and timeline of each session (generated by your own
claude -p): a concise title, plus the milestones leading up to what you were last doing. The summary also becomes the session's display title, so a list of cryptic first-lines turns into readable names. - Preview tabs & a Starred section — browse without clutter (a single preview tab until you engage), and keep important sessions in a dedicated Starred section at the top (star from the briefing panel or the right-click menu).
- A real terminal — xterm.js over a PTY, with full input-method support (works with pinyin and other IMEs). Session tabs and shell tabs live in separate rows; each session gets a stable color (hashed from its id) shared with its sidebar entry, and plain shells are named after their live working directory.
~/.claude (read-only) Drydock (Rust + Tauri)
projects/*/*.jsonl ──watch──► local SQLite mirror
sessions/<pid>.json ──poll───► (sessions · chunks · FTS · embeddings)
PTY host · search · briefing
│ Tauri IPC
React UI: sidebar · ⌘K · tabs · briefing
Drydock is a read-only mirror. A file watcher tails your transcripts into a local SQLite database (full-text index + vector embeddings), and a short poll of Claude Code's live-session registry powers the radar. It hosts PTYs so tabs are real terminals, but it never intercepts or wraps the claude CLI. Delete the index anytime — it rebuilds itself from ~/.claude.
- macOS (Apple Silicon or Intel)
- Claude Code installed and on your
PATH - To build from source: Rust (stable) and Node 18+
git clone https://github.com/xd00099/drydock.git
cd drydock
npm install
npm run tauri buildThe bundle is written to target/release/bundle/macos/Drydock.app. It's unsigned, so on first launch right-click the app → Open. For development, use npm run tauri dev.
| Shortcut | Action |
|---|---|
| ⌘K | Search all sessions |
| ⌘F | Find within the active session (prev/next jumps to each match; Esc closes) |
| ⌘T | New shell tab |
| ⌘W | Close the active tab |
| ⌘D | Star / unstar the active session |
⌘F searches in place. In a live Claude session it overlays that session's full conversation (Claude runs fullscreen, so the terminal itself keeps no scrollback) and Esc returns you to the live terminal; in a plain shell it searches the terminal's own scrollback.
Click a session in the sidebar to preview it; start typing in the terminal (or scroll a transcript) to keep the tab. Resuming an ended session reopens it in its original directory; a session that's live in another terminal opens read-only.
Drydock calls your own claude binary, so it inherits whatever backend you've configured — Anthropic, an OpenAI-compatible/LiteLLM proxy, or AWS Bedrock. Two things are configurable via an optional settings.json in the app data directory (~/Library/Application Support/com.drydock.app/settings.json):
{
"card_model": "sonnet",
"claude_env": { "ANTHROPIC_BASE_URL": "http://localhost:4000" }
}card_model— model used for briefing cards (defaultsonnet; set tonullto use your CLI's own default, e.g. on Bedrock/LiteLLM where thesonnetalias may not resolve).claude_env— environment variables injected into every process Drydock spawns (terminal tabs and card generation). Handy when your endpoint is configured only in~/.zshrc, which a non-interactive login shell doesn't source.
Changes apply to new tabs and the next card without restarting.
Everything stays local. Drydock reads ~/.claude (and never writes to it), stores its index under ~/Library/Application Support/com.drydock.app/, and runs embeddings on-device. The only network calls are briefing cards, which go through your own claude CLI to whatever backend you've configured. Retention follows Claude Code's own cleanup: when Claude Code deletes a transcript, the session leaves Drydock too.
- Hooks-based live status (replace the registry poll)
- Search-result card previews on hover
- Subagent (sidechain) transcript indexing
- Windows / Linux support
Contributions welcome — open an issue or a pull request.