Self-hosted · open source · PolyForm Noncommercial

From an idea you’ve argued with, to a pull request something else reviewed.

Custos runs the whole software lifecycle with agents: a steering partner that pushes back on the idea, a product owner that shapes it into epics, an engineering manager that decides who builds what and on which model, engineers working in isolated checkouts, and a QA agent that actually runs the code before anything is called done.

Four tabs, one direction of travel.

Every project in Custos is the same four surfaces. Work only ever moves one way through them, and each handoff is a real artifact — a brief, an epic, a ticket, a branch — not a prompt passed between bots.

01
Steering Co

Argue the idea out with something that pushes back. Runs on your strongest model, asks one question at a time, researches instead of asking, and tells you when an idea shouldn’t be built.

02
Product Roadmap

A handoff drops a brief into the inbox. The product owner agent researches the codebase and the web, then breaks it into epics and INVEST-shaped stories with testable acceptance criteria.

03
Board

Backlog → ready → in progress → QA → complete. An engineering manager sizes and assigns, engineers implement, QA passes or bounces. The lifecycle is enforced in code, not asked for in a prompt.

04
DevOps

Deployment target, budgets, concurrency ceiling, the agent roster with live cost and quality stats, an encrypted secrets vault, and the switches that turn any of it off.

The board is the product, not a dashboard about it.

These are real screenshots from a project being built through Custos.

The Product Roadmap tab: an empty inbox on the left, and on the right an epic called ‘Simulation & station scenario scaffold’ with a written rationale and four nested stories showing ready and in-progress states.
Product Roadmap. The product owner doesn’t just emit titles — it writes down what it researched and why it sliced the work this way, including what it deliberately deferred. Stories nest under their epic with live status, so the roadmap answers “what are we building” while the board answers “what is moving”.
The Board tab: five kanban columns — backlog with 22 tickets, ready with 3, in progress with 1, QA and complete empty. The in-progress card is assigned to an agent called Simulation Architect and marked running.
Board. Five columns, drag anything anywhere yourself. Agents can’t: each role may only move a ticket into the columns it owns, so an engineer claiming its work is finished can only push to QA — it can never mark its own work complete. Here the engineering manager has created a specialist called Simulation Architect and put it on the one high-complexity ticket.
The activity feed: a list of agent runs showing role, provider and model, elapsed time, and cost, with running, succeeded and failed states.
Activity. Every run is on the record: which role, which provider and model it was pinned to, how long it took, what it cost, and whether it failed. Work covered by a Claude subscription is marked as such and doesn’t draw down the project’s metered budget — because it didn’t cost anything.

Five roles, and one of them is about money.

Each role is a real agent with its own prompt, its own model, and a contract the orchestrator enforces. You can run any of them by hand, one step at a time, before you ever let one run unattended.

Steering partner

Adversarial by design. One question at a time, always with a recommended answer, because it’s easier to argue with a position than fill in a blank. It researches anything the repository can answer rather than asking you. It can only hand off once the idea actually holds up.

📋
Product owner

Turns a brief into epics and stories, starting from the outcome rather than the mechanism. Researches competitors and prior art before deciding on shape. Owns exactly one transition — backlog to ready — and grooms conservatively, because a vague ticket in ready gets picked up and worked for real money.

💰
Engineering manager

The cost lever. Sizes every ticket, then picks the provider and model to match — free local or free-tier models for low-complexity work, the strong models reserved for work that earns them. It creates specialist engineers when the roster genuinely doesn’t cover something, and retunes them from their own record.

Engineers

Each works in its own git worktree on its own branch, so several can run at once without sharing a working copy. The manager decides the fan-out: one engineer while the foundations are being laid, a dozen cheap ones across a pile of independent bugs once the codebase is established.

🔍
QA

The only role that can call something done. Verifies each acceptance criterion by actually running the code — it can spin up Docker containers to build and exercise the change — and bounces work back with specific, actionable reasons. Every bounce is counted against the engineer that produced it.

DevOps

Takes verified work and makes it run, locally in Docker or on AWS. Estimates the recurring cost of anything it provisions before provisioning it, refuses to exceed the project’s infrastructure budget, and has to say how to roll back.

The feedback loop is the point

Every agent carries a record: tickets assigned, tickets completed, how many times QA bounced its work, what it has cost, how long it takes. The engineering manager reads that back and acts on it — a high bounce rate on medium tickets means an agent is under-modelled or its prompt is too vague, so it moves up a tier or gets a sharper instruction appended. A low bounce rate on easy work with an expensive model means the opposite.

Over-provisioning is treated as a failure in exactly the same way under-provisioning is. It just fails against the budget instead of against the deadline.

All of it runs on a gateway you control.

Custos started as a proxy that sat between Claude Code and Anthropic. That layer is still underneath — it’s what makes agents switchable, auditable and cheap.

Multi-provider, pinned per agent

Anthropic (OAuth or API key) plus any number of OpenAI-compatible providers — Ollama, OpenAI, DeepSeek, Gemini, Groq, Mistral, xAI, OpenRouter. Agents are pinned to an exact provider and model, so a deliberate choice to run something on a free local model is honoured rather than re-routed.

🛡
Permission gating

A PreToolUse hook backend. Read-only tools pass instantly; everything else is classified live, every single time, with no verb-level caching — for rm or curl, safety depends on the arguments, not the verb. In an attended chat a flagged action is surfaced to you to approve or override.

🔐
Secrets vault

Credentials are encrypted at rest and injected into agent runs as environment variables. Nothing can read a value back — not the UI, not the API. Agent output is scanned and any secret found in it is redacted before it can reach a ticket or a log. Git and the GitHub CLI are wired up without a token ever touching a remote URL.

🧠
Cross-session memory

Every exchange is logged; a curator extracts durable facts into a vector store, and a UserPromptSubmit hook searches it on each new prompt and injects what’s relevant. Memory that outlives a single session, and a full raw record of every request that ever went through.

Autonomy switches

Every role is off by default except the product owner. With a role off, its work happens only when you press the button for it — which is how you watch an agent before handing it the keys. Budgets are hard limits: spend the month’s allocation and the pipeline pauses itself.

📱
Desktop and remote

A dedicated Electron client for the four tabs, plus a browser surface for steering a session from a phone. Anthropic’s own Remote Control refuses to run once ANTHROPIC_BASE_URL points anywhere but their API; Custos brings its own.

Why this and not an agent swarm

Handing one agent a repository and a goal produces work nobody can review. Custos splits the job the way a team splits it, and makes the seams real: a brief, an epic with acceptance criteria, a ticket, a branch, a pull request, a QA verdict. Each one is an artifact you can read and disagree with.

The role boundaries are enforced in the store rather than requested in a prompt. An engineer cannot mark its own work complete however confidently it claims to have finished, because that transition isn’t one its role is allowed to make.

Steering Co │ brief ▼ Product Roadmap ──▶ product owner │ epics + stories ▼ Board ready ──▶ engineering manager │ (sizes, prices, assigns) │ in progress ▶ engineers (own worktrees) │ qa ─────────▶ QA (runs it in Docker) ▼ DevOps ──────────▶ deploy + budget every run pinned, priced and logged through Custos’s own gateway