A native desktop command center for AI-assisted development.
Projects, terminals, task dispatch, file browsing, and git save points — in one place, with no browser tab tax.
Dispatch is a Tauri v2 desktop app that brings the way you actually work with AI development tools into one native shell. Spawn codex, claude, gemini, or any other CLI directly from a kanban-style task board. Watch sessions, track file changes, and create git save points without leaving the window.
The Rust backend owns everything that touches your machine — PTYs, filesystem, secrets, and the SQLite store. The React frontend never talks to disk directly. That isolation is the whole point: no shell-string interpolation, no rogue paths, no surprises.
- Multi-project workspace — switch between local git repos in one click
- Native terminals — Rust-backed PTYs, single-owner lifecycle, websocket attach for reconnects
- Direct CLI dispatch — structured
program+args[]+env+cwd; zero shell parsing - Kanban task board — 5 workflow columns (Draft → Planning → In Progress → Review → Done) with markdown export to
<project>/dispatch/tasks/ - Files tab — Rust-owned tree, search, and watching with
.gitignorefiltering - History v1 — git save points on
refs/dispatch/*. Never pollutes your branch history. Pre-run save points fire even when the repo is clean. - OpenClaw integration (optional) — mirror orchestrated chat/review through a local gateway when one is available
- Standalone mode — works without OpenClaw, no extra infrastructure needed
| Mode | Requires | What you get |
|---|---|---|
| Standalone | Just Dispatch | Local projects, terminals, tasks, files, history, direct CLI dispatch |
| Connected | Local OpenClaw gateway | Everything above + orchestrated Chat tab and review loop |
To turn on connected mode, set the gateway URL in Settings → Connection (default: ws://127.0.0.1:18789). If the gateway needs auth, store OPENCLAW_GATEWAY_TOKEN in Settings → Secrets (Linux keychain).
Pre-built Linux bundles for every release are attached to the Releases page. Pick your format:
chmod +x Dispatch_*.AppImage
./Dispatch_*.AppImagesudo apt install ./Dispatch_*.debLinux prerequisites
Tested on Debian and Ubuntu (22.04+). Install:
node22.x- Rust stable (via
rustup) npmbuild-essentialpkg-configlibwebkit2gtk-4.1-devlibayatana-appindicator3-devlibrsvg2-devpatchelflibfuse2
The release workflow runs on ubuntu-22.04 with the same packaging dependencies.
From the repo root:
npm ci
npm test
cargo test --locked --manifest-path src-tauri/Cargo.toml
npx tauri devnpm run dev starts only the Vite frontend on port 1420. Use npx tauri dev for the full desktop app — it spawns both the frontend and the Rust shell.
- Launch with
npx tauri dev - Open Settings → Projects and add a local git repository
- Use Agents → New shell to open a terminal in that project
- Dispatch will use whichever CLI tools (
codex,claude,gemini, etc.) you already have installed - OpenClaw features stay dormant until a reachable gateway URL is configured
Standalone mode does not require any environment variables. The optional ones, for connected mode or pre-loaded agent profiles, live in .env.example:
| Variable | Required | Purpose |
|---|---|---|
OPENCLAW_GATEWAY_URL |
No | OpenClaw gateway URL. Defaults to ws://127.0.0.1:18789. |
OPENCLAW_GATEWAY_TOKEN |
No | Optional gateway token. Prefer Settings → Secrets for keychain storage. |
ANTHROPIC_API_KEY |
No | Optional credential for local Anthropic-backed agent profiles. |
OPENAI_API_KEY |
No | Optional credential for local OpenAI-backed agent profiles. |
GOOGLE_API_KEY |
No | Optional credential for local Google-backed agent profiles. |
Dispatch reads these from the process environment at launch. Export them in your shell, direnv, or your desktop launcher — no .env file required.
Rust owns SQLite (via rusqlite), the filesystem (notify, ignore, grep-searcher), PTYs (portable-pty), secrets (keyring → OS keychain), and OpenClaw transport (tokio-tungstenite). The React frontend keeps only UI state in Zustand and talks to the backend through typed Tauri commands. PTYs are created in exactly one place (create_terminal_session()); websocket routes attach to existing sessions, never spawn new ones. Save points live on refs/dispatch/* so they never collide with your real branch history. Full architectural lockdown in ROADMAP-v2.md.
Cutting a release
- Bump the version in
package.json,src-tauri/Cargo.toml, andsrc-tauri/tauri.conf.json— all three must match. - Run the gates locally:
npm ci npm test cargo test --locked --manifest-path src-tauri/Cargo.toml bash scripts/smoke/phase-10-release.sh
- Commit and push.
- Tag and push the tag:
git tag v0.1.0 git push origin v0.1.0
- GitHub Actions runs
release.yml, verifies the tag matchespackage.json, runs all tests, builds the.AppImageand.deb, and publishes a GitHub Release with both attached. - Install the generated bundle on a clean Linux box and confirm the app launches before announcing.
workflow_dispatch is still useful for dry-run validation, but artifact publication is tag-triggered only.
Release-readiness targets
These are not automated perf gates yet — they're the targets the release smoke is designed to protect:
- Cold start under 2 seconds on the target Linux box
- Idle memory under 300 MB RSS after the app sits idle for 60 seconds with one project loaded and no active streams
- Terminal spawn latency under 3 seconds (direct dispatch or blank shell)
- Save-point creation under 2 seconds on a warm local repo