fleet
Health Warn
- License — License: MIT
- Description — Repository has a description
- Active repo — Last push 0 days ago
- Low visibility — Only 5 GitHub stars
Code Pass
- Code scan — Scanned 12 files during light audit, no dangerous patterns found
Permissions Pass
- Permissions — No dangerous permissions requested
No AI report is available for this listing yet.
A general-purpose agent fleet you run yourself — any model, in a sandbox, on a budget, connected to your data.
fleet
A general-purpose agent fleet you run yourself — any model, in a
sandbox, on a budget, connected to your data.
fleet is how a whole department adopts AI agents without losing sleep: every
tool call sandboxed, every turn metered against a budget, every credential held
server-side, and every working setup versioned so it runs again tomorrow — for
the next person, on a schedule. MIT-licensed, on your infrastructure: your
compute, your data, your know-how. You own the means of production.
See it in action
One story, three surfaces: plan the work in chat, automate the
follow-through, ride along from anywhere. The web demos are real recordings —
real model, real sandbox, real scheduler
(how they're made).
Chat — plan the kickoff, live (real model + sandbox)

Operations Center — the follow-through, automated (real scheduler)

Terminal chat (fleet chat) — the same fleet, from your shell

More: screenshots of every surface.
Contents
- See it in action · Why fleet · Batteries included · Built for trust · Architecture at a glance · Standards
- Repository layout · The client-config bundle · No lock-in · Development
- Deploy · Operating fleet · Documentation
- Built by Elcano · Contributing · License
Why fleet
If your team keeps reaching for the same agent recipes — the same prompts, the
same connected tools, the same guardrails — fleet is the place to standardize
them.
Any model. fleet runs its own native agent loop and lets you choose the
best model for each task rather than hard-wiring one vendor. You decide,
at the model layer, who sees your data — task by task, and you can
change your mind tomorrow.Sandboxed by default. Model-authored local execution — bash, Python, and
file I/O — runs in an ephemeral rootless-Podman container with no fast path
around it. MCP calls are a documented host-side broker exception so their
credentials never enter the sandbox or model context. Bundle MCP and inline
HTTP-tool execution is owned by a dedicated broker subprocess; the main
agent process retains only public catalog metadata and the call transport.
Per-user remote MCP token acquisition and calls use the same child-owned
scoped boundary (ADR-0040).Two isolation tiers, one config line. Set
sandbox.runtime: kata(orlibkrun) and every sandbox container becomes a dedicated KVM microVM
(one per turn / scheduled run / persistent-REPL conversation) — escape now
takes a hypervisor CVE, not a container break-out; fail-closed preflight at
boot.docs/SANDBOX-RUNTIMES.md.Cost-controlled. Per-turn cost and token ceilings, an iteration cap,
and a timeout — enforced, not advisory. A runaway loop costs a capped turn,
not an open-ended invoice.A real scheduler. Priority queues with anti-starvation, opt-in retries
with backoff for transient failures only (deterministic ones never retry),
bounded log retention with optional encrypted archival, and per-key priority
ceilings. Every knob and default:docs/FEATURE-NOTES.md.Connected to your data. fleet speaks MCP: a per-deployment
connector catalog with multi-account credentials brokered host-side, per-task
tool selection, and per-user hosted-MCP connections.Your setups, packaged. Personas, playbooks, skills, connectors, branding,
and model defaults live in a versioned client-config bundle (see below) —
standardize once, reuse everywhere.MIT-licensed and observable. Structured observer events for every turn —
each tool call, result, token count, and cost — so you always know what an
agent did and what it cost.
Batteries included
fleet ships usable on day one — the platform pieces you'd otherwise assemble
yourself are already in the box, tested, and governed by the same core:
- An MCP connector library, two trust classes deep. Your bundle's own
connectors run as fixed host-side broker operations (not model-authored
sandbox code), and a
curated directory of hundreds of verified vendor-hosted MCP servers
(GitHub, Google, Notion, Slack, Stripe, X, OpenRouter, Hugging Face, AWS, …)
is one OAuth click away — each explicitly badged Bundled vs Third-party
so users know what they're opting into (docs/MCP-CATALOG.md).
Inlinehttp_toolscover the "just call this REST endpoint" cases without an
MCP subprocess. - A real scheduler, not a cron wrapper. Priority queues with
anti-starvation, transient-only retries with backoff, SLA tracking, dead-letter- replay, per-task sandbox limits, structured JSON output (
output_schema),
live SSE run streams, batch/import/export, and an Upcoming-runs view.
- replay, per-task sandbox limits, structured JSON output (
- Automation surface for your own ecosystem. Typed API keys + an
OpenAPI-specified HTTP API to enqueue and consume governed agent jobs from CI,
cron, bots, or other tasks (docs/BUILDING-ON-FLEET.md);
inbound HMAC webhooks and email triggers to spawn work; outbound
signed-webhook/email/browser-push notifications when it finishes. - Memory that can be trusted. Typed, provenanced user memory with
approval-gated writes, pin/retire lifecycle, human-confirmed supersession,
and a derived temporal knowledge graph with as-of queries
(docs/MEMORY.md). - Team surfaces. Projects/spaces with shared instructions + curated
connectors + shared memory, team RBAC, read-only share links, conversation
branching, conversation labels, and a dataset/table agent for row-by-row
background work with human-approved write-backs. - Quality gates for your agents. A self-hosted eval & regression harness
(fleet eval) that replays golden prompts through the real loop and gates
model/bundle changes (docs/EVALS.md); per-run error
analysis; optional PII redaction. - Three clients out of the box. The web chat UI, the Operations Center,
and a full terminal client (fleet chat) — all thin views over the same
governed API.
Built for trust: governed, auditable delegation
The hard part of agent adoption isn't technical anymore — the real barriers
are human: does it work, can I trust it, and am I willing to hand over
control? fleet earns each yes with engineering, not promises: sandboxes,
budgets, approvals, and receipts.
Can it do the job — reproducibly? The whole agent setup — prompts,
personas, playbooks, skills, connectors, model defaults — is a versioned
bundle (a plain git repo), so the setup that worked runs again next time, for
the next person, on a schedule. Every turn streams structured observer
events (each tool call, result, tokens, cost), so you judge work from its
trace, not just its final answer.
Should I trust it with this task? Limits that actually fire — cost ceiling,
token ceiling, iteration cap, timeout — and a persisted per-turn audit trail.
fleet owns execution end to end: there is no self-executing agent it can only
observe, so the log records what actually ran.
Am I comfortable handing over control? The agent has no direct power: every
model-authored local tool call goes through the sandbox under host policy
(optionally a KVM microVM), credentials stay host-side, sensitive actions raise a
default-deny allow/deny card with no "approve all", and unattended scheduled
work is fail-closed — network-sealed by default with an end-of-run verifier
(docs/AGENT-RUNTIME.md). The out-of-process MCP
address-space boundary is active for bundle MCP servers, inline HTTP tools, and
per-run hosted MCP clients. Explicit remote-MCP OAuth/connectors HTTP endpoints
remain parent-side control-plane code
(ADR-0040). One caveat to respect: the
bundle's own host-side MCP servers do receive brokered credentials by design,
so treat bundle write access as production access
(SECURITY.md).
Architecture at a glance
A single fleet process runs, on one box:
- Interactive real-time chat sessions (streamed over SSE), and
- A scheduling engine that runs recurring background agent tasks,
both executing their tool calls inside the same rootless-Podman sandbox, and
both driven by one unified agent runtime (internal/agentcore).
Standards
fleet is built on open protocols. We list only what is actually implemented and
tested in this repository:
- MCP — Model Context Protocol. A merged Go client (stdio + HTTP) drives the
deployment's connector catalog, and each user can OAuth into hosted MCP
servers from the GUI (OAuth 2.1 + PKCE, dynamic registration, tokens encrypted
at rest, host-side). ADR-0009. - Agent Skills. The bundle's
skills/dir holds capabilities in the open
Agent Skills format, loaded with
progressive disclosure (name + description in the prompt; the agent readsSKILL.mdand runs bundled scripts on demand, in the sandbox). Invoke
explicitly with/skill-namein chat.
The orchestrator HTTP API is published as an OpenAPI 3.1 contract atdocs/openapi.yaml; a CI test
(cmd/fleet/openapi_drift_test.go) keeps its routes + auth schemes in lockstep
with the shipped router, and gates the body schemas of every named component
schema bound to a Go model (property existence, required integrity,
type-kind). Inline operation schemas, schemas without a reflectable Go type,
and status codes remain documentary.
Repository layout
Abridged — the load-bearing directories, not every package. internal/ alone
holds roughly forty packages; cmd/ also carries the test/bench helpers
(fake-llm, fleet-bench), and scripts/ and .github/ hold the operator
scripts and the CI definition.
cmd/
fleet/ the one unified binary — server (`fleet serve`: chat HTTP/SSE + orchestrator HTTP + scheduler + worker pool) AND operator CLI (every other verb)
fleet-admin/ transitional deprecation shim — forwards to `fleet`; removed after one release
sandbox-probe/ deploy-time sandbox smoke test
internal/
agentcore/ the one unified run loop + shared agent primitives (cost ceilings, policy)
agent/ input sources, observers, policies, finalize (interactive + scheduled)
runner/ in-process capped worker pool (the old "gig", folded in)
creds/ MCP credential-account store (host-side credential broker)
clientconfig/ loads the pluggable CLIENT BUNDLE (branding, MCP catalog, prompts, skills, ...)
mcp/ merged Go MCP client (stdio + HTTP)
mcpbroker/ out-of-process bundle MCP broker transport + scoped sessions
sandbox/ the single execution backend (ephemeral container over a persistent workspace)
tools/ native agent tools (bash, python, ...)
store/ interactive (chat) Postgres layer + migrations
sched/ orchestrator/scheduler (was moc) + its migrations
httpapi/ chat HTTP/SSE/auth layer
config/ unified configuration (env loading; the MCP catalog comes from the bundle)
... (~30 more: agentcore's neighbours, netguard, mcpoauth, observability, ...)
scripts/ bootstrap / update / doctor, the sandbox image build, and the CI policy checks
.github/ workflows (the CI + SAST gates), CODEOWNERS, dependabot, the CodeQL gate filter
web/ one Next.js app: /chat and /orchestrator
config/default/ the GENERIC client bundle baked into the repo (runs bare),
including config/default/sandbox/Containerfile — the sandbox
image is a per-client bundle artifact (build-on-box default)
docs/ architecture & operator docs; docs/adr/ records the load-bearing
Architecture Decision Records behind the invariants
Naming note (v1 glossary):
chat,moc,gig, andcutlass— which
appear in code comments, env-var prefixes (CUTLASS_*), docs, and the
CHANGELOG — are the names of the internal predecessor stack that fleet
consolidates and replaces. They are historical aliases inside this repo, not
separate public projects.
The client-config bundle
fleet ships no client-specific content. It loads a client-config bundle
from FLEET_CLIENT_CONFIG_DIR: manifest.yaml supplies branding, model
defaults, the connector catalog, and tool policy; system_prompts/,personas/, protocols/, skills/, and mcp/ supply the content. Contract:config/default/README.md.
Three ways in: run bare (the in-repo generic bundle — good for a first
look), fork the public template
(ElcanoTek/example-config for
the single-box podman install,ElcanoTek/example-kubernetes-config
for the Kubernetes one — they are peers, not parent and child), or
point at your own private repo (the box needs a read-only fine-grained PAT
to clone it). bootstrap --client-config <git-url[#sha-or-tag]|path> sets it
up; pin the ref in production — the bundle runs host-side under the service
identity (SECURITY.md), so a bundle change should be a
deliberate operator action, not a silent pull.
No lock-in: your agent IP is portable
Everything that defines how your agents behave lives in the client-config
bundle — a plain git repo or directory you own (FLEET_CLIENT_CONFIG_DIR), not
inside fleet's database or binary:
system_prompts/— base prompts for chat and taskspersonas/— reusable agent profilesprotocols/— playbooks your agents followskills/— packaged Agent Skills (SKILL.md+ bundled scripts)plugins/— Agent Plugins (plugin.json+skills/+mcp.json), the portable package format other agent clients also
load; see docs/AGENT-PLUGINS.mdmcp/— your MCP connectors (+requirements.txt)manifest.yaml— MCP catalog, tool policy, model defaults, sandbox blocksandbox/Containerfile— the exact image your tool calls run in
These files encode how your business actually works — your prompts, playbooks,
and connectors carry real competitive knowledge. Safety here means owning them
outright, rather than trusting a vendor's roadmap to stay clear of your market.
Versioned, under your control, over an open protocol (MCP): your
agent setup travels with you — fork it per team, share it across orgs, or point
it at another MCP-capable platform. Moving off fleet doesn't mean starting
over, which keeps adoption low-risk. The public templates show the full
layout — example-config for a
single box, example-kubernetes-config
for a cluster.
Development
make build # go build ./...
make test # go test ./...
make lint # golangci-lint run
For the full build/test workflow (including the Postgres-backed Go suites, the
web app, and the Playwright e2e suites), seeCONTRIBUTING.md.
Running one task locally (fleet task run)
fleet task run executes a single task YAML to completion locally — no
server, no database — through the same governed runtime the production
scheduler uses (sandbox and credential brokering included). A debug
entrypoint, not a second execution path. (Formerly the separate cutlass
binary; its deprecation shim has been removed.)
fleet task run --log out.json path/to/task.yaml # run one task through the governed runtime
scripts/run_workflow_live.sh docs/examples/local-task.yaml # or: build the sandbox image, isolate a workspace, tail a log
See docs/examples/local-task.yaml for the
task schema (a thin mirror of the scheduled-task create shape).
Deploy
fleet runs as one fleet process on a single, vertically-scaled host: the
browser talks only to the Next.js web app, which proxies server-side over
loopback to the two Go backends the process boots (chat + orchestrator); Caddy
fronts it with TLS and routes the public /v1 API (plus /api-info, the A2A
agent card, /triggers/* and /webhooks/*) straight to those backends. Single-host is by design — crash recovery uses single-owner
DB leases and the worker cap is a per-process semaphore, so fleet scales by
moving to a bigger box, not more replicas.
git clone https://github.com/ElcanoTek/fleet.git /opt/fleet/src
sudo bash /opt/fleet/src/scripts/bootstrap.sh --postgres=local --enable-service \
--client-config https://github.com/ElcanoTek/example-config.git
# then add your OPENROUTER_API_KEY to the env file and: fleet restart
→ Full deployment guide — host sizing, the one-command web + Caddy/TLS stack,
the env file, and every option: docs/DEPLOYMENT.md.
Kubernetes shop? fleet also ships a first-class cluster path
(ADR-0049): a Helm
chart (deploy/helm/fleet) for the single-replica control plane, with agent
sandboxes running as ephemeral pods viaFLEET_SANDBOX_BACKEND=kubernetes — same loop, same security model, one
backend switch. Seedocs/DEPLOYMENT-KUBERNETES.md.
Operating fleet
The operator lifecycle is bootstrap → update → status, one box. The server
runs via fleet serve; every other verb is the idempotent operator CLI (each ascripts/ shell script wrapped by a fleet subcommand). Each service
self-migrates on start.
| Verb | What it does |
|---|---|
fleet bootstrap |
provision a box (Postgres, build, install, systemd, optional web + TLS) |
fleet update |
git pull + rebuild + reinstall the binaries in place |
scripts/fleet-upgrade.sh |
drain, swap, health-gate, and auto-roll-back on failure |
fleet status / fleet diagnose |
quick health report / redacted support bundle |
fleet doctor |
diagnose and repair box-level drift (packages, podman prereqs, unit drift; also surfaced read-only in Settings → Admin → Doctor) |
fleet restart · stop · logs |
service lifecycle |
fleet chat [--email you@org] |
terminal TUI for the agent (token auto-read on-box) |
fleet backup / fleet restore |
disaster recovery (docs/BACKUP_RESTORE.md) |
fleet timers install |
install + enable the daily backup/maintenance systemd timers on an existing box (docs/TIMERS.md) |
→ Full operator runbook — the env file, the client-config checkout, every
verb in detail, process logs, and backup/restore:docs/OPERATORS.md.
Documentation
Deep references live in docs/ so this README stays an orientation, not a manual:
| Doc | What it covers |
|---|---|
docs/DEPLOYMENT.md |
Full deployment guide — host sizing, the one-command web + Caddy/TLS stack, options |
docs/DEPLOYMENT-KUBERNETES.md |
Kubernetes as a first-class path — the Helm chart, the kubernetes sandbox backend (agent sandboxes as ephemeral pods), kind walkthrough + production checklist |
docs/OPERATORS.md |
Operator runbook — the env file, the client-config checkout, every lifecycle verb |
docs/AGENT-RUNTIME.md |
Agent runtime mechanics — per-turn sandbox, ceilings, compaction, verifier, artifacts |
docs/SANDBOX-RUNTIMES.md |
Sandbox OCI runtimes — runc / Kata / libkrun isolation tiers |
docs/CONFIG-RELOAD.md |
Which settings hot-reload without a restart, and how |
docs/SERVER-STATS.md |
Admin Server tab — lightweight CPU, memory, disk, network, and uptime status |
docs/BACKUP_RESTORE.md |
Disaster recovery — backup + restore of both databases |
docs/WEBHOOK-SIGNING.md · docs/TESTING.md |
Webhook HMAC signing · the test suite + fake-LLM seam |
docs/SCANNING.md |
The scanning stack — which of golangci-lint / ruff / govulncheck / Grype / gitleaks / npm audit / CodeQL / Semgrep owns what, what actually blocks a merge, and the known gaps |
docs/CODEQL.md |
CodeQL specifics — advanced setup, the four-language matrix, the High-band gate + accepted-findings register, and why a PR-event run certifies a diff rather than a tree |
docs/BUILDING-ON-FLEET.md |
The HTTP API as an automation substrate — keys, kicking off jobs, consuming structured output |
docs/API-CLIENTS.md |
Reaching the API from another machine — what the TLS front routes, the key store the service reads, X-API-Key, the free connection test |
docs/MCP-CATALOG.md |
The connector catalog — bundled vs third-party trust classes |
docs/adr/ |
Architecture Decision Records — the why behind the non-negotiable invariants |
SECURITY.md · CONTRIBUTING.md |
Reporting a vulnerability · contributor workflow + CI gates |
Built by Elcano (commercial support)
fleet is built by ElcanoTek. Everything in this repository is the complete,
MIT-licensed platform — there is no held-back enterprise edition. What an
Elcano engagement adds is the team that built it, working inside your stack:
- Forward-deployed engineering. Elcano engineers embed with your team, take
the workflows your people already run in chat, and make them
production-ready: scheduled, monitored, budgeted, and verified. - Custom MCP connectors & data integrations. Bespoke connectors into the
systems your work actually lives in — built, credential-brokered, and
maintained for your deployment. - Add-on capabilities. Agents and services Elcano builds and operates
beyond this repo — email-native agents, monitoring and analysis tools, and
other domain-specific pieces, packaged into your client-config bundle. - Deployment, support & operations. fleets stood up on your infrastructure
and kept healthy — upgrades, sandbox images, and model changes gated by evals
before they ship.
Engagements don't shrink the repo: client-specific work lives in each client's
config bundle, and platform improvements land here, in the open.
elcanotek.com ·
[email protected]
Contributing
Contributions are welcome — see CONTRIBUTING.md for the
build/test workflow, branch/PR conventions, and CI gates. Please also read theCODE_OF_CONDUCT.md. To report a security issue privately,
see SECURITY.md.
Acknowledgements
fleet stands on the shoulders of excellent open-source projects and open
standards. Our thanks to the teams and communities behind them:
- Podman — rootless, daemonless
containers. Every agent tool call's model-authored local execution (bash,run_python, file I/O) executes inside a rootless-Podman sandbox; there is no
trusted fast path that skips it. MCP is the documented host-side broker
exception (see above). - Kata Containers and
libkrun — the OCI runtimes behind
fleet's optional hypervisor-isolation tier: setsandbox.runtimeand every
sandbox container becomes a dedicated KVM microVM with its own guest kernel,
plugging into the same Podman invocation unchanged. - Fedora —
fedora-minimalis the base image
for the default sandbox, and we think it's the safest base in the game for
this job: a deliberately small image (less surface to attack), backed by one
of the fastest CVE-response pipelines in any distribution, with the entire
Python data stack installed as signed Fedora RPMs instead ofpipat
runtime — one audited supply chain, not a thousand PyPI tarballs. fleet
deliberately tracks the rolling tag so every on-box rebuild picks up the
current patches, and Grype scans keep the claim honest — on every main-targeting
PR that is not docs-only, plus a weekly scheduled re-scan of the existing image
(PRs intodevget no image scan; it runs at the dev→main promotion). - Model Context Protocol and its SDKs —
the open standard fleet speaks (stdio + HTTP) to reach tools and data through a
credential-brokered MCP catalog. - Agent Skills — the open skill
format fleet loads from the client-config bundle (SKILL.md+ bundled scripts,
with progressive disclosure). - Charmbracelet — fleet leans on the
charm stack end to end: Fantasy
is the Go framework underneath the multi-provider agent run loop, and thefleet chatterminal client is built on
Bubble Tea,
Bubbles,
Lip Gloss, and
Glamour — with
vhs recording the README's TUI
demo and freeze rendering its
static screenshots. - OpenRouter — unified, provider-agnostic model
routing that backs fleet's "any model, the right one per task" design.
License
fleet is released under the MIT License.
Reviews (0)
Sign in to leave a review.
Leave a reviewNo results found