A work graph for coding agents.
Self-hosted and shared by people and agents · agents run headless in sandboxes · they can't push · every run is budgeted
Getting started · What works today · Why we built it · Architecture · Contributing
Status: alpha. We run this for real work. Four of the five bases are full operational today; the fifth (improvement/learning) is designed and not built. Open Source under Apache-2.0.
Once you have more than a few agents working, the hard part stops being the agent. It's coordination: what work exists, what blocks what, who picked it up, and what's waiting on a human. You need a graph of work for that, so agents can hand off and nobody does the same task twice.
OpenBases is that layer, and it runs real work across Datopian, the agile data consultancy that builds it. It is for teams already running Claude Code, Codex or OpenCode who need to track, limit and review what those agents do.
- The work graph is the control plane. People and agents read and write one graph of work (Beads on Dolt), from a browser or through MCP.
- Headless on a server, not on a laptop. Gas Town needs somebody at a terminal. We replaced its orchestration with a plain runner, and every run became attributable to a piece of work.
- Boring plumbing; models only for judgement. Dispatch, health checks and reconciliation are plain code, so idle patrol cost went from $13 a day to zero.
- Model choice is configuration, and measured. The default worker moved from GLM 5.3 Flash to Gemini 3.8 Flash when real work showed GLM looping. Any bead can ask for Claude.
- Every run is budgeted, and unknown means no. The bead's ceiling, else its project's, else its cell's, is checked before anything is spent.
- Agents are untrusted. Each runs in a sandboxed cell with no git credential. The platform opens the pull request and a person merges. Nothing approves itself.
- Meet people where they already work. Claude, Claude Code and Codex connect over MCP, and what you see there is exactly what you see in the browser.
The evidence for each, and the mistakes we learnt from: Why we built it. How the pieces fit: Architecture.
| If you want to… | Start with |
|---|---|
| Understand what it is | Why it's built this way, then ARCHITECTURE.md |
| Try it, or deploy it | docs/getting-started.md: on your laptop, on your own servers, or on a deployment that exists |
| Judge whether to trust it | How it fits together and the threat model |
| Know why it is built this way | docs/why.md, one page; then the ADRs in docs/adr/ |
- On your laptop, in about ten minutes: the interface, the API and the MCP server against an empty organisation. No agents. Getting started, part 1.
- On your own servers: two Hetzner nodes behind Cloudflare, a GitHub App, about a day. Part 2.
- On a deployment that exists: connect Claude, Claude Code or Codex and run your first piece of work. Part 3.
claude mcp add --transport http openbases https://<your-host>/mcpWhat it is like to use. You talk to Claude or Codex as you already do; it files beads into the shared graph through MCP. You dispatch one, or let the dispatcher pick up what is ready. A pull request arrives on GitHub with its cost next to it, and you review and merge.
What else is out there. Three groups. Session managers (Conductor, Vibe Kanban, Kanbots, Emdash and a dozen more) run several Claude Code or Codex sessions in parallel on one laptop, often as a kanban; a good job, and a different one from holding a team's work. Agent sandboxes (NVIDIA OpenShell, Runtime, OneCLI) answer "how do we let a team run agents safely" with a confined runtime and credentials kept out of the agent; they do not hold the work. Orchestrators break work up and hand it off: Gas Town, Paperclip, Claude's Agent Teams, Optio. OpenBases is an orchestrator with the sandbox group's stance, built around one graph of work for the whole company.
Gas Town. We started on it and kept Beads, its work graph. Gas Town is built to be driven by a person at a terminal, where tmux sessions exist because somebody made them, and its patrol roles are model sessions. Our nodes have nobody at a terminal, so we replaced the orchestration with a plain runner and a monitor that makes no model calls (ADR-0023, ADR-0019).
Paperclip. Closest in ambition: self-hosted, issues with dependencies, budgets with hard stops, approval gates, optional Bubblewrap confinement. We did not adopt it because its isolation unit is the company and ours has to be the client engagement inside one; it deliberately does not open pull requests; and its approvals are not bound to a digest of what was approved. Its review policies and budget scoping became design inputs (ADR-0017).
| Where it runs | Unit of work | Isolation | Who lands the result | |
|---|---|---|---|---|
| Session managers | your laptop | a session or card | one person's machine | you |
| Agent sandboxes | a confined runtime | a run | the product's point | your own tooling |
| Gas Town | a machine with a terminal | beads in convoys | a worktree per polecat | its merge queue |
| Paperclip | your server | issues with heartbeats | per company; Bubblewrap optional | its approvals; no PRs |
| OpenBases | your server, headless | a bead in one company graph | a Linux user per cell, no git credential, a budget | the platform opens a PR, a human merges |
Four layers. You and your assistants file and review work. The work graph holds it until it is ready. The runner checks the budget and gives it to an agent in a sandboxed cell. The foundations (Cloudflare Access, AI Gateway, GitHub) handle identity, spend and the pull request. The full picture, with the security boundaries: ARCHITECTURE.md.
Updated 5 November 2026. If this table and the code disagree, the code is right and this is a bug.
| Base | Capability | State |
|---|---|---|
| Work | Login via Cloudflare Access; projects, work, inbox, ask in the browser | works |
| Work | Remote MCP (/mcp) with Access Managed OAuth; wg CLI; wg mcp stdio |
works — confirmed clients in the runbook |
| Work | File a plan as beads under a project, from MCP, the CLI or the API (free, no agent); create a project and attach repositories from MCP | works; agent-run planning was removed on 10 September |
| Work | Bead detail — outcome, the agent's own words, harness and model, cost, pull requests | works in the API, MCP and the bead page; a run in flight reports its harness and model, and says when its cost has not been imported yet |
| Work | Role-permission matrix enforcement | seeded; enforcement flag off until every role has a real user |
| Knowledge | Meeting transcript → typed candidates → human review → bead or knowledge PR | works via API and MCP; no review page in the interface — review is an API call today |
| Attention | Ranked inbox of witness and monitor escalations; four fixed chief-of-staff questions | works; approvals have no producer yet, free-text ask is by design absent |
| Execution | Dispatch → agent edits in the rig → branch → pull request → state next to the bead | works; ready beads run in parallel, up to three per cell by default |
| Execution | Acceptance check: a judge model scores the delivered change against the bead's acceptance criteria (ADR-0029) | shadow mode: the verdict is recorded on the bead and blocks nothing |
| Execution | Per-bead budget refusal; cost per bead from gateway import | works (cost arrives on an hourly import) |
| Execution | Isolated cells, one rig per repository, deterministic witness, wg-browse |
works |
| Execution | A repository's own build or test command run against the change, with one retry | works where the cell can run it; not enabled for any repository yet, and PortalJS does not fit — npm ci alone needs 7m5s against a 7.5-minute budget |
| Improvement | Evidence-backed change proposals with tests | designed, not built |
| — | Local make dev stack |
not assembled; run control-api directly |
| — | Deploy on merge to main |
works, to staging |
| — | Production deployment | not yet; staging only |
OpenBases started as a way to run Gas Town and
Beads for a whole company instead of one laptop, under the name
Workgraph — which is now the name of the work base. Beads stayed: the work graph, its Dolt history and its
CLI are what agents and people share. Gas Town's orchestration did not survive contact with a headless
node, and on 26 August 2026 we replaced it with a direct runner — a working directory, a settings file,
one command — and a deterministic health monitor; the model bill roughly halved, and every agent run
became attributable (ADR-0023). The vocabulary (cells, rigs,
beads) is what is left of the town, and the thirty-one ADRs in docs/adr/ record every
turn on the way, including the ones that were wrong.
On the name. The system is OpenBases; the work base is still called Workgraph, which is what the whole thing was called until September 2026. The code has not been renamed and mostly should not be: binaries are
wg-*, the database and its application role areworkgraphandworkgraph_app, bead labels arewg-project-<slug>, and the MCP tools areworkgraph_*— all of which belong to the work base and are correct there. Where you seewgorworkgraphin this repository, it is the work base or its heritage, not a rename left half-done.
Read CONTRIBUTING.md and AGENTS.md before your first change. The
short version: every change is attached to a bead; one bead, one branch bead/<id>-<slug>, one pull
request; close a bead with evidence, not an opinion; never commit a secret; never publish unreviewed
model extraction; never widen a classification; nothing approves itself. Much of this repository was
written by agents running inside it, and every rule above exists because one of them found the gap.
What we care about in review, in this order: does it actually work and how do you know; is the reasoning in the repository; is it honest about what it does not do.
Security issues: SECURITY.md — use GitHub's private vulnerability reporting. There is
deliberately no security@ alias quoted, because an address nobody monitors looks like a channel and
silently is not.
Licence: Apache-2.0, © 2026 Datopian Inc. The licence text is the canonical one from apache.org with only the appendix's copyright placeholder filled in.