2026-02-07 13:41:05 +00:00
|
|
|
|
# OpenClaw Mission Control
|
|
|
|
|
|
|
|
|
|
|
|
Web UI + API for operating OpenClaw: managing boards, tasks, agents, approvals, and gateway connections.
|
|
|
|
|
|
|
2026-02-07 15:42:09 +00:00
|
|
|
|
## Active development
|
|
|
|
|
|
|
|
|
|
|
|
OpenClaw Mission Control is under active development. Expect breaking changes and incomplete features as we iterate.
|
|
|
|
|
|
|
|
|
|
|
|
- Use at your own risk for production workloads.
|
|
|
|
|
|
- We welcome **bug reports**, **feature requests**, and **PRs** — see GitHub Issues: https://github.com/abhi1693/openclaw-mission-control/issues
|
|
|
|
|
|
|
2026-02-07 13:41:05 +00:00
|
|
|
|
- **Frontend:** Next.js app (default http://localhost:3000)
|
|
|
|
|
|
- **Backend:** FastAPI service (default http://localhost:8000)
|
|
|
|
|
|
- **Data:** Postgres + Redis
|
|
|
|
|
|
- **Gateway integration:** see [`docs/openclaw_gateway_ws.md`](./docs/openclaw_gateway_ws.md)
|
|
|
|
|
|
|
|
|
|
|
|
> Note on auth (Clerk)
|
|
|
|
|
|
>
|
|
|
|
|
|
> Clerk is **optional** for local/self-host. The frontend enables Clerk **only** when
|
|
|
|
|
|
> `NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY` is set. If you don’t want to configure Clerk,
|
|
|
|
|
|
> make sure that variable is **unset/blank**.
|
|
|
|
|
|
|
|
|
|
|
|
## Quick start (self-host with Docker Compose)
|
|
|
|
|
|
|
|
|
|
|
|
### Prerequisites
|
|
|
|
|
|
|
|
|
|
|
|
- Docker + Docker Compose v2 (`docker compose`)
|
|
|
|
|
|
|
|
|
|
|
|
### Run
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cp .env.example .env
|
|
|
|
|
|
|
|
|
|
|
|
# IMPORTANT: if you are not configuring Clerk, disable it by ensuring
|
|
|
|
|
|
# NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY is NOT set.
|
|
|
|
|
|
# (The default `frontend/.env.example` contains placeholders that you should delete/blank.)
|
|
|
|
|
|
|
|
|
|
|
|
docker compose -f compose.yml --env-file .env up -d --build
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Open:
|
|
|
|
|
|
|
|
|
|
|
|
- Frontend: http://localhost:3000
|
|
|
|
|
|
- Backend health: http://localhost:8000/healthz
|
|
|
|
|
|
|
|
|
|
|
|
### Stop
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
docker compose -f compose.yml --env-file .env down
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Common Compose commands
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# Tail logs
|
|
|
|
|
|
docker compose -f compose.yml --env-file .env logs -f --tail=200
|
|
|
|
|
|
|
|
|
|
|
|
# Rebuild a single service
|
|
|
|
|
|
docker compose -f compose.yml --env-file .env up -d --build backend
|
|
|
|
|
|
|
|
|
|
|
|
# Reset data (DESTRUCTIVE: deletes Postgres/Redis volumes)
|
|
|
|
|
|
docker compose -f compose.yml --env-file .env down -v
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Quick start (local development)
|
|
|
|
|
|
|
|
|
|
|
|
This is the fastest workflow for contributors: run Postgres/Redis via Docker, and run the backend + frontend in dev mode.
|
|
|
|
|
|
|
|
|
|
|
|
### Prerequisites
|
|
|
|
|
|
|
|
|
|
|
|
- Docker + Docker Compose v2
|
|
|
|
|
|
- Python **3.12+** + [`uv`](https://github.com/astral-sh/uv)
|
|
|
|
|
|
- Node.js (recommend 18+) + npm
|
|
|
|
|
|
|
|
|
|
|
|
### 1) Start Postgres + Redis
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cp .env.example .env
|
|
|
|
|
|
|
|
|
|
|
|
docker compose -f compose.yml --env-file .env up -d db redis
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 2) Backend (FastAPI)
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cd backend
|
|
|
|
|
|
|
|
|
|
|
|
cp .env.example .env
|
|
|
|
|
|
|
|
|
|
|
|
# deps
|
|
|
|
|
|
uv sync --extra dev
|
|
|
|
|
|
|
|
|
|
|
|
# run API on :8000
|
|
|
|
|
|
uv run uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Notes:
|
|
|
|
|
|
|
|
|
|
|
|
- If you run the DB/Redis containers, the backend should use the defaults in `backend/.env` (`localhost:5432` and `localhost:6379`).
|
|
|
|
|
|
- Database migrations:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cd backend
|
|
|
|
|
|
uv run alembic upgrade head
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### 3) Frontend (Next.js)
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cd frontend
|
|
|
|
|
|
|
|
|
|
|
|
# Configure API URL (and optionally disable Clerk for local dev by removing/blanking Clerk env vars)
|
|
|
|
|
|
cp .env.example .env.local
|
|
|
|
|
|
|
|
|
|
|
|
npm install
|
|
|
|
|
|
npm run dev
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
Open http://localhost:3000.
|
|
|
|
|
|
|
|
|
|
|
|
## Key concepts / high-level architecture
|
|
|
|
|
|
|
|
|
|
|
|
- **Mission Control backend** exposes a REST API at `/api/v1/*` and also hosts health endpoints (`/healthz`, `/readyz`).
|
|
|
|
|
|
- **Mission Control frontend** calls the backend via `NEXT_PUBLIC_API_URL`.
|
|
|
|
|
|
- **Postgres** stores boards/tasks/agents/etc.
|
|
|
|
|
|
- **Redis** is used for background work (RQ).
|
|
|
|
|
|
- **OpenClaw Gateway** connectivity is over WebSockets; protocol details live in [`docs/openclaw_gateway_ws.md`](./docs/openclaw_gateway_ws.md).
|
|
|
|
|
|
|
|
|
|
|
|
## Common commands
|
|
|
|
|
|
|
|
|
|
|
|
From repo root:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
make help
|
|
|
|
|
|
make setup
|
|
|
|
|
|
make lint
|
|
|
|
|
|
make typecheck
|
|
|
|
|
|
make test
|
|
|
|
|
|
make check
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
## Troubleshooting
|
|
|
|
|
|
|
|
|
|
|
|
### Frontend keeps redirecting / Clerk errors
|
|
|
|
|
|
|
|
|
|
|
|
You likely have `NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY` set (even to a placeholder). To run without Clerk:
|
|
|
|
|
|
|
|
|
|
|
|
- Remove the `NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY` line from `frontend/.env.local`, **or** set it to an empty value.
|
|
|
|
|
|
|
|
|
|
|
|
### Backend can’t connect to Postgres/Redis
|
|
|
|
|
|
|
|
|
|
|
|
- Confirm containers are up:
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
docker compose -f compose.yml --env-file .env ps
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
- If you’re running backend locally (not in compose), make sure `backend/.env` points to `localhost`:
|
|
|
|
|
|
- `DATABASE_URL=postgresql+psycopg://postgres:postgres@localhost:5432/mission_control`
|
|
|
|
|
|
- `REDIS_URL=redis://localhost:6379/0`
|
|
|
|
|
|
|
|
|
|
|
|
### Port already in use
|
|
|
|
|
|
|
|
|
|
|
|
Adjust ports in `.env` (copied from `.env.example`):
|
|
|
|
|
|
|
|
|
|
|
|
- `FRONTEND_PORT`
|
|
|
|
|
|
- `BACKEND_PORT`
|
|
|
|
|
|
- `POSTGRES_PORT`
|
|
|
|
|
|
- `REDIS_PORT`
|