Skip to content

v2.0.0 - Workflow-first board

Choose a tag to compare

@theyashgupta theyashgupta released this 18 Jul 17:23
· 647 commits to main since this release
v2.0.0
bb94e4b

v2.0 reshapes Dispatch around how it actually gets used. Planning is no longer a column you drag tickets into, it is a playbook you pick when you start. Synced Linear tickets no longer flood To Do, they land in an Inbox you triage on purpose. And the board is no longer the only way to work: a second view puts every ticket in a sidebar with the live terminal filling the rest of the screen. Underneath all of it, the most annoying bug in the app, a card sitting on In Progress while the agent had been waiting on you for ten minutes, is diagnosed and fixed for real.

See it

Dispatch v2.0 walkthrough: Inbox triage, playbook kickoff, Needs Input flip, Orca view, cmd+click links, panel resize

Higher-quality video: dispatch-v2.0.0-workflow-first.webm

Needs Input, reliably

When a Claude session pauses to ask you something through its question tool, no text lands in the transcript for Dispatch's marker protocol to see, so the card never moved to Needs Input. And because the hooks channel takes over from terminal watching a couple of seconds into every session, nothing else was going to catch it either. The card just sat there looking busy.

The fix works with the session instead of around it. Dispatch now registers a hook for the question tool itself, so the instant the agent asks, the card flips to Needs Input with "waiting on AskUserQuestion" as the reason. Answering flips it back through the tool-completion event, since answering a question tool never produces the prompt event the old flip-back listened for. Repeated questions in one session each flip the card again, a manual drag still outranks any automatic move, and the plain text marker path is untouched for everything that already worked.

Kickoff picks a playbook, not a column

The In Planning column is gone, and so is everything that existed only to serve it: the plan-ready badge, the handoff step between planning and coding, the split of playbooks into planning and implementation stages. A board that still had tickets sitting in In Planning migrates them cleanly on first boot. To Do to In Progress is now the only way a session starts.

In its place, the start dialog has a playbook picker. Dispatch seeds four editable playbooks into ~/.dispatch/playbooks/: a PRD-then-execute loop, a brainstorm-first flow, a project-management flow, and plain "write code directly" for when you just want the agent typing. They are pointers to how you already work, not walls of instructions, and they are yours to edit or delete; a deleted seed stays deleted instead of respawning on the next boot. The picker remembers your last choice as the default. A malformed playbook file shows up greyed out with the reason it failed to load and can never block a start; if your remembered default is the broken one, kickoff falls back to writing code directly.

The Inbox

Newly synced Linear tickets now land in an Inbox instead of To Do, so To Do only ever contains what you put there. The Inbox is a triage list, not a second board: compact rows with identifier, title, project, and age, a search box that matches title and identifier, and a project filter. One click promotes a ticket to the top of To Do. Tickets that vanish from Linear, or drop out of your sync filters, disappear from the Inbox on the next sync rather than lingering as ghosts.

Promote-first is enforced where it counts, on the server. Starting a session on an Inbox ticket returns a 409 no matter who asks, an Inbox ticket can only move to To Do, and a ticket can only move back to the Inbox if it has no session history. The Inbox button in the top strip carries a live count so you can see triage debt at a glance.

A second way to work

A toggle in the top strip switches between the board and a new view: a sidebar listing every ticket in collapsible status sections, Inbox included, with the live terminal filling the rest of the window. Click a ticket in the sidebar and its terminal is just there, full size, no overlay. Tickets without a session show their details read-only, To Do tickets get a Start button in the panel header, and unseen-activity dots are shared with the board, so a ticket you check in one view reads as seen in both.

The part that matters technically: switching views never remounts the terminal. The docked panel is the same element as the overlay panel with different geometry, which means the same iframe and the same WebSocket, verified by watching the connection hold across toggles. Your session does not blink, reconnect, or lose scrollback because you changed views. The choice persists across reloads, and the board is byte-for-byte unaffected when you switch back.

Cmd+click links in the terminal

URLs in terminal output are now real links: hold cmd (or ctrl) and click to open one in a browser tab. A plain click does nothing, which is exactly what you want in a terminal where clicking is how you focus the pane.

This one took some plumbing. The terminal is ttyd's own page inside an iframe, and its bundled link handler opens on any click while the iframe sandbox silently blocked the popup anyway, the worst of both worlds. Dispatch now captures ttyd's served page at boot, patches the link handler to require the modifier, and serves the patched page back through ttyd's own index flag, with the sandbox widened just enough to let the popup out. If a future ttyd version changes the page and the patch no longer applies cleanly, Dispatch logs one warning and serves stock behavior rather than refusing to start sessions.

Drag the panel to any width

The ticket detail panel's left edge is now a drag handle. Pull it anywhere between 360px and 90% of the window, and the width sticks across reloads. Double click the handle to reset. Dragging across the live terminal does not stick or drop the drag, which sounds trivial and is not: a mouse release over a cross-origin iframe never reaches the page, so Dispatch shields the drag with an invisible overlay for exactly its duration. Fullscreen is unchanged and hides the handle, and your custom width is waiting when you exit.

Full changelog: v1.9.0...v2.0.0

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