tmux-ide
The terminal that understands your agents.
Other tools rebuild the terminal to understand agents. tmux-ide teaches the terminal you already use to understand them. One command adds a native chrome to any tmux session: a fleet of tabs with live agent-status glyphs, ground-truth working/blocked/done detection, notifications when an agent needs you, and a crash-proof restore that rebuilds your whole fleet — including your Claude conversations. It's built around tmux, so there's nothing to migrate and nothing to lock into.
Install
npm install -g tmux-ide
Global install also registers the bundled Claude Code skill and enables CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1 in ~/.claude/settings.json if Claude Code is installed locally.
Quick start
tmux-ide adopt work # add the dock to a session you already have
tmux-ide integration install claude # ground-truth agent status via Claude Code hooks
tmux-ide events --follow # stream agent-status transitions
tmux-ide unadopt work # revert — it was only tmux options
adopt is purely additive tmux configuration. If tmux-ide ever crashes or is uninstalled, your sessions keep running as ordinary tmux — no wrapper process, no lock-in. And because the chrome lives server-side, it renders from any client, including over SSH.
The three-beat story
Adopt in place. tmux-ide adopt <session> drops a status bar onto any existing session: clickable fleet tabs, per-agent glyphs, and [ ⌂ home ] [ ⧉ switch ] [ ? keys ] triggers.
Know your fleet. Install the Claude Code integration and working/blocked/done come from the agent's own lifecycle. A toast fires on every attached client the moment an agent goes blocked or done; per-pane border chips read claude · working. Any agent can self-report with one pane option:
tmux set-option -p @agent_state "working:$(date +%s)"
Survive anything. Continuous snapshots mean a tmux server death isn't a lost afternoon. tmux-ide restore rebuilds every session, window, layout, cwd, and title; --resume-agents revives your Claude conversations from their recorded session ids.
Teams of any agents
Run a heterogeneous fleet — Claude Code, codex, cursor-agent, aider, anything — in one set of sessions, and let them coordinate. Every agent's status is on a shared bus every other agent can read; one agent can task another by typing into its prompt; and any agent can block until a teammate finishes. It's agent-agnostic by design: Claude Code reports automatically, everyone else self-reports with a one-line pane option.
tmux-ide team --json # read the fleet's status
tmux-ide send %2 "implement /login, then run the tests" # task another agent
tmux-ide wait output %2 --match "tests passed" # block until it finishes
tmux-ide wait agent-status api --status done # or wait on a whole session
send types straight into another agent's prompt (target by pane ID, title, role, or name; long messages auto-route through a dispatch file). wait exits 0 on match, 1 on timeout, so it scripts cleanly. See the multi-agent teams docs for a worked lead-dispatches-to-codex example.
One app, a keystroke away
Once a session is adopted, the whole UI is a keystroke or two away — one interaction grammar (j/k move, enter opens, / filters, esc backs out, ? asks) and one theme file (~/.tmux-ide/config.json).
Every surface has a prefix twin (prefix then a letter) that works under every keyboard protocol, plus an ⌥ fast-path for a single keystroke when your terminal allows it. Lead with the prefix — an agent pane can temporarily change how the terminal encodes keys and swallow a root-table Alt bind, but the tmux prefix always reaches tmux. Right-click anywhere opens the actions menu at the pointer.
| Surface | Prefix (always works) | Alt fast-path |
|---|---|---|
| Home cockpit — fleet tree, detail, preview | prefix h |
⌥h |
| Switch session | prefix j |
⌥p |
| Cheat sheet — every key on one page | prefix k |
⌥k |
| Actions menu — at the pointer (or right-click) | prefix u |
⌥m |
| Sidebar — a fleet nav column | prefix b |
⌥b |
| Panels — explorer / changes / config | prefix e g v |
⌥e ⌥g ⌥, |
Optional: describe a layout with ide.yml
Adopt works on any session. If you'd rather have tmux-ide build the layout, scaffold an ide.yml:
tmux-ide init # auto-detects your stack
tmux-ide # launch (the session is adopted automatically)
name: my-app
sidebar: true # nav column (prefix b / ⌥b)
rows:
- size: 70%
panes:
- title: Claude
command: claude
focus: true
- title: Shell
- panes:
- title: Dev Server
command: pnpm dev
More
tmux-ide also has a worktree flow (a git worktree plus an adopted session per branch), wait coordination primitives, a --json surface on every command, and an optional task/mission orchestrator for coordinated multi-agent work. See the docs:
- Getting started and the full docs site
- Run
tmux-ide --helpfor the complete command list
Requirements
- tmux — 3.2+ recommended (
tmux-ide doctorrequires ≥ 3.0; 3.6 is the smoothest) - Node.js — ≥ 20
- Bun — only needed for the TUI surfaces (home cockpit, sidebar, floating
panels) when running from a dev checkout. Installed releases ship a
compiled
tmux-ide-tuibinary instead, so no bun runtime is required.
Run tmux-ide doctor to check your machine — the "TUI surfaces" row reports
whether they resolve via a dev checkout (bun) or the compiled binary.
TUI surfaces & the compiled binary
The cockpit/sidebar/widget surfaces are OpenTUI/Solid (.tsx). In a dev checkout
they run under bun (the bunfig preload supplies the JSX transform). For
installed users there is no checkout and often no bun, so those surfaces run from
a single self-contained executable built with bun build --compile:
pnpm build:tui # → packages/daemon/dist/tui/tmux-ide-tui (requires bun to build)
It bundles every surface behind a tmux-ide-tui <surface> [flags] dispatcher,
embeds the native OpenTUI dylib, and pre-transforms JSX at build time — so it
needs no runtime. The CLI resolves surfaces checkout-first, binary-second; the
binary is the installed fallback.
Note: a compiled binary is platform-specific (built for the host
OS/arch). Shipping it for every platform requires per-target builds
(--target bun-<os>-<arch>); a single npm tarball carries only the build host's
binary. Until per-platform artifacts are wired, installs on other platforms fall
back to the "install bun + run from a checkout" path, which tmux-ide doctor
spells out.
Contributor workflow
The repo is a pnpm workspace with a root CLI package and a separate docs app package:
pnpm install --frozen-lockfile
pnpm lint
pnpm format:check
pnpm test
pnpm docs:build
pnpm pack:check
pnpm check is the intended local pre-push command and matches the default release checklist.
Open source project files
- CONTRIBUTING.md — local setup and contribution workflow
- RELEASE.md — publish checklist
- CHANGELOG.md — release notes
- SECURITY.md — vulnerability reporting