v1.7.0 - Installable Distribution
Until now, running Dispatch meant cloning the repo, installing dependencies, and starting a dev server. v1.7 turns it into something you install. npx @theyashgupta/dispatch pulls the published package, picks a free port, prints the URL, and opens your browser. The first thing you see is a setup screen that takes your Linear key and shows you which tools are present, and the moment the key checks out the board starts syncing. No clone, no config file, no restart.
See it
The first run lands here: paste your Linear key, and the live checklist confirms tmux, ttyd, git, and claude before the board starts syncing.
Install and run
Dispatch now ships as a public scoped package on npm. npx @theyashgupta/dispatch runs it with nothing installed globally, and npm i -g @theyashgupta/dispatch gives you a permanent dispatch command backed by the same entrypoint. On boot it honors a configured port or --port, falls back to a free one if that port is taken, and prints the address it actually bound before opening your browser. Pass --no-open if you would rather open the tab yourself.
The CLI answers a few things without starting a server. dispatch doctor reports each of tmux, ttyd, git, and claude as present or missing with an install hint for anything you lack, and exits non-zero if something is missing so you can wire it into a script. dispatch --help prints usage and dispatch --version prints the installed version. A bad --port value now fails with a single clear line instead of a stack trace.
First run without a key
Before, a missing Linear key printed a message and quit. Now the server boots into a setup state instead of exiting, and the browser lands on a full screen first-run view. You paste your Linear personal API key, and a live checklist shows tmux, ttyd, git, and claude each as present or missing with the same install hints as doctor, so a fresh machine tells you what it needs before you rely on the board. Missing tools are shown, never fatal at boot.
The key is checked before it is ever written. Dispatch runs a real query against Linear with the key you pasted, and only on success does it save the key to the on-disk config at owner-only permissions, rebuild the Linear source, and start syncing. A key Linear rejects comes back as an inline error and is never saved, so you never get dropped onto an empty board wondering what went wrong, and a network or rate-limit failure is reported as unreachable rather than as a bad key. Once the key lands the board fills in over the existing live connection with no reload and no restart.
How it is served
The whole app now builds and runs as a single process. A production build bundles the frontend and compiles the backend so it starts on plain Node with no dev tooling present, and one Express server serves both the API and the built interface on one port. The live terminal, the event stream, and every API route behave exactly as they did under the dev server, with the served page marked no-cache and its hashed assets marked immutable so an upgrade never serves a stale shell against fresh assets. Unknown API paths return a real 404 rather than the app shell.
The published package is deliberately lean. Its file list ships only the built output, so a production install pulls three runtime dependencies and nothing from the build toolchain, and the tarball carries the compiled app and the dispatch binary and nothing else. Pushing a version tag runs a GitHub Action that builds and publishes, so a release does not depend on anyone publishing by hand. The README now leads with the npx path and the in-browser setup, and the maintainer release flow is written down.
Full changelog: v1.6...v1.7.0
Requires Node ≥ 22.22, tmux, ttyd, git, and the Claude Code CLI. Setup is in the README.
