statuspre-1.0 · shipping
licenseMIT or Apache-2.0
runtimego 1.26 · CGO_ENABLED=0
releasereproducible · cosign-signed
stado — three sheep standing guard amid a low-poly digital landscape of monitors and blocks ▍ stado / brand 01
noun · stado · /ˈsta.do/ · flock, herd

A herd of agents that keep your working tree clean.

stado is a sandboxed, git-native coding agent for the terminal. Sessions live in a sidecar repo until you explicitly land them. Every tool call is committed to a signed audit log. Tool execution is capability-gated through the OS sandbox.

signed wasm plugins forkable session graph capability sandbox
a session, in flight

Streamed in the TUI. Signed on the way out.

Streaming responses. Bundled tools. Every read, edit, and shell invocation lands as a signed commit on the session's trace ref.

anthropic · openai · google · local tui · acp · mcp · headless 15 bundled plugins
~/code/myproject — stado
▍ session · react-hook-fix
$ stado ▍ session 7a3f9c2 (new) ▍ provider anthropic · claude-sonnet-4-6 ▍ sandbox landlock + bubblewrap + seccomp ▍ tools 15 bundled · auto-compact on refactor useEffect in src/hooks/useScroll.ts to handle StrictMode ▸ read src/hooks/useScroll.ts ✓ ok ▸ grep "useScroll" — 7 callsites ✓ ok ▸ edit src/hooks/useScroll.ts +18 −9 ✓ ok ▸ bash pnpm test useScroll ✓ 12/12 pass ─ audit ──────────────────────────────────────── turns/4 a1f2…cc91 signed · ed25519 trace/4 9b8e…2701 signed · ed25519 land into branch fix/strict-mode-scroll

commitments Four principles, on every architectural decision.

// 01

Read-only repo.

Agent state lives outside your working tree. Landing is always explicit.

// 02

Tamper-evident.

No unsigned commits, no un-logged tool calls, no "trust us."

// 03

OS enforces.

Capabilities declared in the manifest. The kernel — not a promise — keeps tools in their lane.

// 04

No lossy abstraction.

Thinking blocks, prompt caching, provider-native features round-trip verbatim.

§ feature reel · current + accepted direction

The agent loop grew a memory, a crew, and a nervous system.

▍ EP-0002 · 0006 · 0038 · 0066/ plugin-first tools

Swap the tool. Keep the guardrails.

Bundled and installed applications share a capability-gated ABI in wazero. Bundled modules are trusted embedded release assets; installed plugins require signature, trust-store, digest, and canonical-identity verification. The stado-owned native model-tool allowlist is empty; the exact external MCP adapter is not a native product application.

▍ EP-0054/ isolated research · accepted contract

Send the archaeology elsewhere.

The accepted design launches bounded research agents for long investigations and keeps their context isolated. Its official replacement package is not shipped until signed, published, installed, and release-verified.

read the design →
▍ EP-0055 · 0056/ retained agents

A crew that survives the turn.

Retain useful workers, supervise their lifecycle, and coordinate through durable mailboxes instead of losing every collaboration when a prompt finishes.

▍ EP-0058/ measured retrieval

Measure before you adapt.

Accepted direction: shadow-rank authorized context under hard budgets before any adaptive policy changes prompts. Ranking, reports, signing, and publication remain unfinished.

read the design →
▍ EP-0052/ trajectory learning

Turn mistakes into lessons.

Staged unsigned source reviews bounded evidence into candidates only. Fresh activation awaits a separately trusted presenter; commands and UI callbacks cannot approve artifacts.

read the design →
▍ EP-0057/ durable session state

A journal, not just a transcript.

Project objectives, blockers, decisions, corrections, and deterministic mistake signals into durable state that humans and agents can query directly.

read the design →
▍ EP-0059/ durable broker

A nervous system that survives.

Crash-safe events, explicit budgets, replayable delivery, and shared supervision state give agents and automations one durable coordination backbone.

durable substrate →
▍ EP-0046/ verify command gates

“Done” runs the checks.

Configured verification commands run before completion and record their evidence. The broader independent-judge design remains intentionally deferred.

read the design →
▍ EP-0051/ lua lifecycle hooks

Policy you can program.

Constrained Lua hooks can inspect, deny, and mutate lifecycle events while stado keeps tool execution, capabilities, and enforcement inside the native harness.

hook contract →
▍ EP-0060 + EP-0066/ bounded harness guidance

The model delegates. The ceiling still holds.

Host facts say what is available and what happened. WASM application policy decides when to research, retain, learn, and coordinate without gaining tools, audit, approvals, or sandbox authority. Native stado contains no guidance wording or fallback.

read the guidance → placement correction →
▍ EP-0062 + EP-0064/ supervised work · signed application available

A watchdog for work that must be right.

/supervise belongs to the official WASM lifecycle application under foobarto/stado-plugins/supervise: it owns contract flow, cadence, detectors, prompts, and verdict policy while the broker supplies authenticated facts and enforces scoped holds, pause, and stop. Native stado has no fallback. Offline-key-signed release supervise/v0.1.1 is published for stado 0.80.0 and newer and must be explicitly installed and enabled.

§ how it works

Four primitives. Bend any of them to your shape.

▍ 01/ git-native sessions

Every turn is a commit. Fork from any of them.

Sessions live as a sidecar bare repo with per-session tree and trace refs that grow with every turn. The history is a branching graph you can walk, resume, search, and replay — not a flat chat log. Rewind to any earlier turn into a fresh session; the parent is never modified.

