Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

TermHerd

A terminal workspace for your Claude Code sessions — browse them, launch them, arrange them in tabs and splits, watch which one needs you, and let a session drive the workspace it runs in.

It is a native Rust desktop app (macOS, Windows, Linux — all three first-class), keyboard-driven, built around a real PTY terminal per session.

cargo run -p termherd-app     # or install a release build — see Installation

What it is not

Not an IDE. TermHerd deliberately does not emulate an editor and does not register in ~/.claude/ide: Claude keeps using the editor you already configured. Dropping IDE emulation is what keeps the product a workspace — the hardest, largest surface (an in-app diff panel) left the critical path, and what remains is the capability that actually earns its keep: multiplexing many sessions on one screen.

Not a replacement for your shell. A tab can be a Claude session or a plain shell, and they behave identically. TermHerd arranges terminals; it does not try to be one you have to relearn.

What makes it different

It reads Claude’s own files, and never writes to them. Sessions come from walking ~/.claude/projects. Your stars, custom titles, archives and the repositories you added by hand live in an overlay at ~/.termherd/metadata.json — TermHerd never writes under ~/.claude. Run it beside another session manager if you want; nothing it does is destructive to the CLI’s own state.

It knows which session needs you. Every session carries an activity status — starting, busy, idle, attention, exited — folded from what the terminal says about itself: Claude’s OSC title stream, and for a plain shell an OSC 133 shell-integration snippet TermHerd injects at spawn. The status drives tab badges, the close confirmation, and the MCP wait tool. It is not a heuristic on top of output text.

A session can drive the workspace it lives in. A Claude session launched from TermHerd gets an in-process MCP server wired into its config at spawn — no setup. It can read the whole workspace, open and split panes, type into other sessions, wait for one to go idle, screenshot the window, put a repository in the sidebar, and press TermHerd’s own key chords. That loop is what lets an agent verify a change instead of only proposing one.

The quality bar is the reason it exists. TermHerd is a replatform of an Electron app, and the rewrite is scoped by a fixed list of defects it must fix by construction: a headless, pure domain core (core::App::apply(Event) -> Vec<Effect>), a hexagonal crate graph where adapters depend on the core and never the reverse, one actor per session instead of shared mutable state, typed errors with unwrap/panic clippy-denied in the domain crates, one logging stack, and CI gates that block a merge. See Architecture at a glance.

Where to go next

You want to…Read
Get it runningInstallation → Quick start
Learn the workspaceThe sidebar, Tabs and splits
Look up a keyKeyboard shortcuts
Change a settingsettings.json
Let an agent drive itDriving termherd over MCP
Understand how it’s builtArchitecture at a glance

This book documents shipped behaviour. Where a feature is partial, the page says so rather than describing an interface that does not exist yet. The authoritative status of every feature is ROADMAP.md.