> fix the failing tests
● Read src/hooks/useAuth.ts
● Bash npm test -- useAuth
2 failed · 18 passed
● Edit src/hooks/useAuth.ts
✓ Fixed the race in useAuth — the effect cleanup ran after setState. 20 passed.
Mass-dispatch dashboard/Windows/v0.1.16
A Claude Code session that finishes its turn goes quiet, and one blocked on a permission prompt prints exactly as much — nothing. Dispatch is told which is which by the sessions themselves, counts them in the top bar of this page, and puts them in one list you answer from. What you get back is the gap between a session stopping and you noticing.
One command into four repos. Seconds later: one finished, one still working, and two waiting on an answer. The gold pulse is the product — a tile saying it has stopped spending tokens and started spending you.
A Claude Code session that finishes its turn goes quiet without ringing. Across six workspaces, that is work completing somewhere you are not looking — and a session blocked on a permission prompt prints exactly as much as one that has finished, which is nothing. So the top bar counts both, and Ctrl+Shift+A opens the list.
Dispatch runs a small loopback endpoint, and Claude Code posts to it when a turn starts, when it ends, when a permission prompt appears and when a session goes away. So finished means the turn ended and waiting on you means there is a dialog on screen. Guessing from silence files the one session that is stuck on you under finished.
Reading which screen is asking something is the one thing Dispatch parses, because it is the one thing no session can report for itself. Where it can't tell, you get the rows and no buttons — never a button for a question that was never asked.
A session you are looking at is never in the count, and one drops out the moment you visit it. So the chip reads · all quiet whenever you are on top of things, rather than growing a permanent tally you learn to ignore.
The broadcast bar is one command into many terminals. This is the other half — many different jobs into many terminals. Keep one session as the lead: a tile you talk to rather than work in.
“I've got BUG-114 in vantage, BUG-118 in Aura-Tycoon, and two chores in meme-factory. Set them up.”
The command is typed into each shell and left sitting at the cursor — not run. You read down the row, see exactly what each one is about to do, and press Enter on the ones you agree with. Ask for mode: "fired" when you'd rather they just go.
Every project reference is resolved before anything is created, so a plan naming a repo that can't be found opens no terminals rather than half of them. A name matching more than one project is an error listing the candidates — never a guess, because a tile opened in the wrong repo is an agent working confidently on the wrong code.
Tiles land in a new workspace by default; pass workspace: "current" to add them to the one on screen. And the tools talk to the live window over a local named pipe — when Dispatch isn't running, every tool says so rather than guessing.
dispatch_projectsdispatch_plandispatch_listdispatch_senddispatch_readdispatch_waitdispatch_docdispatch_studiodispatch_rojodispatch_workspacedispatch_closeType in the bar, press Enter, and the command goes to every targeted terminal — the ones whose checkbox is ticked. All and None target everything or nothing; when several groups are open, group chips let you target just one shelf of repos.
Ctrl-C sends an interrupt to every targeted terminal; Clear clears their screens.
Click any single terminal and use it normally. It was never a log pane — it's a full interactive shell.
Auto-discovery groups projects by category. Pin what you're on, hide the noise, and Ctrl+Shift+P fuzzy-opens any of them.
Each workspace remembers its own terminals, columns, tile heights and broadcast targeting — and switching keeps the other workspaces' processes running. Broadcasting only ever hits the active one.
Each workspace scans its own root folder, so one can be your Roblox games directory while the next is your JS/web directory. Pins, hidden projects and recents are shared across all of them, because they're stored by full path.
Right-click a project row or a group header and pick New workspace for this folder. You get a tab named after it with its root already pointed at it — nothing is opened for you, the tab is just already aimed.
The — button drops a tile out of the grid and leaves a card in a bar underneath. The shell keeps running; the card still goes gold when that terminal rings, and strikes through when its process exits.
A markdown file opens as a tile beside the work, rendered rather than raw, and live in both directions — so a plan an agent just wrote gets read next to the session that produced it.
A Rojo workflow has two ends, and Dispatch only ever owned one: rojo serve runs in a tile, while the Connect that makes Studio listen lives in Rojo's own plugin. Forget that click and editing a project looks exactly like editing one that is synced — the files change, the place doesn't, and the first sign is a playtest behaving like the code from twenty minutes ago.
The chip is a switch: click it amber and it connects, click it green and it disconnects. Clicking Serve opens a terminal running it — its own tile, in that project, because rojo serve holds a terminal for as long as it runs.
Connect/Disconnect action. It reports the state it actually reached rather than the keystroke it sent — so a chip that stays amber tells you something real: nothing is bound to that chord, or Studio has a modal in front of the place.A tile can be pointed at a running Studio window, and its header carries a chip naming the place that window has open. Click to bring Studio to the front, shift-click to raise it without moving it, right-click for its home monitor. Which windows exist, what each has open, where they sit — nothing reaches inside.
It names the place it is still pointed at — and clicking it opens that place, rather than telling you it is shut. The plugin names itself on the way in, so every handshake carries the place's id.
$6/ month
or $60 / year2 months free
Windows build, in private release. Leave an address and you'll get one email when the trial opens — nothing before it, nothing after.
No endpoint configured. Set WAITLIST_ENDPOINT in src/lib/site.ts to any provider that accepts a POST — then this bar goes live.