| name | openclaw-mission-control |
| description | AI Agent Orchestration Dashboard for managing AI agents, tasks, and multi-agent collaboration via OpenClaw Gateway |
| triggers | ["set up openclaw mission control","deploy ai agent orchestration dashboard","configure openclaw gateway management","create agent workflow with approval controls","manage multi-agent collaboration tasks","set up openclaw authentication","troubleshoot openclaw mission control","integrate openclaw api automation"] |
OpenClaw Mission Control
Skill by ara.so — Hermes Skills collection.
OpenClaw Mission Control is a centralized operations and governance platform for AI agent orchestration. It provides a unified dashboard for managing AI agents, assigning tasks, coordinating multi-agent collaboration, and implementing approval-driven governance. Built with TypeScript, it offers both web UI and API-first access for automation.
What It Does
Mission Control serves as a control plane for OpenClaw operations:
- Work Orchestration: Manage organizations, board groups, boards, tasks, and tags in hierarchical structures
- Agent Operations: Create, inspect, and manage agent lifecycle from a unified interface
- Governance & Approvals: Route sensitive actions through explicit approval workflows with audit trails
- Gateway Management: Connect and operate distributed execution environments and gateway integrations
- Activity Visibility: Review complete timeline of system actions for debugging and accountability
- API-First Design: Support both web workflows and automation clients from the same platform
Installation
Quick Start with Installer
curl -fsSL https://raw.githubusercontent.com/abhi1693/openclaw-mission-control/master/install.sh | bash
./install.sh
The installer is interactive and handles:
- Deployment mode selection (Docker or local)
- System dependency installation
- Environment file generation
- Bootstrap and startup
Manual Docker Setup
git clone https://github.com/abhi1693/openclaw-mission-control.git
cd openclaw-mission-control
cp .env.example .env
docker compose -f compose.yml --env-file .env up -d --build
Manual Local Setup
Prerequisites: Node.js 22+, PostgreSQL, Redis
cd backend
cp .env.example .env
npm install
npm run db:migrate
npm run dev
cd frontend
cp .env.example .env
npm install
npm run dev
Access:
Authentication Configuration
Mission Control supports two authentication modes:
Local Token Mode (Default for Self-Hosted)
AUTH_MODE=local
LOCAL_AUTH_TOKEN=your-secure-token-minimum-50-characters-required
Use in API requests:
curl -H "Authorization: Bearer ${LOCAL_AUTH_TOKEN}" \
http://localhost:8000/api/organizations
Clerk JWT Mode
AUTH_MODE=clerk
CLERK_PUBLISHABLE_KEY=${CLERK_PUBLISHABLE_KEY}
CLERK_SECRET_KEY=${CLERK_SECRET_KEY}
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=${CLERK_PUBLISHABLE_KEY}
Core Concepts
Hierarchy Structure
Organization
└── Board Group
└── Board
└── Task
└── Tag (optional)
Agent Lifecycle
- Creation: Define agent with name, description, capabilities
- Assignment: Link agent to boards and tasks
- Execution: Agent processes tasks according to workflow
- Approval: Sensitive actions require explicit approval
- Audit: All actions logged in activity timeline
API Usage
Organizations
const createOrganization = async (token: string) => {
const response = await fetch('http://localhost:8000/api/organizations', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'Engineering Team',
description: 'Primary engineering organization',
}),
});
return response.json();
};
const listOrganizations = async (token: string) => {
const response = await fetch('http://localhost:8000/api/organizations', {
headers: {
'Authorization': `Bearer ${token}`,
},
});
return response.json();
};
Board Groups
const createBoardGroup = async (token: string, orgId: string) => {
const response = await fetch('http://localhost:8000/api/board-groups', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
organization_id: orgId,
name: 'Q1 2026 Projects',
description: 'First quarter project boards',
}),
});
return response.json();
};
Boards
const createBoard = async (token: string, groupId: string) => {
const response = await fetch('http://localhost:8000/api/boards', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
board_group_id: groupId,
name: 'API Development',
description: 'Backend API development tasks',
}),
});
return response.json();
};
const getBoard = async (token: string, boardId: string) => {
const response = await fetch(`http://localhost:8000/api/boards/${boardId}`, {
headers: {
'Authorization': `Bearer ${token}`,
},
});
return response.json();
};
Tasks
const createTask = async (token: string, boardId: string) => {
const response = await fetch('http://localhost:8000/api/tasks', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
board_id: boardId,
title: 'Implement user authentication',
description: 'Add JWT-based authentication to API endpoints',
status: 'todo',
priority: 'high',
assigned_agent_id: null,
}),
});
return response.json();
};
const updateTaskStatus = async (token: string, taskId: string, status: string) => {
const response = await fetch(, {
: ,
: {
: ,
: ,
},
: .({
status,
}),
});
response.();
};
Agents
const createAgent = async (token: string) => {
const response = await fetch('http://localhost:8000/api/agents', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'Code Review Agent',
description: 'Automated code review and quality checks',
capabilities: ['code-analysis', 'security-scan', 'style-check'],
config: {
model: 'gpt-4',
temperature: 0.3,
max_tokens: 2000,
},
}),
});
return response.json();
};
const assignAgent = async (token: string, taskId: string, agentId: string) => {
const response = await (, {
: ,
: {
: ,
: ,
},
: .({
: agentId,
}),
});
response.();
};
Approvals
const requestApproval = async (token: string, taskId: string) => {
const response = await fetch('http://localhost:8000/api/approvals', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
task_id: taskId,
action: 'deploy_to_production',
reason: 'Deploy feature to production environment',
metadata: {
environment: 'production',
service: 'api-gateway',
},
}),
});
return response.json();
};
const processApproval = async (token: string, approvalId: string, approved: boolean) => {
const response = await fetch(`http://localhost:8000/api/approvals/`, {
: ,
: {
: ,
: ,
},
: .({
: approved ? : ,
: approved ? : ,
}),
});
response.();
};
Gateway Management
const registerGateway = async (token: string) => {
const response = await fetch('http://localhost:8000/api/gateways', {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'Production Gateway',
endpoint: 'https://gateway.example.com',
auth_token: process.env.GATEWAY_AUTH_TOKEN,
capabilities: ['task-execution', 'log-streaming'],
}),
});
return response.json();
};
const executeViaGateway = async (token: string, gatewayId: string, taskId: string) => {
const response = await fetch(`http://localhost:8000/api/gateways/${gatewayId}/execute`, {
method: ,
: {
: ,
: ,
},
: .({
: taskId,
: {
: ,
},
}),
});
response.();
};
Activity Timeline
const getActivity = async (token: string, filters?: object) => {
const params = new URLSearchParams(filters as Record<string, string>);
const response = await fetch(`http://localhost:8000/api/activity?${params}`, {
headers: {
'Authorization': `Bearer ${token}`,
},
});
return response.json();
};
const getResourceActivity = async (token: string, resourceType: string, resourceId: string) => {
const response = await fetch(
`http://localhost:8000/api/activity?resource_type=${resourceType}&resource_id=${resourceId}`,
{
headers: {
'Authorization': `Bearer ${token}`,
},
}
);
return response.json();
};
Common Patterns
Multi-Agent Workflow
const createMultiAgentWorkflow = async (token: string) => {
const org = await createOrganization(token);
const group = await createBoardGroup(token, org.id);
const board = await createBoard(token, group.id);
const codeAgent = await createAgent(token, {
name: 'Code Generator',
capabilities: ['code-generation'],
});
const reviewAgent = await createAgent(token, {
name: 'Code Reviewer',
capabilities: ['code-review'],
});
const testAgent = await createAgent(token, {
name: 'Test Runner',
capabilities: ['test-execution'],
});
const codeTask = await createTask(token, board.id, {
title: 'Generate feature code',
: codeAgent.,
});
reviewTask = (token, board., {
: ,
: reviewAgent.,
: [codeTask.],
});
testTask = (token, board., {
: ,
: testAgent.,
: [reviewTask.],
});
{ board, : [codeTask, reviewTask, testTask] };
};
Approval-Gated Deployment
const deployWithApproval = async (token: string, taskId: string) => {
const approval = await requestApproval(token, taskId);
let approvalStatus = approval;
while (approvalStatus.status === 'pending') {
await new Promise(resolve => setTimeout(resolve, 5000));
const response = await fetch(
`http://localhost:8000/api/approvals/${approval.id}`,
{ headers: { 'Authorization': `Bearer ${token}` } }
);
approvalStatus = await response.json();
}
if (approvalStatus.status === 'approved') {
await fetch(`http://localhost:8000/api/tasks/${taskId}/execute`, {
method: 'POST',
headers: {
'Authorization': `Bearer `,
: ,
},
});
{ : };
}
{ : , : approvalStatus. };
};
Gateway-Based Distributed Execution
const distributeExecution = async (token: string, tasks: any[], gateways: any[]) => {
const executions = [];
for (let i = 0; i < tasks.length; i++) {
const gateway = gateways[i % gateways.length];
const execution = await executeViaGateway(token, gateway.id, tasks[i].id);
executions.push({ task: tasks[i], gateway: gateway.name, execution });
}
return executions;
};
Environment Configuration
Docker Deployment
AUTH_MODE=local
LOCAL_AUTH_TOKEN=${LOCAL_AUTH_TOKEN}
BASE_URL=http://localhost:8000
NEXT_PUBLIC_API_URL=auto
DATABASE_URL=postgresql://postgres:postgres@db:5432/mission_control
REDIS_URL=redis://redis:6379
Production Configuration
AUTH_MODE=clerk
BASE_URL=https://api.yourdomain.com
NEXT_PUBLIC_API_URL=https://api.yourdomain.com
DATABASE_URL=${DATABASE_URL}
REDIS_URL=${REDIS_URL}
CLERK_PUBLISHABLE_KEY=${CLERK_PUBLISHABLE_KEY}
CLERK_SECRET_KEY=${CLERK_SECRET_KEY}
NODE_ENV=production
CORS_ORIGINS=https://app.yourdomain.com
Docker Commands
docker compose -f compose.yml --env-file .env up -d --build
docker compose -f compose.yml --env-file .env up --build --watch
docker compose -f compose.yml --env-file .env logs -f
docker compose -f compose.yml --env-file .env up -d --build --force-recreate
docker compose -f compose.yml --env-file .env build --no-cache --pull
docker compose -f compose.yml --env-file .env up -d --force-recreate
docker compose -f compose.yml --env-file .env down
docker compose -f compose.yml --env-file .env down -v
Troubleshooting
Authentication Errors
Problem: 401 Unauthorized responses
echo ${LOCAL_AUTH_TOKEN} | wc -c
grep AUTH_MODE .env
curl -H "Authorization: Bearer ${LOCAL_AUTH_TOKEN}" \
http://localhost:8000/healthz
Database Connection Issues
Problem: Backend fails to connect to database
docker compose -f compose.yml --env-file .env ps db
grep DATABASE_URL .env
docker compose -f compose.yml --env-file .env logs db
docker compose -f compose.yml --env-file .env exec backend npm run db:migrate
Frontend Can't Reach API
Problem: API requests fail from frontend
grep NEXT_PUBLIC_API_URL frontend/.env
grep BASE_URL .env
curl http://localhost:8000/healthz
grep CORS_ORIGINS .env
Port Conflicts
Problem: Ports 3000 or 8000 already in use
lsof -i :3000
lsof -i :8000
Watch Mode Not Working
Problem: Docker Compose watch not detecting changes
docker compose version
docker compose -f compose.yml --env-file .env down
docker compose -f compose.yml --env-file .env up --build --watch
Gateway Connection Failures
Problem: Gateway registration or execution fails
curl -H "Authorization: Bearer ${GATEWAY_AUTH_TOKEN}" \
https://gateway.example.com/healthz
curl -H "Authorization: Bearer ${LOCAL_AUTH_TOKEN}" \
http://localhost:8000/api/gateways
curl -H "Authorization: Bearer ${LOCAL_AUTH_TOKEN}" \
"http://localhost:8000/api/activity?resource_type=gateway"
Reset Database
docker compose -f compose.yml --env-file .env down
docker volume rm openclaw-mission-control_postgres-data
docker compose -f compose.yml --env-file .env up -d --build
Testing
cd backend
npm test
cd frontend
npm test
npm run test:e2e
Production Deployment
See docs/ for:
- Production deployment guide
- Security hardening checklist
- Performance optimization
- Monitoring and observability setup
- Backup and disaster recovery