refs/sessions/7a3f9c2/tree · ~/code/myproject
* turns/6  edit CHANGELOG.md            a1f2…cc91
* turns/5  bash pnpm test useScroll     9b8e…2701
* turns/4  edit src/hooks/useScroll.ts  3c4d…f80a
│  ╲
│   ╲── fork → session a4e1b0  (--at turns/4)
│        * turns/4'  alt: useSyncExternalStore
│
* turns/3  grep "useScroll" — 7 sites   6e21…0042
* turns/2  read useScroll.ts            f9aa…b1c4
* turns/1  session start                0000…7a3f
signed · ed25519 / commit trace ref · every tool call tree ref · mutating turns parent never rewritten
cmdstado session fork <id> --at turns/4
cmdstado session tree <id> # interactive picker
cmdstado session land <id> fix/strict-mode-scroll (when you're ready)
▍ 02/ plugins, not internals

Almost nothing is built in. Swap any tool.

Stado core is the runtime, capability sandbox, and signed-distribution lifecycle. fs.read, shell.bash, web.fetch, rg.search — even auto-compact — ship as signed WASM plugins. Don't like one? Rewrite it in any language that targets wasm. Stado-owned native model-tool registration debt is empty; explicit lifecycle applications own larger workflows.

fs.readwasm · goswappable
shell.bashwasm · goswappable
web.fetchwasm · goswappable
rg.searchwasm · goswappable
auto-compactwasm · goswappable
Go Zig · 800 B Rust any wasip1 ed25519 · trust-pinned
cfg[tools].overrides = { webfetch = "webfetch-cached-0.1.0" }
cmdstado plugin init my-plugin · sign · trust · install
▍ 03/ capability sandbox

Declared in the manifest. Enforced by the kernel.

Tool execution is gated through real OS sandboxing — not a promise the agent makes about itself. Subprocess networking is mediated through a CONNECT-allowlist proxy in a private netns; plugins run inside wazero with capabilities declared in the signed manifest.

ossubprocess sandboxstatus
linux landlock · bubblewrap · seccomp BPF · pasta CONNECT proxythe supported current and v1 platform; sandboxed by default ▮ shipped
wasm wazero with manifest-declared capabilitiesfs:read · fs:write · net:<host> · exec · env ▮ shipped
▍ 04/ mcp server

Bring stado's tools to your other agent.

stado mcp-server exposes your entire installed registry over stdio MCP. Mount it in Claude Code, Codex, or anything that speaks MCP — and inherit every plugin you've signed and trusted locally.

shell.bashpersistent PTY + VT100mcp
web.clientstateful · cookie jarmcp
rg · ast-grepcode searchmcp
lsp.finddefinitions · refsmcp
your-pluginwhatever you installmcp
cmdstado mcp-server
cfg[tools].overrides applies here too
§ install

Three Linux paths. Pick the one that fits your threat model.

▍ option i

Install script

One curl. Cosign-verified manifest. Lands in ~/.local/bin by default.

linuxcurlcosign
curl -fsSL https://raw.githubusercontent.com/foobarto/stado/main/install.sh | bash
▍ option ii

Homebrew

For folks who already trust the tap. Updates land through brew upgrade.

linuxbrew
brew install foobarto/tap/stado
▍ option iii

From source

Go 1.26+. Pure Go, CGO_ENABLED=0. Bundled wasm tools are built at make time.

go 1.26+linux
git clone https://github.com/foobarto/stado && cd stado && make
Verify what you're running.

Release archives ship with checksums.txt.sig + checksums.txt.cert (cosign keyless, Rekor-logged) — the live verification path. The minisign airgap path is wired end-to-end in the release pipeline (pubkey embedded via ldflags + a CI signing step); it activates the moment the project's release key is provisioned, at which point stado verify --show-builtin-keys prints the embedded root offline and checksums.txt.minisig ships alongside each release.

cosign keyless · minisign-ready keyless cert · GHA OIDC issuer
sha256 manifest · per-asset · Rekor-logged
§ providers · surfaces

Point it at any model. Drive it from any shell.

Anthropic
claude · provider-native thinking
$ ANTHROPIC_API_KEY
OpenAI
gpt · reasoning content preserved
$ OPENAI_API_KEY
Google
gemini · prompt caching round-trips
$ GOOGLE_API_KEY
Local · OpenAI-compat
ollama · lmstudio · llama.cpp · vllm
$ STADO_DEFAULTS_PROVIDER
‹ tui ›
Terminal UI

Bubbletea. Streaming. Slash commands. Model picker. Theme picker. Explicit lifecycle applications.

‹ run ›
One-shot CLI

stado run --prompt "…". With or without the audited tool loop.

‹ acp ›
Editor (ACP)

Speaks Zed's Agent Client Protocol. Drive from your editor.

‹ mcp ›
MCP · both ways

Run as a server (mcp-server) or consume capability-gated MCP servers via config.

‹ rpc ›
Headless JSON-RPC

Long-running daemon. Drive from any JSON-RPC 2.0 client.

§ supply chain

A release whose bytes you can verify.

Reproducible builds. Cosign-keyless signatures over a per-asset checksums.txt, Rekor-logged — the live path today. The stricter minisign airgap layer is wired into the pipeline (pubkey embedded via ldflags, plus a CI signing step) but is not provisioned for v0.80.x. Once its release key is provisioned, each release publishes checksums.txt.minisig and self-update verifies it without ever falling back to unsigned manifest verification — airgap-friendly. Audit the chain yourself.

versionv0.80.2 · 2026-08-15
manifestchecksums.txt · 8 artifacts
cosign▮ keyless · GHA OIDC · token.actions.githubusercontent.com
minisign▮ pipeline wired · activates on release-key provisioning
scorecard▮ openssf · best practices
break from the flock

For the Herd!

Pre-1.0 and shipping fast. Open source. Built by people who didn't want to choose between agent velocity and a clean working tree.

For the Herd!

A single sheep breaking away from the herd