I started building Open Managed Agents (OMA) to get away from the YAML and manual setup of Agent Sandbox on Kubernetes, which I wrote about last month. Running Claude day and night inside those sandboxes worked, but every new agent meant more YAML, more webhooks, more gitops. Each sandbox provider had its own lifecycle, its own credentials story, its own way to stream logs. Adding a fifth agent didn't feel like adding a row to a table — it felt like standing up a fifth service.
This post is a build log, not a launch. OMA is real and I run it, but it's a work in progress — some of what's below is solid, some is rough, and I'll call out which is which as I go.
The idea
One control plane, any sandbox, one API:
- Any sandbox backend — Cloudflare Containers (default), Kubernetes (the bridge from the previous post, or a remote gateway), NVIDIA OpenShell, E2B, Daytona, Docker/subprocess, BoxRun/LiteBox — one
SandboxExecutorinterface, one Sandbox Runtime page for health and capacity. (Cloudflare only reaches the fetch-based backends today — Docker, local k8s, LiteBox, and the E2B/Daytona SDKs run on the self-host runtime for now.) - Claude Managed Agents compatible API —
POST /v1/agents,POST /v1/sessions, SSE events; swap the base URL and a client built for Anthropic's hosted platform just works. - One console — configure an agent, pick an environment, open a session; template agents (coding assistant, researcher, ...) give you a one-click start.
- Durable sessions — append-only event log; a crashed harness resumes instead of restarting. Credentials never touch the sandbox — an outbound proxy injects them at the edge — and idle sandboxes pause, resuming on the next message.
- Your laptop as a runtime —
npx @getoma/cli bridge setupopens an outbound-only WebSocket and your machine joins as a sandbox backend, no inbound ports. (No credential-injection proxy or memory mounts over the relay yet — local dev only, for now.) - Triggers — a GitHub issue/comment or a Slack message becomes a session turn; a finished session replies back on the same thread.
- Kanban board over GitHub Issues — assign an issue to an agent from the board and it spawns a session briefed with that issue. Newest, roughest piece — filtering and assignment work; live-status updates are still in progress.
- Skills — mountable prompt fragments + files an agent picks up for a workflow without baking it into the base prompt.
- Subagents —
general_subagent, up to 10 concurrent, sharing the parent's sandbox and credentials. - MCP, vaults, memory, model providers, publishing — MCP servers registered once per tenant; GitHub/Linear/Slack/CLI credentials resolved through an outbound proxy; durable memory stores mounted as plain files; Anthropic, any OpenAI-compatible endpoint, or AnyRouter; publish an agent as a hosted chat page or embeddable widget.
Screenshots












Where it stands
Solid enough that I run my own agents on it: the control plane, durable sessions, the unified sandbox interface for the fetch-reachable backends, MCP, vaults, and notify targets. Still rough: full sandbox-backend parity on Cloudflare, the Kanban board's live updates, memory mounts over the laptop relay, and scheduled runs on the self-host runtime. Routing sessions across multiple sandboxes automatically and tracking capacity per provider isn't built yet either — it's next. I'll keep logging progress here as the rough parts firm up.
The project is Apache 2.0: github.com/duyet/oma — docs at docs.oma.duyet.net, hosted at oma.duyet.net. If you try it, the sharp edges above are exactly where I'd love the feedback.
