A harness for harnesses.

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.

MIT single binary Rust no daemon required hot-reloaded config
Read the source Install in one line

The problem it removes

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.

Harnesses are files

One *.toml in $FLEET_HOME/harnesses. Writing it registers it; deleting it removes it. Neither needs a restart.

The model is a per-call decision

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.

Plugins apply to every harness

Hooks live in the engine's call path, not in each CLI's config — so one plugin works for a harness you add tomorrow.

Memory and transcripts are kept

Every turn is journalled, so a crashed run is resumable and "last version wins" is a query rather than a convention.

Install

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
Onboarding detects what is already on the machine, imports the keys you already have, and asks for nothing it can work out itself. A domain step is optional — the fleet runs on a tailnet URL with no domain at all.

Say what you optimise for

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

What it can drive

These are real, and each carries the flags its CLI actually needs — the part that takes an afternoon to get right per tool.

harnesswhat it isheadless invocation
omptools, PTY, skills, long autonomous runs-p
claudecareful multi-file refactors and review-p via an Anthropic shim
codexstrong single-shot reasoningexec
opencodemulti-provider, bulk editsrun
kimiKimi Code--auto -p
grokGrok Build--print
qwenbulk edits and rewrites--auth-type openai -p
clineautonomous, act/plan modespositional
crushLSP-aware terminal agentrun
commandcodelearns your codebase-p --trust
zeroclawsmallest agent runtimeagent -m
openclawmulti-channel agent gatewayagent exec
freebufffree coding agentpositional
piminimal, self-modifying--print
any providerOpenAI-compatible endpoint, no CLIdirect

Adding one is writing a file. fleet catalog list --present shows what is already on the machine that the fleet is not using yet.

Reliability, since one CLI always breaks

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

Run it on

The fleet reaches a model through a harness, and a harness needs a machine. These are the ones it has been tested against.

Machines

providerwhynotes
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

Inference

providerwhynotes
OpenRoutermany models behind one keystartup program: up to $5K credits, 500+ models
Togetheropen models, own inferencestartup accelerator: credits for accepted teams
Fireworksfast open-model servingstartup credits, 1-year validity
Groqlowest latency—
DeepSeekstrong cheap modelsprepaid balance; a zero balance reads as a failed call
MistralEU-hosted—
None of the links above carry a referral code yet. If you are the person who owns this site and you want them to, that is a one-line change per row — and the honest place to disclose it is right here, not in a footnote.

Where it runs

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

Status, honestly

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.

Proven

Multi-harness routing, fallback chains, shared memory across nodes, deploy to Linux and Windows, the catalog and doctor, visible desktops on cloud VMs.

Known gaps

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.