A StarCraft/C&C-inspired tactical command center for OpenClaw monitoring.
When the user wants to open/view/launch the dashboard, or when visiting 127.0.0.1:4320 fails:
Check if already running: powershell
Get-NetTCPConnection -LocalPort 4320 -ErrorAction SilentlyContinue
If not running, start it in background: powershell
cd "<skill_dir>"; node server.js
Use exec with background: true and yieldMs: 3000, then check logs to confirm ⚡ Online message.
If node_modules/ is missing, run npm install first.
Tell the user: http://127.0.0.1:4320 is ready.
powershell
Get-NetTCPConnection -LocalPort 4320 | ForEach-Object { Stop-Process -Id $_.OwningProcess -Force }
bash
cd rts-dashboard
npm install
node server.js
Open http://127.0.0.1:4320 in browser.
ws npm package (auto-installed via npm install)chat.send RPCEnvironment variables (all optional):
VariableDefaultDescriptionRTS_PORT``4320Dashboard HTTP portOPENCLAW_GATEWAY_PORT``18789Gateway portOPENCLAW_HOME``~/.openclawOpenClaw home directoryOPENCLAW_GATEWAY_TOKEN(from config)Gateway auth token
The dashboard implements Ed25519 device signing for Gateway WebSocket authentication:
.device-keys.jsonconnect.challenge nonce using v3 protocolOPENCLAW_GATEWAY_TOKEN env var or gateway.auth.token in openclaw.jsondangerouslyDisableDeviceAuth or allowInsecureAuth requiredrequire.resolve → which/where → npm root -g → fallback paths~/.agents/skills/ (user) + {openclaw}/skills/ (built-in) + {openclaw}/extensions/*/skills/ (extensions)JSON.parse (robust, no regex)The dashboard needs the Gateway to allow its WebSocket origin:
json5
{
gateway: {
controlUi: {
allowedOrigins: ["http://127.0.0.1:4320"]
}
}
}
This is the only Gateway config change needed. Apply with openclaw config set gateway.controlUi.allowedOrigins '["http://127.0.0.1:4320"]' or via the Control UI config panel.
~/.openclaw/openclaw.json → agents.list.jsonl.lock files in ~/.openclaw/agents/*/sessions/os module (CPU delta sampling every 2s)~/.openclaw/cron/jobs.jsontext
rts-dashboard/
├── SKILL.md # This file
├── server.js # Node.js server (HTTP + WebSocket)
├── package.json # Dependencies (ws only)
└── public/
└── index.html # Single-file dashboard (HTML + CSS + Canvas JS)