Files
openclaw-mission-control/docs/architecture

Mission Control — Architecture

Mission Control is the web UI + HTTP API for operating OpenClaw. Its where you manage boards, tasks, agents, approvals, and (optionally) gateway connections.

Auth note: Clerk is required for now (current product direction). The codebase includes gating so CI/local can run with placeholders, but real deployments should configure Clerk.

At a high level:

  • The frontend is a Next.js app used by humans.
  • The backend is a FastAPI service that exposes REST endpoints under /api/v1/*.
  • Postgres stores core state (boards/tasks/agents/etc.).

Components

Diagram (conceptual)

flowchart LR
  U[User / Browser] -->|HTTP| FE[Next.js Frontend :3000]
  FE -->|HTTP /api/v1/*| BE[FastAPI Backend :8000]

  BE -->|SQL| PG[(Postgres :5432)]

  BE -->|WebSocket (optional integration)| GW[OpenClaw Gateway]
  GW --> OC[OpenClaw runtime]

Frontend (Next.js)

  • Location: frontend/
  • Routes/pages: frontend/src/app/* (Next.js App Router)
  • API utilities: frontend/src/lib/* and frontend/src/api/*

Auth (Clerk, required for now)

  • The codebase includes gating so CI/local can run without secrets, but real deployments should configure Clerk.
  • See frontend/src/auth/clerkKey.ts, frontend/src/auth/clerk.tsx, and frontend/src/proxy.ts.

Backend (FastAPI)

  • Location: backend/
  • App wiring: backend/app/main.py
    • Health: /health, /healthz, /readyz
    • API prefix: /api/v1
    • Routers: backend/app/api/*

Config

  • Settings: backend/app/core/config.py
  • Env loading: always reads backend/.env (and optionally .env) so running from repo root still works.

Data stores

  • Postgres: persistence for boards/tasks/agents/approvals/etc.
    • Models: backend/app/models/*
    • Migrations: backend/migrations/*

Gateway integration (optional)

Mission Control can call into an OpenClaw Gateway over WebSockets.

  • Client: backend/app/integrations/openclaw_gateway.py
  • Known methods/events: backend/app/integrations/openclaw_gateway_protocol.py
  • Protocol doc: docs/openclaw_gateway_ws.md
  • Base gateway config (getting started): docs/openclaw_gateway_base_config.md

Request flows

UI → API

  1. Browser loads the Next.js frontend.
  2. Frontend calls backend endpoints under /api/v1/*.
  3. Backend reads/writes Postgres.

Auth (Clerk — required for now)

  • Frontend enables Clerk when a publishable key is present/valid.
  • Backend uses fastapi-clerk-auth when CLERK_JWKS_URL is configured.
    • See backend/app/core/auth.py.

Agent access (X-Agent-Token)

Automation/agents can use the “agent” API surface:

  • Endpoints under /api/v1/agent/* (router: backend/app/api/agent.py).
  • Auth via X-Agent-Token (see backend/app/core/agent_auth.py, referenced from backend/app/api/deps.py).

Background jobs

There is currently no queue runtime configured in this repo.

Key directories

Repo root:

  • compose.yml — local/self-host stack
  • .env.example — compose/local defaults
  • backend/templates/ — shared templates

Backend:

  • backend/app/api/ — REST routers
  • backend/app/core/ — config/auth/logging/errors
  • backend/app/models/ — SQLModel models
  • backend/app/services/ — domain logic
  • backend/app/integrations/ — gateway client/protocol

Frontend:

  • frontend/src/app/ — Next.js routes
  • frontend/src/components/ — UI components
  • frontend/src/auth/ — Clerk gating/wrappers
  • frontend/src/lib/ — utilities + API base

Where to start reading code

Backend:

  1. backend/app/main.py — app + routers
  2. backend/app/core/config.py — env + defaults
  3. backend/app/core/auth.py — auth behavior
  4. backend/app/api/tasks.py and backend/app/api/agent.py — core flows

Frontend:

  1. frontend/src/app/* — main UI routes
  2. frontend/src/lib/api-base.ts — backend calls
  3. frontend/src/auth/* — Clerk integration (gated for CI/local)

Notes / gotchas

  • Mermaid rendering depends on the markdown renderer.
  • NEXT_PUBLIC_API_URL must be reachable from the browser (host), not just from within Docker.
  • If Compose loads frontend/.env.example directly, placeholder Clerk keys can accidentally enable Clerk; prefer user-managed env files.