The lifecycle
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.
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.
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.
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.
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.
See it
The board is the product, not a dashboard about it.
These are real screenshots from a project being built through Custos.
The agents
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.
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.
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.
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.
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.
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.
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.
The substrate
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.
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.
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.
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.
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.
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.
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.