selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

open-managed-agents logo

Self-host open-managed-agents

@openma/sdk@1.0.2

Agent platform for any model, harness, sandbox on your infra

ReleaseOpen SourceApache-2.0
Updated8 hours ago
LanguageTypescript
Setup difficultyAdvanced
MobileResponsive
ThemeDark mode
Stars
342
Ports
8787 (HTTP API and Console UI), 4720 (OpenMatter service (Feishu integration)), 14322 (OMA Vault credential injection proxy)
Install with Docker Compose
OpenMA Console showing agent configuration, integrations, and version history in light modeModel provider selection and configuration in the ConsoleEnvironment networking and package configuration in the Console

What is open-managed-agents?

Open Managed Agents is an open-source platform for running AI agents on your own infrastructure. It handles durable sessions, execution routing, and recovery so agents work with any model provider, harness, or sandbox. The system implements Anthropic and OpenAI API contracts, providing a web Console, CLI, and TypeScript SDK. It supports SQLite, PostgreSQL, and MySQL backends, plus sandbox providers like E2B, Daytona, and LiteBox. Workplace integrations connect to GitHub, Linear, Slack, and Feishu. MCP and ACP protocols enable external tools and agents. Self-hosting is free; a hosted tier charges only for sandbox compute.

Should you self-host open-managed-agents?

open-managed-agents scores 52/100 on selfhost.directory (how scoring works) and ranks #86 of 209 in AI Agents. It has 342 GitHub stars.

It shipped 11 stable releases in the past year. The latest, @openma/sdk@1.0.2, came out on 9 October 2026. New versions land roughly every 1 days.

Setup is advanced: plan for several services and some ongoing maintenance. It is Apache-2.0-licensed and written mostly in Typescript.

Its closest alternative on selfhost.directory is Omnara (68/100, 3 304 stars). It scores higher overall, so compare the two before you pick. See open-managed-agents vs Omnara side by side.

Features

  • ACP (Agent Client Protocol) support
  • Claude Managed Agents API compatibility
  • CLI and TypeScript SDK
  • Console branding customization
  • Credential vault with outbound injection
  • Durable sessions and recovery
  • MCP (Model Context Protocol) Support
  • Multi-database backend support
  • Multiple harness support
  • Multiple model provider support
  • Multiple sandbox providers
  • OpenAI Agents API compatibilitySome advanced features like dynamic subagent controls require Node deployment; hosted Cloudflare coverage differs.
  • Subagent DelegationSingle-level delegation only; hosted Cloudflare coverage differs.
  • Web Console UI
  • Workplace integrations

open-managed-agents README

How to install open-managed-agents

Install open-managed-agents with Docker Compose

Environment variables
ANTHROPIC_API_KEY, BETTER_AUTH_SECRET, PLATFORM_ROOT_SECRET, SANDBOX_PROVIDER, PUBLIC_BASE_URL, DATABASE_URL, OMA_PORT

git clone https://github.com/openma-ai/open-managed-agents.git cd open-managed-agents cp .env.example .env

Edit .env with BETTER_AUTH_SECRET, PLATFORM_ROOT_SECRET, ANTHROPIC_API_KEY, SANDBOX_PROVIDER

docker compose up -d --build curl localhost:8787/health open http://localhost:8787

Uses SQLite + local filesystem by default. For production, configure Postgres/MySQL and S3 storage.

