Skip to content

v3.5.0 - The terminal is a shell now

Choose a tag to compare

@theyashgupta theyashgupta released this 08 Sep 13:47
5b6bb09

v3.5.0 - The terminal is a shell now

A ticket's terminal used to be Claude and nothing else. Press Ctrl-C twice, and the tmux session died with it. The card flipped to "Session lost". The only way back was Resume, which created a new session from nothing. You could not run git status. You could not run anything.

This release changes what the terminal is. The tmux session now runs your login shell, and Claude is a program that Dispatch starts inside it. Ctrl-C leaves you at a prompt in the workspace, the session stays alive, and a "Run Claude" button restores Claude with the same conversation.

See it

Dispatch v3.5.0: exit Claude with Ctrl-C, run git status at the shell prompt, click Run Claude

Higher-quality video: dispatch-v3.5.0-shell-session.mp4

Ctrl-C returns a prompt, not a dead card

When you exit Claude, the pane shows your shell in the ticket's workspace directory. The tmux session, its scrollback, and the browser terminal all survive. The card keeps its session, and no recovery notice appears. Type any command there. git -C <repo> status shows the ticket branch, because the workspace directory holds one worktree folder per repository.

The "Session lost" notice and Resume still exist. They now mean one thing only: the tmux session itself is gone, for example after a reboot.

Run Claude, with the right flags

The terminal panel gains a toolbar with one button, "Run Claude". Dispatch types the same launch line a fresh start uses, with the hooks that route status back to the card. When Dispatch recorded the conversation id, the relaunch resumes it. When it did not, the relaunch starts a new conversation.

The typed line goes into your shell history, so Up-arrow and Enter relaunch Claude with the same flags. A bare claude typed by hand also works. It runs without the Dispatch status hooks, so the card's status stays where it was until the next full launch.

Run Claude refuses to type into a pane that is busy. It answers a clear error in three cases: Claude is already running, another launch is in flight, or an older Dispatch build created the session.

What changed underneath

Dispatch waits for your shell to reach its prompt before it types the launch line. It watches the pane's foreground process group, not process names. macOS /bin/sh re-executes as bash, so the names disagree even at an idle prompt. The wait exists because a real run showed a shell startup prompt swallowing the typed line.

Dispatch single-quotes every token of the launch line. A Settings argument such as --append-system-prompt 'be terse; $(id)' reaches Claude as one literal argument. Dispatch refuses a token that carries a control byte, because the shell's line editor acts on such bytes before the parser sees a quote.

A session created by an older build keeps working. Run Claude declines it with a clear message. It becomes a shell session when Claude exits and Resume relaunches it.

Vault: the previous value, and search

A rotated vault key now remembers the value it held before the rotate. The key shows a "Previous" line with an eye button. A click reveals the previous value. A second click hides it. The previous value stays in its own sealed file. No other route returns it.

A search box above the key list filters keys by name and purpose. Each key now sits in its own bordered card.

Known limits

A shell startup prompt that runs as a shell builtin, for example read in your rc file, is not detectable. The start then fails with that prompt visible on the card. Dispatch detects a prompt that runs as a separate process, such as an ssh-agent PIN request, and waits for it. Dispatch cannot answer that prompt for you. Guard such blocks in your rc file for Dispatch panes, for example by skipping them when DISPATCH_CARD_ID is set.

A card whose Claude has exited stays in its column with a live terminal and no status source until you launch Claude again. A "Claude exited" state on the card is a later change.

A Claude session that is killed within seconds of its first prompt may not have saved its transcript yet. Claude then refuses its own resume id. Dispatch drops that id, so the next Run Claude starts fresh.

Upgrade notes

There is no migration and no configuration step. Sessions that are live at upgrade time keep running with Claude as the pane process. Each of them becomes a shell session the first time Claude exits and Resume relaunches it.

Full changelog: v3.4.4...v3.5.0

Requires Node ≥ 22.22, tmux, ttyd, git, and the Claude Code CLI. Setup is in the README.