- 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](https://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
```bash
# One-line installation (clones repo if needed)
curl -fsSL https://raw.githubusercontent.com/abhi1693/openclaw-mission-control/master/install.sh | bash
# Or if you already cloned the repo
./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
```bash
# Clone repository
git clone https://github.com/abhi1693/openclaw-mission-control.git
cd openclaw-mission-control
# Configure environment
cp .env.example .env
# Edit .env and set required values:
# - LOCAL_AUTH_TOKEN (minimum 50 characters)
# - BASE_URL (backend origin)
# - NEXT_PUBLIC_API_URL (frontend API endpoint)
# Start services
docker compose -f compose.yml --env-file .env up -d --build
```
### Manual Local Setup
Prerequisites: Node.js 22+, PostgreSQL, Redis
```bash
# Backend setup
cd backend
cp .env.example .env
# Edit .env with database credentials and auth config
npm install
npm run db:migrate
npm run dev
# Frontend setup (in new terminal)
cd frontend
cp .env.example .env
# Edit .env with API URL
npm install
npm run dev
```
Access:
- UI: http://localhost:3000
- API: http://localhost:8000
- Health check: http://localhost:8000/healthz
## Authentication Configuration
Mission Control supports two authentication modes:
### Local Token Mode (Default for Self-Hosted)
```bash
# .env
AUTH_MODE=local
LOCAL_AUTH_TOKEN=your-secure-token-minimum-50-characters-required
```
Use in API requests:
```bash
curl -H "Authorization: Bearer ${LOCAL_AUTH_TOKEN}" \
http://localhost:8000/api/organizations
```
### Clerk JWT Mode
```bash
# .env
AUTH_MODE=clerk
CLERK_PUBLISHABLE_KEY=${CLERK_PUBLISHABLE_KEY}
CLERK_SECRET_KEY=${CLERK_SECRET_KEY}
# frontend/.env
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=${CLERK_PUBLISHABLE_KEY}
```
## Core Concepts
### Hierarchy Structure
```
Organization
└── Board Group
└── Board
└── Task
└── Tag (optional)
```
### Agent Lifecycle
1. **Creation**: Define agent with name, description, capabilities
2. **Assignment**: Link agent to boards and tasks
3. **Execution**: Agent processes tasks according to workflow
4. **Approval**: Sensitive actions require explicit approval
5. **Audit**: All actions logged in activity timeline
## API Usage
### Organizations
```typescript
// Create organization
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();
};
// List organizations
const listOrganizations = async (token: string) => {
const response = await fetch('http://localhost:8000/api/organizations', {
headers: {
'Authorization': `Bearer ${token}`,
},
});
return response.json();
};
```
### Board Groups
```typescript
// Create board group
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
```typescript
// Create board
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();
};
// Get board with tasks
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
```typescript
// Create task
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, // Optional agent assignment
}),
});
return response.json();
};
// Update task status
const updateTaskStatus = async (token: string, taskId: string, status: string) => {
const response = await fetch(`http://localhost:8000/api/tasks/${taskId}`, {
method: 'PATCH',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
status, // 'todo' | 'in_progress' | 'review' | 'done'
}),
});
return response.json();
};
```
### Agents
```typescript
// Create agent
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();
};
// Assign agent to task
const assignAgent = async (token: string, taskId: string, agentId: string) => {
const response = await fetch(`http://localhost:8000/api/tasks/${taskId}`, {
method: 'PATCH',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
assigned_agent_id: agentId,
}),
});
return response.json();
};
```
### Approvals
```typescript
// Request approval for sensitive action
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();
};
// Approve or reject
const processApproval = async (token: string, approvalId: string, approved: boolean) => {
const response = await fetch(`http://localhost:8000/api/approvals/${approvalId}`, {
method: 'PATCH',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
status: approved ? 'approved' : 'rejected',
comment: approved ? 'LGTM' : 'Needs additional testing',
}),
});
return response.json();
};
```
### Gateway Management
```typescript
// Register gateway
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();
};
// Execute task via gateway
const executeViaGateway = async (token: string, gatewayId: string, taskId: string) => {
const response = await fetch(`http://localhost:8000/api/gateways/${gatewayId}/execute`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${token}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
task_id: taskId,
parameters: {
environment: 'production',
},
}),
});
return response.json();
};
```
### Activity Timeline
```typescript
// Get activity log
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();
};
// Get activity for specific resource
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
```typescript
// Create workflow with multiple agents
const createMultiAgentWorkflow = async (token: string) => {
// 1. Create organization and board
const org = await createOrganization(token);
View on GitHub