apra-fleet
Run a fleet of AI agents across your devices, your providers, your workflows.
What Kubernetes did for containers, apra-fleet does for AI agents: scheduling, credentials, isolation, and observability for an agentic workforce -- on any machine, anywhere, using every LLM provider at once.
Quick Start - Live Demo - How It Works - Docs
This repository is built by the product you are looking at. An autonomous apra-fleet workflow plans, codes, reviews, tests, and ships this codebase in multi-hour sprints -- filing bugs against itself and fixing them. The recording above is a real run, not a mockup.
Why a fleet?
Running one AI agent is a demo. Running fifty -- across a MacBook in the office, a GPU box in the lab, three cloud VMs, and your CI -- is an operations problem nobody else has solved:
- Which machine runs which agent? Real devices, not throwaway sandboxes: registered, credentialed, health-checked members you already own.
- Which model does which job? Claude for review, a cheap tier for mechanical edits, a local vLLM model for private data -- all in one fleet, routed by cost tier, switchable per task.
- Who watches the agents? Durable workflows with supervisors, watchdogs, reservations, and live dashboards. Agents that die get detected. Work that stalls gets resumed. Nothing runs silently.
- Who holds the keys? Secrets entered out-of-band, never visible to any model. Per-provider permission composition. Network egress policy per credential.
One control plane. Any device. Any model. Any workflow. Any domain.
What you get
| Pillar | Concretely |
|---|---|
| Any device | Register any Windows / macOS / Linux machine (local or over SSH) as a fleet member in one command. Cloud members auto-start on demand. |
| Any model | Claude, Codex, Gemini, Copilot, Antigravity, local models (any OpenAI-compatible endpoint via OpenCode) -- mixed freely. Tier-based routing (cheap / standard / premium) keeps cost governance built in. Cross-provider review is a quality mechanism: a different model, with different blind spots, checks every change. |
| Any workflow | Workflows are durable programs, not prompt chains: multi-hour, resumable, observable, with member reservations and atomic state. Write your own; ship it to the fleet. |
| Any domain | Not just software development. The pattern fits wherever work decomposes into agent-sized pieces that need orchestration and an audit trail: nightly retail replenishment (reconcile inventory deltas, draft purchase orders for sign-off), logistics exception handling (triage a delayed shipment, re-book, notify), healthcare intake (summarize referrals, check completeness, route), back-office runs (invoice matching, compliance evidence collection). Software engineering is the vertical running today -- your domain is a workflow away. |
Watch a fleet work
Our flagship workflow, fleet-sprint, develops software autonomously: plan -> develop -> review -> deploy -> integration-test -> harvest, in cycles, until the goal is met or the evidence says stop.
It is not a toy. It builds apra-fleet itself:
- Multi-cycle sprints running for hours, unattended
- 2,300+ unit tests and an 81-file integration suite against real backends
- Files bugs against itself, decomposes them, fixes them, and blocks its own release until quality gates pass
- Every dispatch, verdict, and dollar visible live on the dashboard
A fleet that has run in production:
pm-1 Opus (premium) orchestrator
doer-1 Sonnet (standard) feature work
doer-2 Antigravity large-context tasks
reviewer Opus (premium) final review
The engine does not know what a "sprint" is; it knows how to run your workflow reliably across your fleet (see Any domain above).
Quick start (5 minutes)
1. Install -- one command via npm (Node.js 22+), or grab the standalone installer binary for your platform from Releases and double-click it (installation is the default action):
npm install -g @apralabs/apra-fleet
apra-fleet # installs for Claude Code (default)
apra-fleet --llm agy # or OpenCode/Codex/Copilot/Gemini
cd ~/.apra-fleet/bin && apra-fleet start # start the apra-fleet
2. Connect your agent. Load the fleet server in Claude Code with
/mcp (or restart your provider CLI). Your agent now has a fleet.
3. Register members -- in plain language. apra-fleet is driven conversationally through any MCP-capable agent:
"Register a local member called
doer. Register another calledreviewer. Pair them."
"Register 192.168.1.10 as
build-server. Username akhil, work folder/home/akhil/projects/myapp."
Remote passwords are collected out-of-band -- typed into a separate terminal, never the chat -- used once to set up SSH keys, then forgotten.
4. Run your first workflow:
apra-fleet workflow hello-world
Then point the fleet at real work:
apra-fleet workflow fleet-sprint \
--issue my-project-epic --members doer \
--branch fleet-sprint/first-run --base main
Open the dashboard, watch your fleet PLAN->BUILD->REVIEW->TEST->SHIP in a loop till closure
How it works
flowchart LR
subgraph ControlPlane["Control plane (your machine)"]
S[Fleet server MCP or HTTP]
W[Workflow engine]
SUP[Supervisor - ledger, watchdog, dashboard]
end
subgraph Members["Fleet members (any device, anywhere)"]
M1[MacBook - Claude]
M2[Linux GPU box - local vLLM]
M3[Cloud VM - Codex plus Gemini]
M4[Windows tower - Copilot]
end
S ---|dispatch, files, credentials| M1
S --- M2
S --- M3
S --- M4
W --> S
SUP --> W
- Fleet server: the control plane. Registers members, dispatches commands and prompts, moves files, brokers credentials. Speaks MCP, so any MCP-capable agent can drive a fleet.
- Members: real machines running provider CLIs. The server composes provider-native permissions before every dispatch; unattended modes are scoped, never blanket.
- Workflow engine: runs workflow programs with phases, retries, turn budgets, resumable sessions, and per-activity persistent state.
- Supervisor: the always-on layer -- launch and stop sprints over HTTP, member reservation ledger (no two workflows fight over a machine), crash watchdog, run history.
Explore with agents. Operate with programs.
There are two ways to orchestrate agents, and apra-fleet is built on the observation that you need both -- at different stages of a workflow's life:
- Exploration mode. While a workflow is still being discovered, let an LLM orchestrate: flexible, adaptive, and token-hungry -- every step is a decision, and every decision costs thinking.
- Operation mode. Once you know what must happen, the control flow
becomes a deterministic workflow program. Shell, git, and file steps run
through
execute_command-- zero tokens. The model is invoked only at the corners that genuinely require judgment (execute_prompt): review this diff, plan this backlog, decide this exception.
That is not a projection -- it is this repository's own e2e setup+teardown step, before and after we hardened it. Development tokens are not operating tokens: pay once to discover the workflow, then run it free.
| LLM-orchestrated (explore) | Workflow-orchestrated (operate) | |
|---|---|---|
| Control flow | the model decides each step (tokens) | deterministic program (free) |
| Shell / git / file steps | narrated through the model | execute_command, zero tokens |
| Where the model runs | everywhere | judgment nodes only (execute_prompt) |
| Cost curve | scales with every step | scales with thinking only |
| Failure mode | drift and silent retries | typed errors, resumable state |
The collapse is two-dimensional. As a workflow hardens, control flow moves from model to program -- and the judgment nodes that remain move from frontier models to cheaper ones, because a well-specified task no longer needs discovery-grade reasoning. Develop a workflow with Claude; operationalize it on OpenCode against a local or OpenRouter model. Same fleet, same workflow -- swap the members. Tier routing makes it a registration change, not a rewrite.
Only a fleet makes that trade possible. Single-provider tools cannot leave their vendor; in-process frameworks cannot move orchestration out of the token path. Because apra-fleet's unit of execution is the member -- a machine plus a provider, swappable at registration -- the same hardened workflow runs on frontier models the day you design it and on commodity models every day after.
fleet-sprint is this principle, lived: it began as LLM-orchestrated exploration; each discovered pattern was hardened into the deterministic engine; today the engine drives hour-long autonomous runs in which models are consulted only as planner, doer, reviewer, tester, and harvester.
Compare to alternatives
| Tool | Overlap | Where apra-fleet differs |
|---|---|---|
| Single-agent coding assistants | AI writes code | A fleet adds agents that review, test, and deploy each other's work -- across vendors. |
| CI self-hosted runners | Runs work on other machines | Conversational and stateful, not pipeline-triggered; agents carry context between phases. |
| SkyPilot / dstack | Multi-machine compute | Coordinates agents and their context, credentials, and permissions -- not just jobs. |
| Google A2A | Agent-to-agent messaging | An opinionated orchestration and operations layer, not just a transport. |
| Agent frameworks (LangGraph, CrewAI, ...) | Multi-agent logic | Those compose agents inside one process; apra-fleet operates agents across real machines, providers, and days-long workflows. |
When NOT to use it: a one-off single-file change needs no fleet.
Security model, in one paragraph
Secrets are entered out-of-band into a credential store and referenced as
{{secure.NAME}} -- resolved server-side at execution, never visible to
any LLM or log. Credentials scope to members, expire on TTL, and can carry
a network egress policy (allow / deny / confirm). Every member runs with
composed, provider-native permission files -- allow-listed tools, not
god-mode. VCS access is provisioned and revocable per member.
The packages
| Package | What it is |
|---|---|
apra-fleet |
The fleet platform: server, CLI, member management, credentials, workflows runtime |
packages/apra-fleet-se |
The software-engineering vertical: fleet-sprint engine, agent contracts, integration suites |
packages/apra-fleet-workflow |
Workflow authoring runtime: state, viewer, checkpointing |
packages/fleet-api-contract |
Typed API contract shared by server and clients |
Status and roadmap
apra-fleet is under active development -- by its own fleet. Current focus: hardening autonomous sprint execution (the toughest workflow we know of), supervisor-orchestrated multi-sprint operation, and the workflow SDK for third-party verticals.
Documentation
| Topic | Link |
|---|---|
| Codebase wiki (architecture, internals, AI Q&A) | DeepWiki |
Install, uninstall, the --llm flag |
docs/install.md |
| Choosing a provider (roles, gotchas, mixing providers, OpenCode/local models) | docs/provider-guide.md |
| Transport, service mode, and supported interfaces | docs/transport-and-service-mode.md |
| Cost model (tiering, shell-over-prompts, measured token spend) | docs/cost-model.md |
The PM skill (doer-reviewer sprints, /pm commands) |
docs/pm-skill-overview.md |
| FAQ | docs/FAQ.md |
| Troubleshooting | docs/troubleshooting.md |
Keeping Fleet updated (apra-fleet update) |
docs/features/update.md |
Live member activity (apra-fleet watch, logging.previewChars) |
docs/features/watch.md |
| Secure credentials and passwords | docs/features/oob-auth.md |
| Member category and tags | docs/features/member-tags.md |
| Enabling SSH on a remote machine (if it does not have it yet) | docs/ssh-setup.md |
| Git authentication | docs/design-git-auth.md |
| Cloud compute | docs/cloud-compute.md |
| Architecture | docs/architecture.md |
| Hub-spoke cloud migration plan (historical; see tier-3 ownership ADR) | docs/hub-spoke-master-plan.md |
Tier-3 ownership decision (fleet-dashboard vs src/hub-service/) |
docs/adr-tier3-ownership.md |
| Shared hub/dashboard API contract package | packages/fleet-api-contract/README.md |
Workflow engine internals (agent()/parallel()/pipeline(), journal, budget) |
packages/apra-fleet-workflow/docs/apra-fleet-workflow-architecture.md |
| Writing and running workflow scripts | packages/apra-fleet-workflow/docs/workflow-guide.md |
Authoring a SEA-embedded apra-fleet workflow (manifest, entry contract, launcher env vars) |
docs/authoring-workflows.md |
| Workflow launcher fleet-server resolution order (HTTP singleton vs. stdio) | docs/adr-workflow-server-resolution.md |
| Auto-sprint overview (autonomous plan-develop-review-publish loop) | packages/apra-fleet-se/docs/overview.md |
| Auto-sprint CLI reference | packages/apra-fleet-se/docs/cli-reference.md |
| Auto-sprint internals (cycle loop, stall detection, budget, topology) | packages/apra-fleet-se/docs/architecture.md |
| Auto-sprint agent role contracts | packages/apra-fleet-se/docs/role-contracts.md |
MCP client SDK overview (transports, ApraFleet API) |
packages/apra-fleet-client/docs/overview.md |
| MCP client SDK API reference | packages/apra-fleet-client/docs/api-reference.md |
| MCP client SDK getting started | packages/apra-fleet-client/docs/getting-started.md |
Community
- Questions and ideas: GitHub Discussions
- Releases: GitHub Releases
- Issues: GitHub Issues
- What is planned next: ROADMAP.md
If Apra Fleet helped you ship faster with better quality, please star the repo -- it helps others find it.
Development
Build from source (also the path for Intel Macs):
git clone https://github.com/Apra-Labs/apra-fleet && cd apra-fleet
npm install && npm run build && npm test
See CONTRIBUTING.md to contribute.
License
Apache 2.0 -- see LICENSE.
Stop babysitting agents. Start operating fleets.
No comments yet
Be the first to share your take.