As you work with AI, your attention gets fragmented — driving multiple planning tasks while overseeing multiple implementation tasks. Chat quickly becomes the wrong UX for piloting a fleet of agents.
This skill lets you use Claude Code / Codex as multiple chiefs of staff (lieutenants). You get a web UI where you work together, as work items get done by independent agent sessions on a kanban board.
One skill:
npx skills add tonylampada/bridge-commander -g -yThat's it. The rest happens in the terminal you already have.
- Make an empty folder (e.g.
myfleet) and startclaudein it - (Recommended) Set permissions mode to auto
/bridge-commander- Open the board URL it prints (default
http://localhost:4780/)
Bridget is already there with a message waiting. She's your first lieutenant, and she does the rest of the setup with you.
You need tmux and git on the machine (Bridget will offer to install if missing).
You never have to use tmux yourself, but you can if you want.
Per-workspace config lives in .bridge-commander/config.json:
| Key | Default | Meaning |
|---|---|---|
port |
4780 |
server port (also --port N on init/open) |
host |
127.0.0.1 |
bind address — see network exposure below |
harness |
claude |
default agent harness (claude | codex) |
voices |
— | UI text-to-speech voice filter |
tts |
— | speak agent messages through an external TTS engine: {"url": "http://127.0.0.1:8883", "lang": "pt", "voice": null, "params": {}} (voxbench API). Absent = the board stays silent. The server reaches the engine: the browser talks to /api/tts/* on the board's own origin and the url only has to be reachable from the machine running the server (no CORS, no tailnet on the phone) |
Env knobs (set on the server process):
| Variable | Default | Meaning |
|---|---|---|
BC_SUPERVISE_INTERVAL_MS |
30000 |
supervision tick (lieutenant respawn, dead-worker detection); 0 disables |
BC_PRWATCH_INTERVAL_MS |
120000 |
PR watch tick; 0 disables |
BC_UPLOAD_MAX_BYTES |
10485760 |
per-file chat upload cap |
BC_WORKER_TTL_SECS |
600 |
card status lease TTL — working/needs-you decays to idle past it |
BC_WORKTREE_TOOL |
auto | treehouse | git — worker worktree provisioning |
BC_HARNESS_STATE |
~/.bridge-commander/harness |
harness state dir (prompts, session ids, turn-end logs) |
BC_GH_CMD |
gh |
gh binary used by the PR watch and by the packaged gh-watch hook |
BC_SCHEDULE_INTERVAL_MS |
15000 |
schedule tick — how often the clock looks for due windows; 0 disables |
BC_TURNEND_URL |
— | default callback URL baked into installed turn-end hooks |
BC_SEND_RETRIES / BC_SEND_SLEEP_MS |
3 / 400 |
verified-submit tuning for harness.send |
BC_HOOK_TIMEOUT_MS |
120000 |
per-script timeout for workspace hooks, lifecycle and named alike |
BC_TEARDOWN_TIMEOUT_MS |
300000 / 60000 |
timeout for a playbook's teardown command — 5 min at the handoff and archive (un-awaited), 60s at a rework restart (awaited inside card start); set, it overrides both |
BC_TTS_IDLE_MS |
20000 |
how long the TTS passthrough waits for the next byte from the engine before hanging up — a gap between bytes, not a cap on the request |
BC_SYSLOAD_MS |
2000 |
monitoring panel (⚙️ → machine load) sample interval; the sampler runs only while the panel is open |
The board has no application-level auth — whoever reaches the bind address fully controls the board, including starting workers (running code):
- Default (recommended): loopback only (
127.0.0.1). - Private mesh (e.g. Tailscale): set
hostto that interface's address; a loopback listener is kept alongside. The mesh is your only auth boundary. - Never bind
0.0.0.0.
How it works inside: ARCHITECTURE.md. The conceptual API (docs/api/overview.md) is the spec the implementation follows.
