osstmux-ide is open source, built at Prototyper.Learn more
tmux-ide

CLI Reference

Every tmux-ide command — the current surface, straight from tmux-ide --help

CLI reference

Every command accepts --json for structured output. Run tmux-ide --help for the built-in version of this list.

Sessions

CommandDescription
tmux-ideLaunch .tmux-ide/workspace.yml or compatible ide.yml, or open the home cockpit if there is none
tmux-ide <path>Launch from a specific directory (cockpit if no config is found)
tmux-ide init [--template <name>]Scaffold .tmux-ide/workspace.yml (auto-detects stack)
tmux-ide stopKill the current IDE session
tmux-ide restartStop and relaunch the session
tmux-ide attachReattach to a running session
tmux-ide lsList all tmux sessions
tmux-ide status [--json]Show session status

The dock

CommandDescription
tmux-ide adopt <session>Add the live status bar (dock) to a session
tmux-ide adopt --allAdopt every live (non-internal) session
tmux-ide unadopt <session>Remove the status bar
tmux-ide team [--json]TUI over all sessions (--json prints fleet state)
tmux-ide switcherCompact session picker (prefix j / ⌥p)
tmux-ide cheatsheetPrint the key cheat sheet (prefix k / ⌥k)
tmux-ide menu [--client N]Open the actions menu (prefix u / ⌥m / right-click)
tmux-ide popup <widget>Open a widget panel (explorer / changes / config)
tmux-ide sidebar-toggle [--session S]Toggle the nav column (prefix b / ⌥b)

Agent status

CommandDescription
tmux-ide integration install claudeAuthoritative agent status via Claude Code hooks
tmux-ide agent explain <pane> [--json]Debug how a pane's agent state is detected
tmux-ide events [--follow] [--json]Stream agent-status transitions (needs an adopted session)
tmux-ide wait agent-status <session> --status <s> [--timeout <ms>]Block until a session reaches a status (exit 0 match / 1 timeout)
tmux-ide wait output <pane|session> --match <regex> [--timeout <ms>]Block until a pane's output matches a regex

See Agent detection and Notifications & events.

Restore

CommandDescription
tmux-ide restore [--dry-run] [--run-commands] [--resume-agents] [--json]Rebuild the fleet from the last snapshot after a tmux crash

--resume-agents revives Claude conversations via claude --resume. See Restore & resume.

Worktrees

CommandDescription
tmux-ide worktree create <branch> [--from <ref>] [--dir <path>] [--no-session]Add a git worktree (new branch) + open a session in it
tmux-ide worktree open <branch>Open (or switch to) the session for an existing worktree
tmux-ide worktree list [--json]List worktrees joined with their session status
tmux-ide worktree remove <branch> [--force]Kill the worktree's session + remove the worktree

See Worktrees.

Config & inspection

CommandDescription
tmux-ide inspect [--json]Show effective config and runtime state
tmux-ide doctorCheck system requirements
tmux-ide validate [--json]Validate the resolved project config
tmux-ide detect [--json]Detect project stack
tmux-ide detect --writeDetect and write .tmux-ide/workspace.yml
tmux-ide migrate --dry-run [--json]Preview ide.yml to .tmux-ide/workspace.yml migration
tmux-ide migrate --write [--json]Create .tmux-ide/workspace.yml from ide.yml
tmux-ide config [--json]Dump config as JSON
tmux-ide config set <path> <value>Set a config value by dot path
tmux-ide config add-pane --row <N> --title <T> [--command <C>]Add a pane
tmux-ide config remove-pane --row <N> --pane <M>Remove a pane
tmux-ide config add-row [--size <percent>]Add a row

Setup & settings

CommandDescription
tmux-ide setupInteractive TUI setup wizard
tmux-ide setup --editOpen the config tree editor
tmux-ide settingsInteractive TUI config manager

Pane messaging

CommandDescription
tmux-ide send <target> <message>Send a message to a pane
tmux-ide send --to <name> <message>Target by name, title, role, or ID
tmux-ide send <target> --no-enter <msg>Send text without pressing Enter

send also reads from stdin: echo "msg" | tmux-ide send <target>.

Server

CommandDescription
tmux-ide --headless [--port N]Own the canonical daemon in this foreground process
tmux-ide command-center [--port N]Start the legacy command-center HTTP API
tmux-ide server [--port N]Start the legacy HTTP + PTY WebSocket server

Native and desktop handoff

