Node + Docker (no Cloudflare)
docker compose up. Single Node process, SQLite or Postgres, local sandbox. Run on a VPS, your laptop, fly.io, your k8s cluster — anywhere with Linux/macOS. No Cloudflare account.
You can run all of openma — the API, the Console, the integrations gateway, and the agent runtime — yourself. The same code that powers openma.dev is the code in the public repo; nothing is held back.
Pick the one that matches your hosting story:
Node + Docker (no Cloudflare)
docker compose up. Single Node process, SQLite or Postgres, local sandbox. Run on a VPS, your laptop, fly.io, your k8s cluster — anywhere with Linux/macOS. No Cloudflare account.
Cloudflare Workers
wrangler deploy. Three Workers + DO + Containers + D1 + R2 + KV. Edge-distributed, no host management. Requires a Cloudflare Workers Paid plan.
Same harness, business logic, event log, and crash-recovery semantics
on both — they share packages/* (every store sits behind a port +
adapter). Switch between them by changing env vars, not code.
| Node + Docker | Cloudflare | |
|---|---|---|
| Where it runs | Your VPS / Mac / k8s / fly.io | Cloudflare Workers + DO + Containers |
| Storage | SQLite or Postgres + local FS | D1 + KV + R2 |
| Sandbox | LocalSubprocess / LiteBox / Daytona / E2B / BoxRun | Cloudflare Sandbox (Containers) |
| Time to running | ~2 min | ~10 min once configured |
| Best for | OSS / on-prem / no CF account / data-resident | Edge scale / no host mgmt / already on CF |
| Cost floor | Hetzner €5–50/mo, or your own hardware | Workers Paid plan ($5/mo) + usage |
For the Node + Docker deploy, see Node + Docker.
The Cloudflare deploy is four Workers plus a set of bindings:
| Worker | Purpose |
|---|---|
apps/main | REST API + Console static assets. The front door. |
apps/agent | Session Durable Objects + sandbox Containers. Where agents actually run. |
apps/integrations | OAuth callback + webhook gateway for Linear / GitHub / Slack. |
apps/docs | This site. (Optional — only if you want your own docs.) |
They talk to each other via service bindings (Worker-to-Worker calls, no public hop). State lives in:
SESSION_DO (per-session event log SQLite), SANDBOX (per-session container).bash tool runs in).Cloudflare Workers Paid plan
Required for Durable Objects and Containers. The free plan won’t work.
A domain
You’ll point routes at it. openma.dev in our deployment; whatever you own in yours.
An LLM provider
Anthropic, OpenAI, MiniMax, or any OpenAI-compatible endpoint. You pay them directly.
OAuth apps
You’ll register your own GitHub App, Linear OAuth, and Slack app. Walked through in OAuth Apps.
In rough order of cost (highest first):
There are no openma platform fees because there is no openma platform — it’s all your Cloudflare account.
A single self-hosted deployment supports multiple tenants out of the box (the same code path the hosted product uses). On first sign-up, the databaseHooks.user.create.after hook creates a tenant row idempotently. You don’t need to seed anything.
If you want stricter isolation (per-tenant D1 databases), set PER_TENANT_DB_ENABLED=true and configure STORE_BACKENDS. See Operations.