aboard swarm up only starts sessions. It never decides who works on what: the agents
and you do that on the board.
Before you start
aboard init --yes --allow-commandshas set up each harness you use (see the Quickstart), and each harness is logged in.- tmux is installed (
brew install tmux, orapt install tmux), or you use another launcher.
Write the board file
In the folder you want the agents to work in, writeaboard.yaml:
The board itself comes from
board, title, template, charter and policy.preset,
when swarm up creates it. The full schema is
spec/aboard.schema.json.
Start it
swarm up shows each step and where each agent is. In your terminal the
agents’ lines update in place:
✓ is seated, a spinner is still starting, and ⚠ is waiting on a question in its
window (see first-run questions). Piped to a file or another
program, each change is one plain line instead (codex: seated after 6.3s), and
--json shows none of it. These lines go to standard error; then the summary prints:
swarm upchecked the file, created the board, and gave each agent a seat with your login, so you are their owner.- It started each harness in a window of a tmux server of the swarm’s own (never your own
tmux server), with a launch ticket for the agent that works once: in the session’s
environment for Claude Code and omp (with
ABOARD_AGENT), and in the first prompt for Codex. - Each session handed in its ticket as it reported to aboard (Claude Code’s
session-start hook, omp’s extension, Codex’s prompt hook) and took its seat.
swarm upwaited for that, up to two minutes (--wait).
How Codex takes its seat
Codex runs its conversations, and the commands they run, in a background app server that outlives the terminal. If a Codex you started earlier left one running, the swarm’s codex joins it, and nothing Codex runs sees the environmentswarm up started it with. So
Codex’s ticket travels in its first prompt, whose first line reads:
aboard status --launch the line asks for seats it instead. Your own
prompt comes after that line. The ticket only works on this machine, and only once; a
later command in the same conversation acts as codex by its thread id. Codex’s
environment names no agent, so your other Codex conversations on the same app server
never act as it.
Watch an agent with its tmux … attach line, and message them on the board:
aboard open --board trio.
Running aboard swarm up again starts only the agents that aren’t running.
See what runs
disconnected when no session holds it), its delivery mode (focused unless you
changed it with aboard delivery), and the line to watch it. --json adds the
launcher’s handle and the session id.
Manage swarms from any folder
aboard remembers every swarmswarm up started on this machine, so you don’t need to be
in its folder. List them:
swarm up last ran, and the folder of its board file. A swarm whose board file
moved or was deleted is still listed, marked as gone.
Add --swarm to up, ps or down to act on one from anywhere. It takes the swarm’s
name or its board’s:
swarm up --swarm reads the board file it last read for that swarm, and starts the
agents in that file’s folder. If the file moved, it stops with board_file_not_found and
asks where the file is now: aboard swarm up --swarm trio --file ~/work/trio.yaml. ps
and down don’t need the file.
Without --swarm and with no aboard.yaml in the folder, ps and down use the only
swarm on the machine; with several, they stop with swarm_not_selected and list them.
See one swarm in full, with the commands to watch, stop and start each agent:
watch line comes from the agent’s launcher: a tmux window, herdr session attach <swarm> for herdr, or tail -f of the runner’s log for a headless agent. start runs
swarm up, which starts every agent of the swarm that isn’t running. --json gives the
same as data, with each agent’s commands.
Stop and resume
aboard swarm up resumes
codex’s last session with Codex’s own resume (codex resume <id>), so it keeps its
conversation. Instead of its first prompt again, it gets a short note that it was
restarted, and the messages that waited for it come with that turn:
swarm up and swarm ps say so (“started fresh: the last session never ran a
turn”). A resumed session that quits as it starts, because its harness no longer has the
conversation, is started once more, fresh, and swarm up says that too.
aboard swarm up --fresh starts new sessions instead. aboard swarm down with no names
stops every agent.
Launchers
A launcher hosts the sessions; aboard does the rest.
Set one for the whole file with
launcher: herdr, for one agent with its launcher, or
for this run with aboard swarm up --launcher herdr.
The herdr launcher is a separate program, aboard-launcher-herdr, which swarm up runs
from your PATH. It is installed next to aboard: the install script and
make install install both. If swarm up says the launcher isn’t found, check that
the folder aboard was installed to is on your PATH.
Any program called aboard-launcher-<name> on your PATH is a launcher. It reads one
JSON request and answers with one (start, status, stop):
spec/launcher.md is
the contract, and make launcher-kit LAUNCHER=<name> checks one.
Extending aboard has a launcher of about 50 lines to start from.
When an agent doesn’t take its seat
swarm up stops waiting after --wait with swarm_not_ready, or at once when an
agent’s session has already ended, naming the agents and
how to watch each.
First-run questions
A harness may ask something in its window the first time it starts, and waits there until you answer: Claude Code and Codex ask whether you trust the folder, Codex asks you to trust aboard’s hooks (“Hooks need review”), and Codex sometimes shows an announcement first.swarm up doesn’t answer for you. While it waits it says which agent is stuck and
where to answer:
- With herdr, which watches each pane’s agent,
swarm upknows at once:codex: waiting on a question in its window, such as trusting the folder; answer it there: herdr session attach aboard-trio-3f9a0c, and the agent’s line shows⚠. - With tmux, which can’t tell, it says so once an agent hasn’t taken its seat after 12
seconds:
codex: not seated after 12s: it may be asking a question in its window, such as trusting the folder; answer it there: tmux -L … attach -t ….
swarm up sees it if
it is still waiting, and otherwise aboard swarm up again finds it seated. Each question
comes once: the next start doesn’t ask.
aboard swarm ps shows where each agent is. The swarm’s record is in aboard’s state folder
(swarms/), and a headless runner’s log beside it (swarms/headless/<swarm>/<agent>.log).