Quickstart
This walks through a first run on a single machine: scaffold a config, launch
the fleet, register a repo, create a workspace, activate it, and watch it in the
GUI. It assumes fleet is on your PATH — see
Installation.
1. Scaffold a config
Section titled “1. Scaffold a config”Pick (or create) a directory to hold the fleet’s data, then:
fleet launch initThat writes ./fleet-config.yaml. Use --config-path <path> to write it
somewhere else, and --force to overwrite an existing file — without it, init
refuses rather than clobbering your config.
2. Read the generated config
Section titled “2. Read the generated config”# fleet-config.yaml — configuration for `fleet launch`.# Every section is optional; only the sections present are started.
# The fleet-wide bridge that coordinates ships and serves the fleet API.bridge: dataDirectory: ./.fleet/bridge port: 4800 name: my-fleet-bridge
# The web gui. Proxies to the bridge above by default.gui: port: 3000 # bridgeUrl: http://localhost:4800 # defaults to the local bridge
# Ships that host workspaces. Each key is the ship's default name.ships: ship-a: # source: local (the default) spawns the ship in this process. source: local fleetDirectory: ./fleet/ship-a port: 4700 # name: ship-a # defaults to the key aboveWhat each section means:
bridge— the orchestrator.dataDirectoryis whereships.jsonandrepos.jsonare persisted (resolved to an absolute path, created if missing). Omit the whole section and no bridge is started; write a barebridge:with no body and you get the defaults (./.fleet/bridge, port4800, namebridge).gui— the React dashboard.portis optional; omit it and Bun picks a free one.bridgeUrlis the bridge the GUI proxies to, defaulting to the bridge launched above it. Aguiwith neither abridgesection nor abridgeUrlis a config error.ships— a map, not a list. Each key names a ship and supplies its defaults:namefalls back to the key, andfleetDirectoryfalls back to./fleet/<key>.source: local(the default when omitted) spawns the ship in the same process;source: remotewith aurlregisters an already-running ship elsewhere instead of starting one. Two local ships may not share a port.
The full schema is in the fleet-config reference.
3. Launch
Section titled “3. Launch”fleet launchThe bridge has no users on a fresh data directory, so before anything starts it asks you to create the first admin:
fleet-bridge has no users yet. Create the first admin.username: adaemail: ada@example.compassword:confirm password:created admin "ada"That happens once. Set FLEET_BRIDGE_ADMIN_USER, FLEET_BRIDGE_ADMIN_EMAIL and
FLEET_BRIDGE_ADMIN_PASSWORD to skip the questions, which is also what you need
on a machine with no terminal — there, the prompt cannot be answered and the
launch fails instead. For a throwaway local fleet you can add
insecureNoAuth: true under bridge: and skip authentication entirely; see
authentication.
Then one process starts every configured section, in order: bridge, then each ship, each registered with the bridge as it comes up, then the GUI.
fleet-bridge "my-fleet-bridge" listening on http://localhost:4800fleet-ship "ship-a" listening on http://localhost:4700registered ship "ship-a" (http://localhost:4700) with the bridgeStarted client on http://localhost:3000/, forwarding to http://localhost:4800Ctrl-C stops all of it. Pass --config-path <path> if your config is not at
./fleet-config.yaml.
Ship registration is best-effort: if a ship cannot be reached, fleet launch
warns and carries on with the rest of the fleet.
On disk you now have ./fleet/ship-a/ (the ship’s workspace root, holding
atlas.json) and ./.fleet/bridge/ (the bridge’s roster and repo registry).
4. Register a repo
Section titled “4. Register a repo”Leave fleet launch running and open a second terminal. The bridge keeps a repo
registry — the set of repos the fleet can clone from:
fleet client repos add fleet https://github.com/firesquid6/fleet.gitfleet client repos lsThe first of these prompts for the admin you just created, and stores the session
under ~/.local/state/fleet-client-cli/ so later commands do not ask again. Run
fleet login up front if you would rather do it explicitly.
NAME URL PROVIDERfleet https://github.com/firesquid6/fleet.git customThe first argument is the repo name, which is also the directory a clone lands
under on a ship. -p, --provider <provider> records where it is hosted (e.g.
github); it defaults to custom.
fleet client reaches the bridge at http://localhost:4800 and a ship at
http://localhost:4700 unless you say otherwise. Both are options on the
client command itself, so they go before the subcommand:
fleet client --bridge-url http://localhost:4800 repos lsfleet client --url http://localhost:4700 ls5. Create a workspace
Section titled “5. Create a workspace”fleet client create fleet first-task -u https://github.com/firesquid6/fleet.git -b quickstartcreated workspace fleet/first-task on branch quickstartThe arguments are the repo name and the workspace name; -u, --url and
-b, --branch are both required. The ship clones the URL into
./fleet/ship-a/fleet/first-task on the branch you named. Neither name may
contain / or \ — they are path segments.
List what exists:
fleet client lsfleet client ls --wideSHIP REPO NAME BRANCH ACTIVEship-a fleet first-task quickstart no--wide asks the bridge for every workspace in the fleet and adds the owning
ship; plain ls asks one ship. --active / --inactive filter, and --json
prints raw JSON.
6. Activate it
Section titled “6. Activate it”A workspace is active when it has a running tmux session. That session is what an agent runs in, and what the browser terminal attaches to.
fleet client activate fleet first-taskfleet client status fleet first-taskrepo: fleetname: first-taskbranch: quickstartstate: activeship: ship-adiff: +0 -0 (0 commits ahead)status only reports the ship, diff, and agent fields while a workspace is
active — an inactive one has just a repo, name, branch, and state.
7. Open the GUI
Section titled “7. Open the GUI”Visit http://localhost:3000. The overview lists every workspace the bridge
knows about, live: the GUI subscribes to the bridge’s event stream, which is fed
by each ship’s, so creates, branch switches, activations, and agent status
updates appear without a refresh.
From there:
/repos— the repo registry, and where you register a new repo/ships— the ship roster, and where you register a ship by URL/repos/fleet/workspaces/first-task— the workspace: its diff, and a live terminal on the tmux session
Start your agent harness in that terminal. Told to work in a fleet, it picks up
the fleet-agent skill and reports its own status back with fagent agent init
and fagent agent status, which shows up on the dashboard within the same
event stream. See Running agents.
8. Clean up
Section titled “8. Clean up”fleet client deactivate fleet first-taskfleet client rm fleet first-taskdeactivate kills the tmux session and drops the agent status; rm kills the
session if needed and deletes the clone from disk. Uncommitted or unpushed work
in the workspace goes with it.
- Architecture — what the bridge and ships are doing behind these commands.
- Configuring a fleet — more than one ship, and remote ones.
- CLI reference — every command and flag.