How to configure open-managed-agents

  • ANTHROPIC_API_KEYRequired for harness turns (any Anthropic-compatible API key).

    Required for harness turns (any Anthropic-compatible API key).

  • ANTHROPIC_BASE_URLOptional: point at an Anthropic-compatible proxy. The SDK appends `/messages` to whatever you set, so include `/v1` (provider.ts will append /v1 automatically if missing — but being explicit is clearer).

    Optional: point at an Anthropic-compatible proxy. The SDK appends `/messages` to whatever you set, so include `/v1` (provider.ts will append /v1 automatically if missing — but being explicit is clearer).

  • ANTHROPIC_CUSTOM_HEADERSOptional: extra HTTP headers comma-separated. Used when the proxy requires e.g. a sub-module gating header.

    Optional: extra HTTP headers comma-separated. Used when the proxy requires e.g. a sub-module gating header.

  • ASANA_OAUTH_CLIENT_ID
  • ASANA_OAUTH_CLIENT_SECRET
  • AUTH_DISABLEDOptional: bypass auth entirely. Every request becomes tenant_id="default". Use ONLY for local single-user demos. Production must leave this unset.

    Optional: bypass auth entirely. Every request becomes tenant_id="default". Use ONLY for local single-user demos. Production must leave this unset.

  • BETTER_AUTH_SECRETAuth secret. Required for prod — sessions are signed with it; sessions don't survive restart if missing. Generate one with: openssl rand -hex 32

    Auth secret. Required for prod — sessions are signed with it; sessions don't survive restart if missing. Generate one with: openssl rand -hex 32

  • CLICKUP_OAUTH_CLIENT_ID
  • CLICKUP_OAUTH_CLIENT_SECRET
  • DATABASE_URLOptional: switch the SQL backend from sqlite (default) to Postgres or MySQL. DATABASE_URL takes precedence over DATABASE_PATH. MySQL support requires MySQL 8.x; its native schema and CAS adapter are selected by URL.

    Optional: switch the SQL backend from sqlite (default) to Postgres or MySQL. DATABASE_URL takes precedence over DATABASE_PATH. MySQL support requires MySQL 8.x; its native schema and CAS adapter are selected by URL.

  • DAYTONA_API_KEY
  • DAYTONA_API_URL
  • E2B_API_KEY
  • FEISHU_OAUTH_CLIENT_ID
  • FEISHU_OAUTH_CLIENT_SECRET
  • GATEWAY_ORIGIN─── Integrations (Linear / GitHub / Slack on self-host) ──────────────── All three are optional. Only set the providers you intend to wire up. When PLATFORM_ROOT_SECRET is unset, the entire integrations write surface (OAuth callbacks, setup pages, webhooks, Linear MCP, GitHub refresh) is disabled — read-side CRUD still works against any pre-seeded rows. Public origin for the integrations gateway (

    ─── Integrations (Linear / GitHub / Slack on self-host) ──────────────── All three are optional. Only set the providers you intend to wire up. When PLATFORM_ROOT_SECRET is unset, the entire integrations write surface (OAuth callbacks, setup pages, webhooks, Linear MCP, GitHub refresh) is disabled — read-side CRUD still works against any pre-seeded rows. Public origin for the integrations gateway (

  • GITHUB_CLIENT_ID
  • GITHUB_CLIENT_SECRET
  • GITHUB_OAUTH_CLIENT_ID
  • GITHUB_OAUTH_CLIENT_SECRET
  • GOOGLE_CLIENT_IDOptional: account sign-in OAuth. Register callbacks at: ${PUBLIC_BASE_URL}/auth/callback/google ${PUBLIC_BASE_URL}/auth/callback/github A provider is advertised by /auth-info only when both values are set.

    Optional: account sign-in OAuth. Register callbacks at: ${PUBLIC_BASE_URL}/auth/callback/google ${PUBLIC_BASE_URL}/auth/callback/github A provider is advertised by /auth-info only when both values are set.

  • GOOGLE_CLIENT_SECRET
  • INTEGRATIONS_INTERNAL_TOKENInternal token gating /github/internal/* (refresh-by-vault). Treat as a secret. Required for the session-create credential refresh path to work. Generate with: openssl rand -hex 32

    Internal token gating /github/internal/* (refresh-by-vault). Treat as a secret. Required for the session-create credential refresh path to work. Generate with: openssl rand -hex 32

  • LARK_OAUTH_CLIENT_ID
  • LARK_OAUTH_CLIENT_SECRET
  • LINEAR_OAUTH_CLIENT_IDProvider OAuth client credentials. Each provider's "create app" wizard emits the values; paste them here. CLIENT_SECRETs go through PLATFORM_ROOT_SECRET-derived AES-GCM at rest in the per-app row, but the wrangler-provided env values themselves are operator-owned.

    Provider OAuth client credentials. Each provider's "create app" wizard emits the values; paste them here. CLIENT_SECRETs go through PLATFORM_ROOT_SECRET-derived AES-GCM at rest in the per-app row, but the wrangler-provided env values themselves are operator-owned.

  • LINEAR_OAUTH_CLIENT_SECRET
  • LITEBOX_CPUS
  • LITEBOX_MEMORY_MIB
  • MATTER_OMA_TENANT_IDMATTER_PROXY_SECRET= # openssl rand -hex 32; shared by oma-server and matter MATTER_SECRET_KEY= # openssl rand -hex 32; seals Feishu app secrets and GitLab tokens at rest MATTER_OMA_API_KEY= # an API key of the workspace Matter serves (Console → API keys) MATTER_OMA_ENVIRONMENT_ID= # environment chat sessions run in (Console → Environments)

    MATTER_PROXY_SECRET= # openssl rand -hex 32; shared by oma-server and matter MATTER_SECRET_KEY= # openssl rand -hex 32; seals Feishu app secrets and GitLab tokens at rest MATTER_OMA_API_KEY= # an API key of the workspace Matter serves (Console → API keys) MATTER_OMA_ENVIRONMENT_ID= # environment chat sessions run in (Console → Environments)

  • MATTER_URL─── Feishu (OpenMatter) — `docker compose --profile feishu up` ───────── Needs PLATFORM_ROOT_SECRET (above): Matter stores each chat's MCP bearer in a Vault.

    ─── Feishu (OpenMatter) — `docker compose --profile feishu up` ───────── Needs PLATFORM_ROOT_SECRET (above): Matter stores each chat's MCP bearer in a Vault.

  • MEMORY_S3_ACCESS_KEY
  • MEMORY_S3_BUCKET
  • MEMORY_S3_ENDPOINTMemory bucket config for remote sandboxes (daytona / e2b). When all four are set, those backends mount the bucket via s3fs at /mnt/_oma_storage and symlink per-store prefixes under /mnt/memory/<storeName>. Without them, mountMemoryStore on remote sandboxes throws — the operator must either provide an s3-compatible store or use litebox, which can use the local LocalFsBlobStore directly.

    Memory bucket config for remote sandboxes (daytona / e2b). When all four are set, those backends mount the bucket via s3fs at /mnt/_oma_storage and symlink per-store prefixes under /mnt/memory/<storeName>. Without them, mountMemoryStore on remote sandboxes throws — the operator must either provide an s3-compatible store or use litebox, which can use the local LocalFsBlobStore directly.

  • MEMORY_S3_SECRET_KEY
  • OMA_PORTOptional: override the listening port (host side). Defaults to 8787.

    Optional: override the listening port (host side). Defaults to 8787.

  • PLATFORM_ROOT_SECRETRequired: at-rest encryption key for credentials.auth and model_cards.api_key_cipher. The Cloudflare worker build refuses to start without it (and the Node self-host is moving the same direction). Generate with: openssl rand -base64 32

    Required: at-rest encryption key for credentials.auth and model_cards.api_key_cipher. The Cloudflare worker build refuses to start without it (and the Node self-host is moving the same direction). Generate with: openssl rand -base64 32

  • PUBLIC_BASE_URLPublic base URL — used for cookie domain + OAuth redirect URLs. Defaults to "*" trusted-origins if missing (only OK for local dev).

    Public base URL — used for cookie domain + OAuth redirect URLs. Defaults to "*" trusted-origins if missing (only OK for local dev).

  • SANDBOX_IMAGE
  • SANDBOX_PROVIDERSandbox provider. Required by deployable Node entrypoints. Only isolated backends are accepted: daytona — Daytona Cloud (managed Linux VM per session). Set DAYTONA_API_KEY (and optionally DAYTONA_API_URL, SANDBOX_IMAGE). litebox — BoxLite local micro-VM (Firecracker per box). Hardware isolation, no daemon. Optional: LITEBOX_MEMORY_MIB, LITEBOX_CPUS, SANDBOX_IMAGE. e2b

    Sandbox provider. Required by deployable Node entrypoints. Only isolated backends are accepted: daytona — Daytona Cloud (managed Linux VM per session). Set DAYTONA_API_KEY (and optionally DAYTONA_API_URL, SANDBOX_IMAGE). litebox — BoxLite local micro-VM (Firecracker per box). Hardware isolation, no daemon. Optional: LITEBOX_MEMORY_MIB, LITEBOX_CPUS, SANDBOX_IMAGE. e2b

  • SLACK_OAUTH_CLIENT_ID
  • SLACK_OAUTH_CLIENT_SECRET

open-managed-agents releases & version history

More in API Management

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…