Real-time dashboard for OpenClaw system health (agents, cron jobs, Sentinel alerts, gateway status). View live stats at http://127.0.0.1:8787/. Use when: checking system health, debugging stuck agents, monitoring cron job failures, viewing Sentinel alerts.
Real-time health monitoring dashboard for your OpenClaw system.
✅ USE this skill when:
❌ DON'T use this skill when:
Live dashboard: http://127.0.0.1:8787/
Auto-refreshes every 5 seconds (configurable in HTML).
Data Collector (_collect_data.py)
~/.openclaw/workspace/scripts/_collect_data.pydashboard_data.json (workspace root)dashboard_refresh.shDashboard Server (serve.js)
~/.openclaw/workspace/serve.jsdashboard.html + dashboard_data.json~/Library/LaunchAgents/ai.openclaw.dashboard.plistDashboard HTML (dashboard.html)
~/.openclaw/workspace/dashboard.htmldashboard_data.json every 5sRefresh Daemon (dashboard_refresh.sh)
~/.openclaw/workspace/scripts/dashboard_refresh.sh_collect_data.py every 5 seconds┌─────────────────────┐
│ LaunchAgent │ ← Starts on boot
│ (dashboard.plist) │
└──────────┬──────────┘
│
├─→ serve.js (port 8787)
│ └─→ Serves dashboard.html
│
└─→ dashboard_refresh.sh
└─→ _collect_data.py (every 5s)
└─→ dashboard_data.json
# Is the server running?
lsof -ti:8787
# Check LaunchAgent status
launchctl list | grep ai.openclaw.dashboard
# View collector logs (if logging enabled)
cat ~/.openclaw/workspace/scripts/dashboard_collector.log
cd "~/.openclaw/workspace"
python3 scripts/_collect_data.py
cat dashboard_data.json | jq .
# Restart LaunchAgent
launchctl unload ~/Library/LaunchAgents/ai.openclaw.dashboard.plist
launchctl load ~/Library/LaunchAgents/ai.openclaw.dashboard.plist
open http://127.0.0.1:8787/
Edit _collect_data.py:
# Add new collector function
def collect_new_section():
return {
"status": "ok",
"your_data": "here"
}
# Add to main data dict
data["newSection"] = collect_new_section()
Update dashboard.html:
<!-- Add new panel -->
<div class="panel">
<h2>New Section</h2>
<div id="new-section-content"></div>
</div>
<!-- Add render function -->
<script>
function renderNewSection(data) {
const container = document.getElementById('new-section-content');
container.innerHTML = `<p>${data.newSection.status}</p>`;
}
// Call from updateDashboard()
renderNewSection(data);
</script>
Test:
python3 scripts/_collect_data.py
# Check dashboard at http://127.0.0.1:8787/
Panels are defined in dashboard.html. Structure:
<div class="panel">
<h2>Panel Title</h2>
<div class="metric">
<span class="label">Metric Name:</span>
<span class="value" id="metric-id">Value</span>
</div>
</div>
Use CSS classes for status indicators:
.status-ok → Green.status-warning → Yellow.status-error → RedDashboard refresh (browser):
Edit dashboard.html, find setInterval, change 5000 (5s):
setInterval(fetchData, 5000); // milliseconds
Data collector refresh (backend):
Edit scripts/dashboard_refresh.sh, change sleep 5:
while true; do
python3 "$SCRIPT_DIR/_collect_data.py"
sleep 5 # seconds
done
Then restart LaunchAgent.
Current dashboard_data.json structure:
{
"timestamp": "2026-03-07T15:20:30Z",
"gateway": {
"reachable": true,
"version": "2026.3.2",
"uptime": "2d 14h 22m"
},
"agents": [
{
"id": "main",
"name": "Sherlock",
"model": "anthropic/claude-opus-4-6",
"contextPercent": 23.4,
"lastActiveAgeMs": 120000
}
],
"cronJobs": [
{
"id": "morning-briefing",
"label": "Morning Briefing",
"schedule": "0 8 * * *",
"enabled": true,
"lastRunTime": "2026-03-07T08:00:00Z",
"consecutiveErrors": 0
}
],
"security": {
"sentinelActive": true,
"pendingAlerts": 0,
"lastCheckAgeMs": 300000
}
}
Context Thresholds:
60%: Stuck (alert needed)
Cron Job Health:
consecutiveErrors > 2: InvestigatelastRunTime > schedule interval: Missed runsSentinel Alerts:
pendingAlerts > 0: Unprocessed threatsGateway:
reachable: false: Core system downDashboard won't load:
# Check server is running
lsof -ti:8787
# Check LaunchAgent
launchctl list | grep dashboard
# Restart
launchctl unload ~/Library/LaunchAgents/ai.openclaw.dashboard.plist
launchctl load ~/Library/LaunchAgents/ai.openclaw.dashboard.plist
Data not updating:
# Check refresh script is running
ps aux | grep dashboard_refresh.sh
# Check data file is being written
ls -lh ~/.openclaw/workspace/dashboard_data.json
# Manual collection test
python3 ~/.openclaw/workspace/scripts/_collect_data.py
Stale data:
timestamp field in dashboard_data.json_collect_data.py for errors)