Skip to content

xd00099/drydock

Repository files navigation

Drydock

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

Features

  • 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 --resume in 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.

How it works

~/.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.

Requirements

  • macOS (Apple Silicon or Intel)
  • Claude Code installed and on your PATH
  • To build from source: Rust (stable) and Node 18+

Build from source

git clone https://github.com/xd00099/drydock.git
cd drydock
npm install
npm run tauri build

The 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.

Usage

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.

Custom model backends

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 (default sonnet; set to null to use your CLI's own default, e.g. on Bedrock/LiteLLM where the sonnet alias 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.

Data & privacy

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.

Roadmap

  • 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.

License

MIT

About

a better terminal for claude code session management

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors