A Control Center for OpenClaw Agents
Keep your AI agents organized and accountable. ClawController gives you visibility into what your OpenClaw agents are doing, assigns them structured work, and tracks their progress β so you're not just hoping they're on task.
The problem: You've got multiple OpenClaw agents running, but how do you know what they're actually working on? Are they stuck? Did they finish? What's next?
The solution: ClawController provides a visual dashboard where you can:
- See all your agents and their current status at a glance
- Assign structured tasks with clear deliverables
- Track progress through a defined workflow
- Route work to the right agent automatically
- Review completed work before closing tasks
- Features
- Screenshots
- Quick Start
- Architecture
- Configuration
- Creating Agents
- Task Workflow
- Auto-Assignment Rules
- Recurring Tasks
- API Reference
- OpenClaw Integration
- Customization
- Contributing
Running multiple OpenClaw agents is powerful, but it can get chaotic:
- Agents work in isolated sessions β you lose track of who's doing what
- No central place to see progress across all agents
- Work gets duplicated or dropped
- Hard to review output before it ships
ClawController fixes this by giving you one place to manage the work, not the agents themselves. OpenClaw handles the AI. ClawController handles the workflow.
| Feature | Description |
|---|---|
| Agent Status | See which OpenClaw agents are online, working, or idle |
| Kanban Board | Drag-and-drop tasks through INBOX β ASSIGNED β IN_PROGRESS β REVIEW β DONE |
| Task Assignment | Assign work to specific agents with descriptions and due dates |
| Activity Logging | Agents report progress; you see it in real-time |
| Auto-Assignment | Route tasks to agents automatically based on tags |
| Review Gate | Work goes to REVIEW before DONE β nothing ships without approval |
| Squad Chat | @mention agents to send them messages directly |
| Recurring Tasks | Schedule repeating work on cron schedules |
| WebSocket Updates | Dashboard updates live as agents work |
Manage your AI team with kanban boards, agent status monitoring, and real-time activity feeds.
Coordinate trading agents with specialized workflows and market-focused task management.
Run a creative agency with writer, designer, and specialist agents working in parallel.
- Node.js 18+ (for frontend)
- Python 3.10+ (for backend)
# Clone the repository
git clone https://github.com/mdonan90/ClawController.git
cd ClawController
# Backend setup
cd backend
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
# Frontend setup
cd ../frontend
npm installOption 1: Use the start script
./start.shOption 2: Manual start
# Terminal 1 - Backend
cd backend
source venv/bin/activate
uvicorn main:app --host 0.0.0.0 --port 8000 --reload
# Terminal 2 - Frontend
cd frontend
npm run dev -- --port 5001 --host 0.0.0.0Access the dashboard: http://localhost:5001
./stop.shOnce the dashboard is running, create your first agent:
# Create a simple developer agent
curl -X POST http://localhost:8000/api/agents \
-H "Content-Type: application/json" \
-d '{
"id": "dev",
"name": "Dev Agent",
"role": "developer",
"description": "Handles coding tasks and technical work",
"avatar": "π»",
"status": "idle"
}'Verify: Refresh your dashboard at http://localhost:5001 and you should see "Dev Agent π»" in the sidebar.
Next Steps: See Creating Agents for AI-assisted agent creation and advanced configuration.
ClawController/
βββ backend/
β βββ main.py # FastAPI application + all endpoints
β βββ models.py # SQLAlchemy models (Task, Agent, etc.)
β βββ database.py # Database connection setup
β βββ requirements.txt # Python dependencies
βββ frontend/
β βββ src/
β β βββ App.jsx # Main React component
β β βββ components/ # UI components (Header, Kanban, etc.)
β β βββ store/ # Zustand state management
β βββ package.json # Node dependencies
βββ start.sh # Start both services
βββ stop.sh # Stop both services
- Frontend: React 18 + Vite + Tailwind CSS + Zustand
- Backend: FastAPI + SQLite + SQLAlchemy
- Real-time: WebSockets for live updates
Create a .env file in the backend directory (optional):
# Database path (default: ./data/mission_control.db)
DATABASE_URL=sqlite:///./data/mission_control.db
# OpenClaw config path for live agent status
OPENCLAW_CONFIG_PATH=~/.openclaw/config.yamlEdit frontend/src/App.jsx to change the API URL:
const API_BASE = 'http://localhost:8000/api';For production, point this to your backend URL.
ClawController can generate agent configurations from natural language descriptions:
Step 1: Describe Your Agent
- Click + New Agent
- Describe what you want: "A market research analyst that understands long term macro while providing micro guidance"
- Or click a template:
Backend Dev,Sales Agent,Researcher - Click Generate Config
Step 2: Review & Customize
The system generates:
- Agent ID & Name β auto-suggested based on your description
- Emoji β visual identifier
- Model β recommended model (Sonnet, Opus, Haiku, etc.)
- SOUL.md β personality, competencies, and behavior guidelines
- TOOLS.md β available tools and integrations
You can edit any field, refine the SOUL.md, or click β Refine to adjust your description. When ready, click Create Agent.
Complete Example - Lead Agent:
curl -X POST http://localhost:8000/api/agents \
-H "Content-Type: application/json" \
-d '{
"id": "main",
"name": "Project Lead",
"role": "LEAD",
"description": "Primary orchestrator and task reviewer",
"avatar": "π€",
"status": "STANDBY",
"workspace": "/Users/mike/projects"
}'Expected Response:
{
"id": "main",
"name": "Project Lead",
"role": "LEAD",
"description": "Primary orchestrator and task reviewer",
"avatar": "π€",
"status": "STANDBY"
}Important: Set exactly one agent with "role": "LEAD" β this agent will:
- Receive task completion notifications
- Be the default reviewer for tasks in REVIEW status
- Coordinate work across your agent team
Simple Developer Agent:
curl -X POST http://localhost:8000/api/agents \
-H "Content-Type: application/json" \
-d '{
"id": "dev",
"name": "Dev Agent",
"role": "INT",
"avatar": "π»",
"status": "IDLE"
}'| Role | Badge | Typical Use |
|---|---|---|
LEAD |
Lead | Orchestrator agent that delegates to others, reviews tasks |
INT |
Int | Integration agents - developers, analysts, general workers |
SPC |
Spc | Specialists - domain experts (trading, design, legal, etc.) |
Role Guidelines:
- One LEAD required β handles task reviews and team coordination
- Multiple INT agents β your main workforce for most tasks
- SPC agents β specialists for domain-specific work
| Status | Indicator | Meaning |
|---|---|---|
WORKING |
π’ Green (pulsing) | Currently processing a task |
IDLE |
π‘ Yellow | Available, waiting for work |
STANDBY |
β« Gray | Configured but inactive - ready to activate |
OFFLINE |
π΄ Red | Not configured or unreachable |
Status Updates: Agent status is automatically detected from OpenClaw session activity and task assignments.
INBOX β ASSIGNED β IN_PROGRESS β REVIEW β DONE
| Status | Description | Trigger |
|---|---|---|
| INBOX | Unassigned, needs triage | Default for new tasks |
| ASSIGNED | Assigned to agent, not started | Manual or auto-assignment |
| IN_PROGRESS | Agent actively working | First activity log entry |
| REVIEW | Work complete, needs approval | Agent says "completed/done/finished" |
| DONE | Approved and closed | Manual approval only |
Tasks can be created from multiple surfaces:
- Dashboard: Click the + New Task button
- Discord: Message your OpenClaw agent with a task description
- Telegram: Send tasks via your connected Telegram bot
- Squad Chat: Use the built-in chat to create and assign tasks
Via API:
curl -X POST http://localhost:8000/api/tasks \
-H "Content-Type: application/json" \
-d '{
"title": "Build login page",
"description": "Create a responsive login form with OAuth support",
"priority": "high",
"tags": ["coding", "frontend"],
"assignee_id": "dev"
}'| Field | Type | Description |
|---|---|---|
title |
string | Task title (required) |
description |
string | Detailed description |
priority |
enum | low, medium, high, urgent |
tags |
array | Labels for categorization |
assignee_id |
string | Agent ID to assign |
due_date |
datetime | Optional deadline |
status |
enum | Current status |
Agents should log their progress:
curl -X POST http://localhost:8000/api/tasks/{task_id}/activity \
-H "Content-Type: application/json" \
-d '{
"agent_id": "dev",
"message": "Started working on the login form layout"
}'Activity keywords that trigger status changes:
- β IN_PROGRESS: Any activity on an ASSIGNED task
- β REVIEW: "completed", "done", "finished", "ready for review"
Configure automatic task routing based on tags.
Edit backend/main.py:
# Auto-assignment rules: tag -> agent_id
ASSIGNMENT_RULES = {
"coding": "dev",
"frontend": "dev",
"backend": "dev",
"trading": "trader",
"analysis": "analyst",
"marketing": "brand",
"writing": "writer",
"design": "designer",
"support": "support",
}- When a task is created with tags, the system checks each tag against the rules
- First matching rule wins
- Task is automatically assigned to that agent
- Status changes from INBOX to ASSIGNED
# This task will auto-assign to "dev" because of the "coding" tag
curl -X POST http://localhost:8000/api/tasks \
-H "Content-Type: application/json" \
-d '{
"title": "Fix authentication bug",
"tags": ["coding", "urgent"]
}'Schedule tasks that repeat on a schedule.
Via UI: Tasks panel β Recurring Tasks tab β + New Recurring Task
Via API:
curl -X POST http://localhost:8000/api/recurring-tasks \
-H "Content-Type: application/json" \
-d '{
"title": "Daily standup summary",
"description": "Compile and post daily progress report",
"schedule": "0 9 * * 1-5",
"assignee_id": "lead",
"tags": ["daily", "reporting"],
"enabled": true
}'ββββββββββββββ minute (0-59)
β ββββββββββββββ hour (0-23)
β β ββββββββββββββ day of month (1-31)
β β β ββββββββββββββ month (1-12)
β β β β ββββββββββββββ day of week (0-6, Sun=0)
β β β β β
* * * * *
Examples:
0 9 * * 1-5β 9 AM, Monday-Friday0 */2 * * *β Every 2 hours0 0 1 * *β First day of each month at midnight
- Pause:
PATCH /api/recurring-tasks/{id}with{"enabled": false} - View runs:
GET /api/recurring-tasks/{id}/runs - Delete:
DELETE /api/recurring-tasks/{id}
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/tasks |
List all tasks |
POST |
/api/tasks |
Create task |
GET |
/api/tasks/{id} |
Get task |
PATCH |
/api/tasks/{id} |
Update task |
DELETE |
/api/tasks/{id} |
Delete task |
POST |
/api/tasks/{id}/activity |
Log activity |
GET |
/api/tasks/{id}/activity |
Get activity |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/agents |
List all agents |
POST |
/api/agents |
Create agent |
PATCH |
/api/agents/{id} |
Update agent |
DELETE |
/api/agents/{id} |
Delete agent |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/chat |
Get messages |
POST |
/api/chat |
Send message |
POST |
/api/chat/send-to-agent |
Route to agent |
| Method | Endpoint | Description |
|---|---|---|
GET |
/api/recurring-tasks |
List all |
POST |
/api/recurring-tasks |
Create |
PATCH |
/api/recurring-tasks/{id} |
Update |
DELETE |
/api/recurring-tasks/{id} |
Delete |
GET |
/api/recurring-tasks/{id}/runs |
Run history |
Connect to ws://localhost:8000/ws for real-time updates:
const ws = new WebSocket('ws://localhost:8000/ws');
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
// Handle: task_created, task_updated, agent_status, chat_message, etc.
};ClawController is built for OpenClaw. Here's how they connect:
ClawController reads your OpenClaw config to show real agent status:
# In backend/main.py
OPENCLAW_CONFIG_PATH = os.path.expanduser("~/.openclaw/config.yaml")Agents defined in your OpenClaw config appear automatically with live status indicators.
When you @mention an agent in Squad Chat, ClawController routes the message via:
openclaw agent --agent {agent_id} --message "{your message}"This wakes the agent in its own session and delivers your message.
Important: Your agents need instructions to use ClawController correctly. Add the following to each agent's TOOLS.md or AGENTS.md:
## ClawController Integration
**API Base:** `http://localhost:8000/api`
### When assigned a task:
1. Check for tasks: `GET /api/tasks?assignee_id={your_id}&status=ASSIGNED`
2. Log progress as you work (every significant step)
3. When finished, post activity with "completed" or "done"
4. Wait for human approval
### Logging Activity (REQUIRED while working)
curl -X POST http://localhost:8000/api/tasks/{TASK_ID}/activity \
-H "Content-Type: application/json" \
-d '{"agent_id": "YOUR_AGENT_ID", "message": "What you did"}'
### Task Lifecycle
- ASSIGNED β Task given to you
- IN_PROGRESS β Auto-triggers on first activity log
- REVIEW β Say "completed" in activity to trigger
- DONE β Human approves (never set this yourself)
### Key Rules
- Always log activity β progress is tracked via activity logs
- Don't skip REVIEW β humans approve before DONE
- Use descriptive updates β helps humans understand progressA complete template is available at AGENT_INSTRUCTIONS.md in the repo.
The "Cyber Claw" theme uses Tailwind CSS. Edit frontend/tailwind.config.js:
module.exports = {
theme: {
extend: {
colors: {
primary: '#F97316', // Orange accent
background: '#09090B', // Near black
surface: '#18181B', // Card backgrounds
}
}
}
}Edit backend/models.py:
class TaskStatus(str, Enum):
INBOX = "INBOX"
ASSIGNED = "ASSIGNED"
IN_PROGRESS = "IN_PROGRESS"
BLOCKED = "BLOCKED" # Add new status
REVIEW = "REVIEW"
DONE = "DONE"Then update the frontend kanban columns in App.jsx.
Edit backend/models.py:
class AgentRole(str, Enum):
LEAD = "lead"
DEVELOPER = "developer"
ANALYST = "analyst"
SPECIALIST = "specialist"
SUPPORT = "support"
CREATIVE = "creative" # Add new roleAdd to backend/main.py:
@app.get("/api/custom-endpoint")
def custom_endpoint(db: Session = Depends(get_db)):
# Your logic here
return {"status": "ok"}# Build frontend
cd frontend
npm run build
# Serve with nginx or copy dist/ to your static host- Backend: Run with gunicorn + uvicorn workers
- Frontend: Serve from CDN or nginx
- Database: SQLite works for small teams; PostgreSQL for scale
Problem: Error: listen EADDRINUSE: address already in use :::8000 or :::5001
Solution:
# Find processes using the ports
lsof -i :8000 # Backend port
lsof -i :5001 # Frontend port
# Kill processes if needed
kill -9 <PID>
# Or use different ports
uvicorn main:app --port 8001 # Backend
npm run dev -- --port 5002 # FrontendProblem: Dashboard shows "Connection Failed" when accessing remotely
Solution:
# Backend: Allow all origins (development only)
uvicorn main:app --host 0.0.0.0 --port 8000
# Frontend: Enable network access
npm run dev -- --host 0.0.0.0 --port 5001
# Access via: http://YOUR_IP:5001Problem: Dashboard loads but agent sidebar is empty
Solutions:
-
Create your first agent:
curl -X POST http://localhost:8000/api/agents \ -H "Content-Type: application/json" \ -d '{"id": "dev", "name": "Dev Agent", "role": "developer", "avatar": "π»", "status": "idle"}'
-
Import from OpenClaw config:
- Click "Import from OpenClaw" in Agent Management
- Requires
~/.openclaw/openclaw.jsonwith configured agents
-
Check OpenClaw integration:
# Verify config exists ls ~/.openclaw/openclaw.json # Check API endpoint curl http://localhost:8000/api/openclaw/status
Problem: Tasks/agents not persisting or database errors
Solutions:
-
Check database file:
# Default location ls backend/data/mission_control.db # Create directory if missing mkdir -p backend/data
-
Reset database:
rm backend/data/mission_control.db # Restart backend - database will recreate automatically -
Permissions:
chmod 755 backend/data chmod 644 backend/data/mission_control.db
Problem: Dashboard shows "Connection Failed" or no real-time updates
Solutions:
-
Check backend is running:
curl http://localhost:8000/api/stats
-
Verify WebSocket endpoint:
# Should show upgrade response curl -i -N -H "Connection: Upgrade" -H "Upgrade: websocket" \ http://localhost:8000/ws
-
Browser console errors:
- Open DevTools β Console
- Look for WebSocket connection errors
- Common cause: backend not running or wrong port
Problem: Agents stuck in "OFFLINE" or status doesn't change
Solutions:
-
Check OpenClaw session files:
# Verify session directory exists ls ~/.openclaw/agents/AGENT_ID/sessions/ # Check recent activity find ~/.openclaw/agents/*/sessions -name "*.jsonl" -newermt "1 hour ago"
-
Manual status update:
curl -X PATCH "http://localhost:8000/api/agents/AGENT_ID/status?status=WORKING" -
Refresh agents list:
- Click the refresh button in agent sidebar
- Or restart the backend to rescan OpenClaw config
Problem: Dashboard slow or unresponsive
Solutions:
-
Check task count:
curl http://localhost:8000/api/stats
-
Clear old tasks:
# Archive completed tasks older than 30 days curl -X DELETE "http://localhost:8000/api/tasks/cleanup?days=30"
-
Database optimization:
# SQLite vacuum (requires stopping backend) sqlite3 backend/data/mission_control.db "VACUUM;"
Enable debug mode:
# Backend with debug logging
uvicorn main:app --log-level debug --reload
# Check API health
curl http://localhost:8000/api/stats
curl http://localhost:8000/api/agents
curl http://localhost:8000/api/tasksCommon API errors:
422 Validation Errorβ Check request body format404 Not Foundβ Verify agent/task ID exists500 Internal Errorβ Check backend logs
- Check backend logs for error messages
- Check browser console for frontend errors
- Verify all services running with
ps aux | grep uvicorn - Test API directly with curl commands above
Still having issues? Check the GitHub Issues or create a new one with:
- Your OS and versions (Python, Node.js)
- Full error message
- Steps to reproduce
Contributions welcome!
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
# Run with hot reload
cd backend && uvicorn main:app --reload
cd frontend && npm run dev- Python: Follow PEP 8
- JavaScript: ESLint + Prettier
MIT License - see LICENSE for details.
OpenClaw is an open-source AI agent framework that lets you run persistent AI assistants with memory, tools, and multi-channel access (Discord, Telegram, etc.).
ClawController adds the missing piece: structured task management so your agents work on what matters, not whatever they feel like.
Built for the OpenClaw community.
Author: Mike O'Nan (@mdonan90)

