Runtime instrument · v0.2.6 preview

Pass theruntime.

Baton is a loopback control plane for people and coding agents. Run the app, hot-reload it, boot the simulator, and keep the proof — without an IDE holding the mouse.

Node 24+ 127.0.0.1 only MCP · CLI · app
Baton

Workflow proof

The loop an IDE cannot share.

Baton launches and reports evidence. It does not tap the UI or judge a screenshot. Capture success means an image was written — you or the agent still have to look.

01
inspect_project
targets, devices, blockers
02
run_target / run_workflow
start from a copy if you asked
03
wait_for
ready, not a sleep
04
screenshot / read_logs
structured evidence
05
hot_reload
87ms on a 3,692-library Flutter app

Failed reloads return the compiler error, not “DevFS synchronization failed.” MCP cannot yet boot simulators — use baton boot "iPhone 17 Pro" or a device that is already running.

Framework support

Honest capabilities.

A Vite session does not claim Flutter’s stateful hot reload. The control panel greys the button; agents get a refusal instead of a silent no-op.

Flutter / Dart
Daemon protocol, DevTools, debug flags, screenshots
stateful reload
Next.js, Vite, Nuxt, Astro, Remix, Angular, CRA
HMR on save; Baton restarts the server when you ask
HMR + restart
React Native / Expo
Fast Refresh; reload broadcast to Metro clients
Fast Refresh
Anything in launch.json or package.json
Kill and respawn, logs, session identity
process

Control surface

Same sessions. Three hands.

One daemon on loopback. The app, the CLI, and baton-mcp all authenticate with a token in ~/.baton/daemon.json (mode 0600).

Baton app

Native floating launcher on macOS; app-style browser window elsewhere. Never steals focus. baton hud is only an alias.

CLI

baton list, run, reload --all, boot, doctor. Commands exit non-zero on failure.

MCP tools

Structured run, wait, logs, diagnose, network, proof. First tool call starts the daemon if needed.

ROI by team size

Modeled, not invented.

Hot reload in 87ms and restart in 359ms were measured on a production Flutter app. Time and token ranges below are scenarios you can argue with.

Weekly time in scope0.8–1.5 hrsreloads, boots, waiting
Token cut per verify cycle60–80%vs log scraping
“Can you run this?”rarely askedself-serve Run button

Open the full assumption sheets →

Installation

One machine. Then any client.

Install on the computer that actually runs the apps. Requires Node.js 24+. There is no App Store binary.

GitHub (current)
npm install -g github:kanumuri9593/Baton#v0.2.6
baton app
MCP config
{
  "mcpServers": {
    "baton": { "command": "baton-mcp" }
  }
}

npm install -g baton-run. Pin with github:kanumuri9593/Baton#v0.2.6. Full install, MCP, CLI, app, and troubleshooting →

Feature requests

Tell us the missing control.

Adapters people have already asked for: Expo depth, Storybook, Tauri, Electron, Rails, Django, Phoenix, dotnet watch, Go with Air. A boot_device MCP tool is planned.

Open the request desk