--headless is the config-free daemon entry point for the native app and other process hosts. Launch the installed executable directly with an argv array:

executable: /resolved/path/to/tmux-ide
argv:       ["--headless"]

Resolve executable to the installed root package's tmux-ide bin (not a workspace source file or the private @tmux-ide/daemon package). Pass every argument as its own argv element. Use an existing directory as the child working directory, inherit HOME unless you deliberately isolate daemon state, and retain the returned child PID. Stdio may be piped or redirected to null, but do not wrap the invocation in a shell, append &/nohup, or add a second daemonizer. Readiness is established by the probes below, not by the spawn call returning and not by parsing stdout.

tmux-ide --headless stays in the foreground; the spawned process is the daemon owner even when the host detaches its stdio. It does not open a TUI, launch a tmux workspace, require a project config, install anything, or inherit remote-access authentication. --port N is optional; omitting it selects a free loopback port. Treat a non-zero child exit before readiness as launch failure and surface its stderr/structured error to the user.

The owner first atomically acquires a process-lifetime claim, then publishes this versioned discovery shape with owner-only permissions. The claim spans record inspection, socket binding, publication, and the daemon's full lifetime; concurrent cold-start losers wait for and reuse the winner instead of binding or publishing another daemon:

{
  "pid": 4312,
  "port": 4010,
  "protocolVersion": 1,
  "productVersion": "2.8.0",
  "instanceId": "9bcf33b0-c837-4a94-b5e8-c0977f54464f",
  "startedAt": "2026-07-21T00:00:00.000Z",
  "bindHostname": "127.0.0.1",
  "authToken": null
}

Startup is ready only when all checks succeed:

  1. ~/.tmux-ide/daemon.json exists (or the directory selected by TMUX_IDE_DAEMON_INFO_DIR) and names the child PID and port.
  2. The unauthenticated GET /identity response exactly matches the record's pid, protocolVersion, instanceId, and startedAt. This binds the endpoint before the host sends any credential. productVersion is reported as a diagnostic and may differ when the wire protocol remains compatible.
  3. GET /health succeeds and reports the compatible daemon wire protocol and its diagnostic productVersion. /healthz reports that same value.

Construct probe URLs with a URL API or bracket an IPv6 literal ([::1]); never interpolate an unbracketed IPv6 hostname into http://host:port.

A second tmux-ide --headless never takes over a healthy daemon. If its wire protocol is compatible, the second process reports already-running and exits zero; a product-version difference is diagnostic only. An incompatible wire protocol or disagreement between discovery and health exits non-zero so the host can ask the user to restart or upgrade. Only a dead PID is stale state and may be removed. A live PID whose health endpoint is unavailable still owns the slot: the contender exits non-zero without clearing the record or starting another daemon.

Publication is create-if-absent and cleanup is generation-safe: an owner removes only the record carrying its own instanceId. It never deletes a record that a concurrent process replaced while cleanup was in progress.

An existing record that is protocol-less, malformed, oversized, symlinked, owned by another user, or not owner-only is invalid, not missing. Do not delete it or start another owner. The CLI only removes a securely read invalid record when its positive recorded PID is explicitly proven dead; otherwise the host should ask the user to inspect or remove the record after verifying the owner process.

Send SIGINT or SIGTERM to stop the owner. The daemon shutdown action follows the same idempotent path. Both close HTTP/WebSocket/PTY resources, remove the canonical record, and let the owner exit zero; a cleanup failure exits non-zero.

Flags

FlagDescription
--jsonOutput as JSON (all commands)
--headlessRun only the canonical daemon in this process
--template <name>Use a specific template for init
--writeWrite detected config to .tmux-ide/workspace.yml
--verboseLog all tmux commands (or set TMUX_IDE_DEBUG=1)

Key discovery

Once a session is adopted, the whole UI is a keystroke or two away. Each surface has a prefix twin (prefix then a letter) that works under every keyboard protocol, plus an fast-path when your terminal allows it — lead with the prefix.

SurfacePrefix (always works)Alt fast-path
Home cockpit from anywhereprefix h⌥h
Switch sessionprefix j⌥p
Cheat sheet (all keys)prefix k⌥k
Actions menu (or right-click)prefix u⌥m
Sidebarprefix b⌥b
File / changes / config panelsprefix e g v⌥e ⌥g ⌥,

Rebind any of them in ~/.tmux-ide/config.json (keys.*) — the prefix twin follows the fast-path key. See Theming & config.

On this page