Repository navigation
Quickstart
From zero to an agent driving its own desktop, on one machine with Docker.
- Docker with Compose (Docker Desktop is fine; Linux gets you KVM speed on the VM tier later)
- ~8 GB free RAM, ~15 GB disk for images
- A model to point it at — an Ollama box on your LAN is the $0.00 path; any OpenAI/Anthropic/Gemini key also works (Connecting-Models)
git clone https://github.com/BryantVanOrden/OpenAgentFleet.git
cd OpenAgentFleet
make upmake up generates a .env with fresh secrets, builds the sandbox desktop
image, and starts the stack: orchestrator, console, Postgres, and the local
embedding sidecar. First build takes a few minutes.
Open http://localhost:8081. The first-run screen asks you to create the first administrator account — there are no default credentials anywhere.
Open the console (http://localhost:8081) and sign in. The chat leads with a
setup card: Find my model scans this machine for Ollama, LM Studio,
llama.cpp or vLLM, picks the best model, measures whether it can see
screenshots (it is shown a red square and asked the colour), and registers it.
If your engine lives on another box, I have an address takes its URL; the
same thing from the keyboard is /setup http://host:11434.
Prefer to do it by hand? Console → AI engines → add a provider. For a LAN Ollama:
-
Kind: OpenAI-compatible, Base URL:
http://YOUR-OLLAMA-HOST:11434/v1 - Model: a vision-capable model if you have one (the agent loop looks at screenshots); a text-only model still works, driving from the accessibility tree instead
More providers and fallback chains: Connecting-Models.
The home screen is one chat with every agent. The setup card's next button,
Create a bot, provisions one; /new fleet_manager Oaf does the same from
the keyboard; /bots lists who is up; then just say what you want done —
name a bot to address it, or name nobody and the running fleet divides the work.
/help lists every command. Long goals are fine: a bot keeps working across step
windows until it has seen the result work on screen, filing a progress alert at
each boundary you can cancel from.
Console → Fleet → deploy a bot (pick an archetype, or a blank one). Its desktop appears as a live stream when it's ready. Type a goal into Assign task — e.g. "Open Firefox and find today's #1 story on Hacker News" — and watch it work.
Two things worth trying in the first five minutes:
- Click the live stream. You're driving the agent's mouse and keyboard; let go and the agent carries on.
- Turn shell access off for a bot (bot settings). The agent is forced through the GUI, which is the honest demo of what the product does.
Beside the fleet channel, the chat keeps sessions — each a conversation with Oaf scoped, like a Claude Code session, to a device and a working folder.
pip install open-agent-fleet
fleetctl login
fleetctl host --root ~/Code/my-project # exposes one folder; asks before commands and writesThen in the console (or the app): + in the sessions rail → tap the header →
pick your PC and a folder under the one you exposed. From there Oaf reads and
edits files, runs commands (you approve each in the fleetctl host terminal,
or pass --yes), runs any /command, asks bots and hands the fleet work — and
every tool call shows in the thread. Drop or paste files and images and Oaf
sees them. /goal <what to reach> keeps it working with check-ins until done;
/loop 30m <what to do> repeats; /jobs and /cancel <id> manage them. On
the phone, Settings → Let Oaf use this phone connects it for notifications,
links, clipboard and speech. The threads bots keep between themselves are
listed in the same rail.
bash scripts/smoke.sh # end-to-end: provision, perceive, act, stream
bash scripts/verify-features.sh # feature-by-feature checks- Python-SDK-and-fleetctl — script everything you just clicked
- The-QEMU-VM-Tier — boot a sandbox as a real virtual machine
- Egress-Policies — restrict what a bot can reach
- The phone app (
make mobile, Flutter) — alerts and takeover from the couch
OpenAgentFleet · MIT · Repository · pip install open-agent-fleet · Found the docs claiming something the code doesn't do? That's the bug we most want filed.
Getting started
Going deeper
Help
Reference (in-repo)