11 KiB
11 KiB
OpenClaw Command Center — Architecture Overview
"The Overmind sees all through its Overlords."
Overview
OpenClaw Command Center is a real-time dashboard for monitoring and managing AI assistant orchestration. It provides visibility into sessions, token usage, costs, scheduled jobs, and system health.
Core Architecture Principles
1. DRY (Don't Repeat Yourself)
- Shared components extracted to reusable partials
- Single source of truth for sidebar, styling, and common logic
- Centralized configuration management
2. Real-Time First
- Server-Sent Events (SSE) for live updates
- No polling needed for connected clients
- Graceful degradation to polling when SSE unavailable
3. Zero Build Step
- Plain HTML, CSS, and JavaScript
- No compilation, bundling, or transpilation required
- Works directly from static file serving
- Dynamic loading via fetch() for shared partials
4. Progressive Enhancement
- Core functionality works without JavaScript
- Enhanced UX with JS (smooth scrolling, live updates, etc.)
- Mobile-responsive design
5. Thematic Consistency
- Starcraft/Zerg theme throughout
- Dark mode by default (space aesthetic)
- Consistent naming conventions
System Components
┌─────────────────────────────────────────────────────────────┐
│ Browser (Client) │
├─────────────────────────────────────────────────────────────┤
│ index.html │ jobs.html │ (future pages) │
│ ───────────── │ ───────────── │ │
│ Main Dashboard │ AI Jobs Dashboard │ │
└──────────┬───────────┴────────┬──────────┴─────────────────┘
│ │
│ ┌─────────────────┴──────────────────┐
│ │ /partials/sidebar.html │
│ │ (shared navigation component) │
│ └─────────────────┬──────────────────┘
│ │
└────────────────────┼──────────────────────────────┐
│ │
┌───────────────────────────────┴──────────────────────────────┤
│ /js/sidebar.js │
│ ─ Loads sidebar partial │
│ ─ Manages SSE connection for live badge updates │
│ ─ Handles navigation and active state │
└──────────────────────────────────────────────────────────────┘
│
│ SSE (/api/events)
│ REST (/api/*)
▼
┌──────────────────────────────────────────────────────────────┐
│ lib/server.js │
│ ─ Express HTTP server │
│ ─ SSE event broadcasting │
│ ─ API routes for state, sessions, jobs, etc. │
│ ─ Static file serving │
└─────────────────────────────────┬────────────────────────────┘
│
┌─────────────┼─────────────┐
│ │ │
▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌───────────┐
│ OpenClaw │ │ Jobs │ │ Linear │
│ Gateway │ │ Scheduler │ │ Sync │
│ API │ │ API │ │ API │
└───────────┘ └───────────┘ └───────────┘
Frontend Architecture
Pages
| Page | Purpose | Key Sections |
|---|---|---|
index.html |
Main dashboard | Vitals, LLM Usage, Sessions, Cron Jobs, Memory, Cerebro, Operators |
jobs.html |
AI Jobs management | Job cards, run/pause/history controls |
Shared Components
| Component | Location | Purpose |
|---|---|---|
| Sidebar | /partials/sidebar.html |
Navigation + live stats badges |
| Sidebar JS | /js/sidebar.js |
Partial loading, SSE connection, navigation |
| Styles | /css/dashboard.css |
Shared visual theme |
| morphdom | /js/lib/morphdom.min.js |
Efficient DOM diffing |
State Management
- SSE-based: Real-time state pushed from server
- Local state: Per-component state in JavaScript closures
- Persistence:
localStoragefor preferences (sidebar collapsed, etc.)
Backend Architecture
Server (lib/server.js)
- Express.js HTTP server
- Static file serving from
/public - API routes under
/api/* - SSE endpoint at
/api/events
Data Sources
| Source | Integration | Purpose |
|---|---|---|
| OpenClaw Gateway | REST API | Sessions, token stats, system vitals |
| Jobs Scheduler | REST API | AI job definitions and run history |
| Linear | GraphQL API | Issue tracking integration |
Configuration (lib/config.js)
- Auto-detects OpenClaw installation paths
- Supports multiple config file locations
- Environment variable overrides
API Endpoints
| Endpoint | Method | Description |
|---|---|---|
/api/events |
GET (SSE) | Real-time state updates |
/api/state |
GET | Full current state snapshot |
/api/sessions |
GET | Session list and details |
/api/jobs |
GET | AI job definitions |
/api/jobs/:id/run |
POST | Trigger job execution |
/api/jobs/:id/pause |
POST | Pause job |
/api/jobs/:id/resume |
POST | Resume job |
/api/jobs/:id/history |
GET | Job run history |
Design Decisions
ADR-001: Shared Sidebar via Fetch
Decision: Load sidebar HTML via fetch() rather than server-side includes or build step.
Rationale:
- Keeps zero-build-step architecture
- Works with any static file server
- Enables dynamic loading and hot updates
- Single source of truth for sidebar content
ADR-002: SSE for Real-Time Updates
Decision: Use Server-Sent Events instead of WebSockets.
Rationale:
- Simpler protocol (HTTP-based)
- Automatic reconnection
- Better proxy/firewall compatibility
- Sufficient for server→client push (no bidirectional needed)
ADR-003: Morphdom for DOM Updates
Decision: Use morphdom for efficient DOM patching.
Rationale:
- Virtual DOM-like efficiency without framework overhead
- Preserves focus, scroll position, form state
- Small footprint (~4KB)
File Structure
openclaw-command-center/
├── lib/ # Backend code
│ ├── server.js # Main HTTP server
│ ├── config.js # Configuration loader
│ ├── jobs.js # Jobs API integration
│ ├── linear-sync.js # Linear integration
│ └── topic-classifier.js # NLP topic classification
├── public/ # Frontend (served statically)
│ ├── index.html # Main dashboard
│ ├── jobs.html # AI Jobs dashboard
│ ├── partials/ # Shared HTML partials
│ │ └── sidebar.html # Navigation sidebar
│ ├── css/
│ │ └── dashboard.css # Shared styles
│ ├── js/
│ │ ├── sidebar.js # Sidebar loader + SSE
│ │ ├── app.js # Main page logic
│ │ ├── api.js # API client utilities
│ │ ├── store.js # State management
│ │ ├── utils.js # Common utilities
│ │ └── lib/
│ │ └── morphdom.min.js # DOM diffing library
│ └── data/ # Client-side data cache
├── config/ # Configuration files
├── docs/ # Documentation
│ └── architecture/ # Architecture docs
├── scripts/ # Operational scripts
└── tests/ # Test files
Performance Considerations
- SSE Connection Sharing: Single SSE connection per page, shared across components
- Lazy Loading: Sidebar loaded on demand, not blocking initial render
- Efficient Updates: morphdom patches only changed DOM nodes
- Debouncing: High-frequency updates batched before render
Security Considerations
- No Secrets in Frontend: All sensitive data stays server-side
- Input Validation: API inputs validated before processing
- CORS: Restricted to same-origin by default
- Rate Limiting: Consider for public deployments
Future Directions
- Component System: More shared partials (stats bar, modals, etc.)
- Plugin Architecture: Extensible dashboard sections
- Multi-Gateway: Support for monitoring multiple OpenClaw instances
- Historical Analytics: Token usage and cost trends over time