Repository navigation
v4.2.0 - The shell and eleven pages move to shadcn
Every page in Dispatch grew on its own. The sidebar, the palette, the settings tabs and the source pages each carried their own fetch code, their own styles and their own quirks. That worked while the app was small. It stops working when the next page has to look and act like the last one.
This release rebuilds the frame of the app and eleven of its pages on the shadcn primitives from v4.1, with one rule: everything behaves as it did. The board, your sessions, playbooks, the Vault and board.db carry over with no migration. Every old URL still opens the same page. Every keyboard shortcut still works. What you get in return is a shell and a set of pages that share one data layer, one router and one component set, and a few things that are simply better.
The shell
The sidebar, the command palette, the cheat sheet, the activity drawer, the update banner and the undo toast are rebuilt on the shadcn primitive set. The sidebar is 240 pixels open and 56 pixels collapsed, and Cmd or Ctrl plus B toggles it. Below 1024 pixels it collapses on its own. On a phone it is a sheet that slides in from the left. The palette keeps the old ranking of results and now follows the mouse. The cheat sheet lists all 26 shortcuts in the same order as before. 72 of 72 page pairs rendered pixel-equal to the old shell before this merged.
Settings, Connections and Setup
Settings has a vertical rail of nine tabs at 768 pixels and wider, and a select menu below that. Every tab stays mounted, so a draft you typed in About you survives a switch to Board and back. The old tab names still resolve: filters, playbooks, vault and accounts open Connections, models and cleanup open Board, terminal opens Appearance. The Linear filters are a searchable combobox. The setup wizard is a dialog with progress segments and a checklist of prerequisites. Opening Settings sends one update check instead of two.
Playbooks, Vault, Archive, Accounts, Workspaces
These five pages moved to modules. Deleting a playbook, deleting or importing a Vault entry and removing an account now confirm in an alert dialog that closes on Cancel or Escape only. Focus returns to the control you came from when a dialog closes. A double click on a submit sends one request, not two. The Accounts login step reads the account list twice instead of about 2,400 times. Workspaces error notices show their text, which they did not before.
The source pages share one split pane
Tickets, Pull Requests, Errors, Slack, Meetings and Calendar use one split pane. The list opens at 480 pixels. Drag the handle to any width between 320 and 720 pixels and Dispatch keeps it. At 1023 pixels and below, Pull Requests, Errors, Slack and Meetings become a carousel, Tickets is one list with the ticket panel over it, and Calendar is an agenda.
What changed underneath
- Every server call goes through one typed
http<T>()client into a TanStack Query cache. The live board stream writes each frame straight into that cache, so there is one EventSource and no second data path. Queries do not retry and do not refetch on window focus. - Routing is TanStack Router on hash history with a committed route tree. The detail panel lives outside the route outlet with no key, so a route change never remounts the terminal.
- Eleven pages are modules under
src/web/modules/, each with its own queries, container and view, enforced by the v4.1 lint rules. The old versions are deleted: 31 files for the source pages alone. - The Board, Inbox, Today, Sessions, the detail panel, Flow, Ask and the modals still run on the old tree. The next release migrates them and removes the old tree.
Known limits
Hashes typed by hand into a running app now normalise: #/nope opens the board, and a slash inside an id is encoded. Cold loads of every old URL are unchanged. Five settings sections (About you, Claude arguments, Appearance, Cleanup delay, Linear filters) can still send two identical saves on a fast double click; the saves are idempotent. The Vault Rotate flow shows the current secret in plain text. The main script bundle grew from 112 to 201 kilobytes gzipped across these two groups. The split pane was proven against fake source servers, not a live Slack or GitHub.
Upgrade notes
No migration and no configuration step. Restart Dispatch and reload. Two new things are stored in the browser: the split pane width and the sidebar state. For contributors: the TanStack packages are exact-pinned dev dependencies, and routeTree.gen.ts is committed, so regenerate it when you add a route.
See it
dispatch-v4.2.0-shell.mp4
Higher-quality video with narration: dispatch-v4.2.0-shell.mp4
Full changelog: v4.1.0...v4.2.0
Requires Node ≥ 22.22, tmux, ttyd, git, and the Claude Code CLI. Setup is in the README.
