One orchestrator over many agent CLIs. A harness is a TOML file — add one by writing it. Each call picks its own harness and model, so the model is a per-call decision rather than a per-tool setting.
You have several agent CLIs. They are good at different things. So you keep choosing between them by hand, and you keep wiring each one to a model separately — which means the same task gets a different answer depending on which tool you happened to open, and nothing records which one was right.
fleet makes that one decision instead of two. You give it a task; it picks
the harness or harnesses, asks a chooser which model and effort to use
for that specific call, runs it, merges the answers, and remembers what happened.
One *.toml in $FLEET_HOME/harnesses. Writing it registers it;
deleting it removes it. Neither needs a restart.
Point it at Jev, any OpenAI-compatible endpoint, or nothing at all. A harness declares what it can serve, and the router clamps the chooser to that.
Hooks live in the engine's call path, not in each CLI's config — so one plugin works for a harness you add tomorrow.
Every turn is journalled, so a crashed run is resumable and "last version wins" is a query rather than a convention.
Build it, or take the install script. It needs nothing but a shell.
curl -fsSL https://raw.githubusercontent.com/evergreentechnologywy/fleet/main/install.sh | sh
From source, which is the path that gives you the newest thing:
git clone https://github.com/evergreentechnologywy/fleet
cd fleet
cargo build --release
install -m 0755 target/release/fleet /usr/local/bin/fleet
Then answer two questions:
fleet onboard
Your priority is a setting, not a rewrite:
fleet config priority cost # cheapest acceptable model
fleet config priority speed # fastest first token
fleet config priority quality # most capable for the job
fleet config priority cost --harness omp # per-harness override
These are real, and each carries the flags its CLI actually needs — the part that takes an afternoon to get right per tool.
| harness | what it is | headless invocation |
|---|---|---|
omp | tools, PTY, skills, long autonomous runs | -p |
claude | careful multi-file refactors and review | -p via an Anthropic shim |
codex | strong single-shot reasoning | exec |
opencode | multi-provider, bulk edits | run |
kimi | Kimi Code | --auto -p |
grok | Grok Build | --print |
qwen | bulk edits and rewrites | --auth-type openai -p |
cline | autonomous, act/plan modes | positional |
crush | LSP-aware terminal agent | run |
commandcode | learns your codebase | -p --trust |
zeroclaw | smallest agent runtime | agent -m |
openclaw | multi-channel agent gateway | agent exec |
freebuff | free coding agent | positional |
pi | minimal, self-modifying | --print |
| any provider | OpenAI-compatible endpoint, no CLI | direct |
Adding one is writing a file. fleet catalog list --present shows what is
already on the machine that the fleet is not using yet.
A failing harness walks a fallback chain, and the answer says which one actually replied:
$ fleet run "summarise this" -H gemini
fleet: `gemini` is installed but not runnable — running `muse` instead
[answered by muse after gemini failed]
…
There is also a direct path that skips harnesses and the chooser entirely, so a broken CLI cannot take the fleet down with it:
fleet run "summarise this" --model deepseek-flash --provider deepseek
The fleet reaches a model through a harness, and a harness needs a machine. These are the ones it has been tested against.
| provider | why | notes |
|---|---|---|
| Hostinger | cheap VPS, and the fleet has a working API token for domains and DNS | renewal pricing after the first term is the usual trap |
| Maritime | Firecracker micro-VMs with a persistent disk and auto-sleep | the fleet drives them directly, including a visible desktop |
| Cloudroom | run agents in a cloud VM | local room CLI; no provisioning API at the documented URL |
| DigitalOcean | the least surprising VPS | affiliate program pays cash, separate from account credit |
| Hetzner | best price per core in the EU | — |
| Vultr | wide region coverage | referral pays on users active 30+ days |
| provider | why | notes |
|---|---|---|
| OpenRouter | many models behind one key | startup program: up to $5K credits, 500+ models |
| Together | open models, own inference | startup accelerator: credits for accepted teams |
| Fireworks | fast open-model serving | startup credits, 1-year validity |
| Groq | lowest latency | — |
| DeepSeek | strong cheap models | prepaid balance; a zero balance reads as a failed call |
| Mistral | EU-hosted | — |
Linux, macOS and Windows. The binary is one file with no runtime dependency; the Windows build is cross-compiled and deployed to a real desk by a plugin deploy target, which is also where most of the platform traps in the docs come from.
fleet deploy --to fleetnode://<host> # our own nodes
fleet deploy --to ssh://root@host # anything with a shell
fleet deploy --to docker://context # a container
This is working software used daily, and it is early. The parts that are proven are proven by running them, and the parts that are not are labelled as such rather than described as done.
Multi-harness routing, fallback chains, shared memory across nodes, deploy to Linux and Windows, the catalog and doctor, visible desktops on cloud VMs.
macOS is untested on real hardware. ACP-protocol agents need a client that speaks the session handshake. Some harnesses need a paid account to be useful, and say so.