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. The installed integration starts the
workspace MCP adapter and activates the fleet-agent skill; the agent reports
with agent_init and agent_status, and updates appear 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.