{"id":44100582,"url":"https://github.com/mudrii/openclaw-dashboard","last_synced_at":"2026-04-08T09:01:08.023Z","repository":{"id":337226108,"uuid":"1151179394","full_name":"mudrii/openclaw-dashboard","owner":"mudrii","description":"A beautiful, zero-dependency command center for OpenClaw AI agents","archived":false,"fork":false,"pushed_at":"2026-04-03T08:55:12.000Z","size":5839,"stargazers_count":369,"open_issues_count":0,"forks_count":66,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-04-03T14:50:39.203Z","etag":null,"topics":["ai-agents","cost-tracking","dashboard","monitoring","openclaw","python","token-usage","zero-dependency"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mudrii.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-02-06T06:27:26.000Z","updated_at":"2026-04-03T09:55:07.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/mudrii/openclaw-dashboard","commit_stats":null,"previous_names":["mudrii/openclaw-dashboard"],"tags_count":28,"template":false,"template_full_name":null,"purl":"pkg:github/mudrii/openclaw-dashboard","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mudrii%2Fopenclaw-dashboard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mudrii%2Fopenclaw-dashboard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mudrii%2Fopenclaw-dashboard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mudrii%2Fopenclaw-dashboard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mudrii","download_url":"https://codeload.github.com/mudrii/openclaw-dashboard/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mudrii%2Fopenclaw-dashboard/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31547845,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T16:28:08.000Z","status":"online","status_checked_at":"2026-04-08T02:00:06.127Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agents","cost-tracking","dashboard","monitoring","openclaw","python","token-usage","zero-dependency"],"created_at":"2026-02-08T14:16:07.565Z","updated_at":"2026-04-08T09:01:08.015Z","avatar_url":"https://github.com/mudrii.png","language":"Go","funding_links":[],"categories":["Integrations \u0026 Features","Mission Control \u0026 Dashboards","Open Source Projects","🎛️ Dashboards \u0026 Control Centers"],"sub_categories":["Monitoring \u0026 Dashboards","Observability"],"readme":"# OpenClaw Dashboard\n\nA beautiful, zero-dependency command center for [OpenClaw](https://github.com/openclaw/openclaw) AI agents.\n\n![Dashboard Full View](screenshots/00-full-dashboard.png)\n\n## Why This Exists\n\nWhen you run OpenClaw seriously — multiple agents, dozens of cron jobs, sub-agents spawning sub-agents, several Telegram groups and Whatsapp, Slack, and Discord channels, 10+ models, multiple agents and sub-agents — information gets scattered fast.\n\n**The problem:** there was no single place to answer the obvious questions:\n- Is my gateway actually running right now?\n- How much have I spent today, and which model is burning the most?\n- Which cron jobs ran, which failed, and when does the next one fire?\n- What sessions are active and how much context are they consuming?\n- Are my sub-agents doing useful work or spinning in circles?\n- What's the cost trend over the last 7 days — am I accelerating?\n\nThe only way to answer these was digging through log files, running CLI commands, and mentally stitching together a picture from 5 different sources. That friction adds up.\n\n**The solution:** a single local page that collects everything in one place — gateway health, costs, cron status, active sessions, sub-agent runs, model usage, git log — refreshed automatically, no login, no cloud, no external dependencies. Open a browser tab, get the full picture in seconds.\n\nIt's not trying to replace the OpenClaw CLI or Telegram interface. It's the at-a-glance overview layer that tells you whether everything is healthy and where your money and compute are going — so you can make decisions without hunting for data.\n\n## Features\n\n### 12 Dashboard Panels\n\n1. **📊 Top Metrics Bar** — Live CPU, RAM, swap, disk + OpenClaw version + gateway — always on, colour-coded by configurable thresholds (see [Top Metrics Bar](#top-metrics-bar))\n2. **🔔 Header Bar** — Bot name, online/offline status, auto-refresh countdown, theme picker\n3. **⚠️ Alerts Banner** — Smart alerts for high costs, failed crons, high context usage, gateway offline\n4. **💚 System Health** — Gateway status, PID, uptime, memory, compaction mode, active session count\n5. **💰 Cost Cards** — Today's cost, all-time cost, projected monthly, cost breakdown donut chart\n6. **⏰ Cron Jobs** — All scheduled jobs with status, schedule, last/next run, duration, model\n7. **📡 Active Sessions** — Recent sessions with model, type badges (DM/group/cron/subagent), context %, tokens\n8. **📊 Token Usage \u0026 Cost** — Per-model breakdown with 7d/30d/all-time tabs, usage bars, totals\n9. **🤖 Sub-Agent Activity** — Sub-agent runs with cost, duration, status + token breakdown (7d/30d tabs)\n10. **📈 Charts \u0026 Trends** — Cost trend line, model cost breakdown bars, sub-agent activity — all pure SVG, 7d/30d toggle\n11. **🧩 Bottom Row** — Available models grid, skills list, git log\n12. **💬 AI Chat** — Ask questions about your dashboard in natural language, powered by your OpenClaw gateway\n\n### Key Features\n\n- 🔄 **On-Demand Refresh** — Refreshes data when you open the dashboard (no stale data)\n- ⏱️ **Auto-Refresh** — Page auto-refreshes every 60 seconds with countdown timer\n- 🎨 **6 Built-in Themes** — 3 dark (Midnight, Nord, Catppuccin Mocha) + 3 light (GitHub, Solarized, Catppuccin Latte), switchable from the UI\n- 🖌️ **Glass Morphism UI** — Subtle transparency and hover effects\n- 📱 **Responsive** — Adapts to desktop, tablet, and mobile\n- 🔒 **Local Only** — Runs on localhost, no external dependencies\n- 🛡️ **Rate Limiting** — 10 req/min per-IP on `/api/chat` (429 + Retry-After)\n- ⏱️ **HTTP Timeouts** — Read 30s / Write 90s / Idle 120s\n- 🐧 **Cross-Platform** — macOS and Linux\n- ⚡ **Zero Dependencies** — Pure HTML/CSS/JS frontend, single Go binary backend\n- 📊 **Top Metrics Bar** — Always-on CPU/RAM/swap/disk + gateway status, per-metric thresholds, macOS + Linux\n- 💬 **AI Chat** — Natural language queries about costs, sessions, crons, and config via OpenClaw gateway\n- 🎯 **Accurate Model Display** — 5-level resolution chain ensures every session/sub-agent shows its real model, not the default\n- 🔍 **Runtime Observability** — `/api/system` includes live gateway runtime state (liveness, readiness, failing deps, uptime, PID, memory) sourced from `/healthz`, `/readyz`, and `openclaw status --json`\n- 🟡 **Gateway Readiness Alerts** — Alert banner shows `🟡 Gateway not ready: discord` (or any failing dep) and auto-clears on recovery\n- ⚡ **Gateway Runtime + Config Cards** — System Settings split into two panels: Gateway Runtime (live probes) and Gateway Config (static config snapshot)\n\n## Quick Start\n\n### Homebrew (macOS / Linux)\n\n```bash\nbrew install mudrii/tap/openclaw-dashboard\n```\n\nThe Homebrew formula installs the binary and seeds a writable runtime directory at\n`~/.openclaw/dashboard` on first run.\n\nHomebrew upgrades preserve existing `config.json` and runtime `themes.json`, and\nrefresh the package-managed `VERSION` file automatically so `openclaw-dashboard\n--version` stays in sync with the installed formula.\n\nThen run:\n\n```bash\nopenclaw-dashboard --refresh   # generate data.json\nopenclaw-dashboard             # start server on http://localhost:8080\n```\n\n### Pre-built Binary\n\nDownload a release tarball — includes the binary plus runtime assets.\n\n```bash\n# macOS (Apple Silicon)\ncurl -L https://github.com/mudrii/openclaw-dashboard/releases/latest/download/openclaw-dashboard-darwin-arm64.tar.gz | tar xz\n./openclaw-dashboard --port 8080\n\n# macOS (Intel)\ncurl -L https://github.com/mudrii/openclaw-dashboard/releases/latest/download/openclaw-dashboard-darwin-amd64.tar.gz | tar xz\n./openclaw-dashboard --port 8080\n\n# Linux (x86_64)\ncurl -L https://github.com/mudrii/openclaw-dashboard/releases/latest/download/openclaw-dashboard-linux-amd64.tar.gz | tar xz\n./openclaw-dashboard --port 8080\n\n# Linux (ARM64 / Raspberry Pi)\ncurl -L https://github.com/mudrii/openclaw-dashboard/releases/latest/download/openclaw-dashboard-linux-arm64.tar.gz | tar xz\n./openclaw-dashboard --port 8080\n```\n\nVerify download integrity:\n```bash\ncurl -L https://github.com/mudrii/openclaw-dashboard/releases/latest/download/checksums-sha256.txt -o checksums-sha256.txt\nshasum -a 256 -c checksums-sha256.txt\n```\n\n### One-Line Install\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/mudrii/openclaw-dashboard/main/install.sh | bash\n```\n\nThis will:\n1. Install to `~/.openclaw/dashboard`\n2. Download the latest release archive for your platform\n3. Create a default config\n4. Run initial data refresh\n5. Attempt to install and start the dashboard as a background service\n6. Print the local dashboard URL\n\n### Upgrading via Homebrew\n\n```bash\nbrew upgrade mudrii/tap/openclaw-dashboard\n```\n\nAfter upgrading, verify the installed release with:\n\n```bash\nopenclaw-dashboard --version\n```\n\n### Running as a Background Service\n\nThe binary has built-in service management — no shell scripts needed:\n\n```bash\n# Install and start as a system service (launchd on macOS, systemd on Linux)\nopenclaw-dashboard install\n\n# With custom port and bind address\nopenclaw-dashboard install --port 9090 --bind 0.0.0.0\n\n# Check status\nopenclaw-dashboard status\n\n# Stop / start / restart\nopenclaw-dashboard stop\nopenclaw-dashboard start\nopenclaw-dashboard restart\n\n# Remove the service (config and data are preserved)\nopenclaw-dashboard uninstall\n```\n\nAll commands are also available under the `service` namespace:\n```bash\nopenclaw-dashboard service install\nopenclaw-dashboard service status\nopenclaw-dashboard service uninstall\n```\n\n**Homebrew users** should use the built-in service commands above. The current tap\ndoes not define a `brew services` formula service.\n\n### Build from Source\n\n```bash\ngit clone https://github.com/mudrii/openclaw-dashboard.git\ncd openclaw-dashboard\ngo build -ldflags=\"-s -w\" -o openclaw-dashboard ./cmd/openclaw-dashboard\n./openclaw-dashboard --port 8080\n```\n\n### Docker\n\n```bash\ndocker build -t openclaw-dashboard .\ndocker run -p 8080:8080 -v ~/.openclaw:/home/dashboard/.openclaw openclaw-dashboard\n```\n\n### Nix Flake\n\n```bash\n# Run directly\nnix run github:mudrii/openclaw-dashboard\n\n# Dev shell (Go + tools)\nnix develop github:mudrii/openclaw-dashboard\n```\n\n## Themes\n\nClick the 🎨 button in the header to switch themes instantly — no reload or server restart needed. Choice persists via `localStorage`.\n\n| Theme | Type | Vibe |\n|-------|------|------|\n| 🌙 **Midnight** | Dark | Original glass morphism (default) |\n| 🏔️ **Nord** | Dark | Arctic blue, calm, great for long sessions |\n| 🌸 **Catppuccin Mocha** | Dark | Warm pastels, easy on eyes |\n| ☀️ **GitHub Light** | Light | Clean, professional, high readability |\n| 🌅 **Solarized Light** | Light | Scientifically optimized contrast |\n| 🌻 **Catppuccin Latte** | Light | Soft pastels |\n\n### Custom Themes\n\nAdd your own themes by editing `themes.json` in your runtime directory. Default themes\nship from `assets/runtime/themes.json`. Each theme defines 19 CSS color variables:\n\n```json\n{\n  \"my-theme\": {\n    \"name\": \"My Theme\",\n    \"type\": \"dark\",\n    \"icon\": \"🎯\",\n    \"colors\": {\n      \"bg\": \"#1a1a2e\",\n      \"surface\": \"rgba(255,255,255,0.03)\",\n      \"surfaceHover\": \"rgba(255,255,255,0.045)\",\n      \"border\": \"rgba(255,255,255,0.06)\",\n      \"accent\": \"#e94560\",\n      \"accent2\": \"#0f3460\",\n      \"green\": \"#4ade80\",\n      \"yellow\": \"#facc15\",\n      \"red\": \"#f87171\",\n      \"orange\": \"#fb923c\",\n      \"purple\": \"#a78bfa\",\n      \"text\": \"#e5e5e5\",\n      \"textStrong\": \"#ffffff\",\n      \"muted\": \"#737373\",\n      \"dim\": \"#525252\",\n      \"darker\": \"#404040\",\n      \"tableBg\": \"rgba(255,255,255,0.025)\",\n      \"tableHover\": \"rgba(255,255,255,0.05)\",\n      \"scrollThumb\": \"rgba(255,255,255,0.1)\"\n    }\n  }\n}\n```\n\n## Architecture\n\n```text\ncmd/openclaw-dashboard/      CLI entrypoint\ninternal/appconfig/          config loading\ninternal/appruntime/         runtime-dir resolution\ninternal/appchat/            chat prompt + gateway client\ninternal/apprefresh/         data collector\ninternal/appserver/          HTTP server\ninternal/appsystem/          metrics and runtime probes\nweb/index.html              embedded frontend\nassets/runtime/             runtime defaults\ndata.json                   generated dashboard data\n```\n\n**Endpoints:**\n\n| Endpoint | Method | Description |\n|---|---|---|\n| `/` | GET | Serves embedded `web/index.html` with theme/version injection |\n| `/api/refresh` | GET | Stale-while-revalidate data.json (instant response, background refresh) |\n| `/api/chat` | POST | AI chat via OpenClaw gateway (10 req/min rate limit) |\n| `/api/system` | GET | Live host metrics (CPU/RAM/Swap/Disk) + gateway status |\n\n| Feature | Details |\n|---|---|\n| Serves frontend | Embedded from `web/index.html` (`//go:embed`) |\n| `/api/refresh` | Stale-while-revalidate (instant response) |\n| `/api/chat` | Mtime-cached `data.json` (dual raw+parsed cache) |\n| `/api/system` | `SystemService` — parallel collectors, RWMutex cache |\n| Static files | Allowlisted only (`themes.json`, optional favicons) |\n| Rate limiting | 10 req/min per-IP on `/api/chat` |\n| HTTP timeouts | Read 30s / Write 90s / Idle 120s |\n| Pre-warm | Runs `--refresh` at startup |\n| Shutdown | Graceful (drains requests, 5s timeout) |\n| Gateway limit | 1MB response cap |\n| Tests | `go test -race` |\n\nWhen you open the dashboard, the embedded frontend calls `/api/refresh`. The server runs `--refresh` (with 30s debounce) to collect fresh data from your OpenClaw installation, then returns the JSON. No cron jobs needed.\n\nThe `/api/chat` endpoint accepts `{\"question\": \"...\", \"history\": [...]}` and forwards a stateless request to the OpenClaw gateway's OpenAI-compatible `/v1/chat/completions` endpoint, with a system prompt built from live `data.json`.\n\n### Frontend Module Structure\n\nThe entire frontend lives in a single `\u003cscript\u003e` tag inside `web/index.html` — zero dependencies, no build step. The JS is organized into 7 plain objects:\n\n```\n┌─────────────────────────────────────────────┐\n│                 App.init()                   │\n│       (wires everything, starts timer)       │\n└───────┬──────────────┬──────────────┬───────┘\n        │              │              │\n   ┌────▼────┐   ┌─────▼─────┐  ┌────▼─────┐\n   │  State  │◄──│ DataLayer │  │  Theme   │\n   │ (truth) │   │  (fetch)  │  │ (colors) │\n   └────┬────┘   └───────────┘  └──────────┘\n        │\n   ┌────▼────────────┐\n   │  DirtyChecker   │\n   │ (what changed?) │\n   └────┬────────────┘\n        │\n   ┌────▼────┐   ┌────────┐\n   │Renderer │   │  Chat  │\n   │  (DOM)  │   │  (AI)  │\n   └─────────┘   └────────┘\n```\n\n| Module | Responsibility |\n|--------|----------------|\n| **State** | Single source of truth — holds `data`, `prev`, `tabs`, `countdown`. Produces immutable deep-frozen snapshots for each render cycle. |\n| **DataLayer** | Stateless fetch with `_reqId` counter for out-of-order protection. Returns parsed JSON or `null`. |\n| **DirtyChecker** | Computes 13 boolean dirty flags by comparing current snapshot against `State.prev`. Uses `stableSnapshot()` to strip volatile timestamps from crons/sessions. |\n| **Renderer** | Pure DOM side-effects. Receives frozen snapshot + pre-computed flags, dispatches to 14 section renderers. Owns the agent hierarchy tree, recent-finished buffer, and all chart SVG rendering. |\n| **Theme** | Self-contained theme engine — loads `themes.json`, applies CSS variables, persists choice to `localStorage`. |\n| **Chat** | AI chat panel — manages history, sends stateless requests to `/api/chat`. |\n| **App** | Wiring layer — `init()` starts theme + timer + first fetch; `renderNow()` captures snapshot → computes flags → schedules render via `requestAnimationFrame`; `commitPrev(snap)` runs inside rAF to prevent fetch/paint races. |\n\nAll inline `onclick` handlers route through `window.OCUI` — a thin namespace that calls `State.setTab()` / `App.renderNow()`. No bare globals remain outside the module objects and top-level utilities (`$`, `esc`, `safeColor`, `relTime`).\n\nSee [ARCHITECTURE.md](ARCHITECTURE.md) for the full specification.\n\n## Configuration\n\nEdit `config.json` in your dashboard runtime directory. In a source checkout this\nis usually the repo root. For `install.sh` installs it is\n`${OPENCLAW_HOME:-~/.openclaw}/dashboard/config.json`; with Homebrew it is\n`~/.openclaw/dashboard/config.json`.\n\n```json\n{\n  \"bot\": {\n    \"name\": \"My Bot\",\n    \"emoji\": \"🤖\"\n  },\n  \"theme\": {\n    \"preset\": \"nord\"\n  },\n  \"refresh\": {\n    \"intervalSeconds\": 30\n  },\n  \"server\": {\n    \"port\": 8080,\n    \"host\": \"127.0.0.1\"\n  },\n  \"ai\": {\n    \"enabled\": true,\n    \"gatewayPort\": 18789,\n    \"model\": \"your-model-id\",\n    \"maxHistory\": 6,\n    \"dotenvPath\": \"~/.openclaw/.env\"\n  },\n  \"system\": {\n    \"enabled\": true,\n    \"pollSeconds\": 10,\n    \"diskPath\": \"/\",\n    \"cpu\":  { \"warn\": 80, \"critical\": 95 },\n    \"ram\":  { \"warn\": 75, \"critical\": 90 },\n    \"swap\": { \"warn\": 80, \"critical\": 95 },\n    \"disk\": { \"warn\": 85, \"critical\": 95 }\n  }\n}\n```\n\n### Configuration Options\n\n| Key | Default | Description |\n|-----|---------|-------------|\n| `bot.name` | `\"OpenClaw Dashboard\"` | Dashboard title |\n| `bot.emoji` | `\"🦞\"` | Avatar emoji |\n| `theme.preset` | `\"midnight\"` | Default theme (`midnight`, `nord`, `catppuccin-mocha`, `github-light`, `solarized-light`, `catppuccin-latte`) |\n| `timezone` | `\"UTC\"` | IANA timezone for all time calculations |\n| `refresh.intervalSeconds` | `30` | Debounce interval for refresh |\n| `alerts.dailyCostHigh` | `50` | Daily cost threshold for high alert ($) |\n| `alerts.dailyCostWarn` | `20` | Daily cost threshold for warning alert ($) |\n| `alerts.contextPct` | `80` | Context usage % threshold for alerts |\n| `alerts.memoryMb` | `640` | Gateway memory threshold (MB) for alerts |\n| `server.port` | `8080` | Server port (also `--port` / `-p` flag or `DASHBOARD_PORT` env) |\n| `server.host` | `\"127.0.0.1\"` | Server bind address (also `--bind` / `-b` flag or `DASHBOARD_BIND` env) |\n| `ai.enabled` | `true` | Enable/disable the AI chat panel and `/api/chat` endpoint |\n| `ai.gatewayPort` | `18789` | Port of your OpenClaw gateway |\n| `ai.model` | `\"\"` | Model to use for chat — any model ID registered in your OpenClaw gateway |\n| `ai.maxHistory` | `6` | Number of previous messages to include for context |\n| `ai.dotenvPath` | `\"~/.openclaw/.env\"` | Path to `.env` file containing `OPENCLAW_GATEWAY_TOKEN` |\n| `system.enabled` | `true` | Enable/disable the top metrics bar and `/api/system` endpoint |\n| `system.pollSeconds` | `10` | How often the browser polls `/api/system` (seconds, 2–60) |\n| `system.metricsTtlSeconds` | `10` | Server-side metrics cache TTL (seconds) |\n| `system.versionsTtlSeconds` | `300` | Version/gateway probe cache TTL (seconds) |\n| `system.gatewayTimeoutMs` | `5000` | Timeout for gateway liveness probe (ms) |\n| `system.diskPath` | `\"/\"` | Filesystem path to report disk usage for |\n| `system.warnPercent` | `70` | Global warn threshold (% used) — overridden by per-metric values |\n| `system.criticalPercent` | `85` | Global critical threshold (% used) — overridden by per-metric values |\n| `system.cpu.warn` | `80` | CPU warn threshold (%) |\n| `system.cpu.critical` | `95` | CPU critical threshold (%) |\n| `system.ram.warn` | `80` | RAM warn threshold (%) |\n| `system.ram.critical` | `95` | RAM critical threshold (%) |\n| `system.swap.warn` | `80` | Swap warn threshold (%) |\n| `system.swap.critical` | `95` | Swap critical threshold (%) |\n| `system.disk.warn` | `80` | Disk warn threshold (%) |\n| `system.disk.critical` | `95` | Disk critical threshold (%) |\n\n### Top Metrics Bar\n\nThe top bar shows live host metrics — always visible above the alerts banner.\n\n**Metrics displayed:**\n| Pill | What it shows |\n|------|--------------|\n| CPU | Usage % (current delta, not boot average) |\n| RAM | Used / Total GB |\n| Swap | Usage % |\n| Disk | Used / Total GB (used %) |\n| OpenClaw | Installed version |\n| GW | Gateway status (online / offline) |\n\n**Colour coding:**\n- 🟢 Green — below warn threshold\n- 🟡 Yellow — above warn, below critical\n- 🔴 Red — above critical threshold\n- ⚫ Grey — collection error / N/A\n\n**Per-metric config example (`config.json`):**\n```json\n\"system\": {\n  \"enabled\": true,\n  \"pollSeconds\": 10,\n  \"diskPath\": \"/\",\n  \"cpu\":  { \"warn\": 80, \"critical\": 95 },\n  \"ram\":  { \"warn\": 75, \"critical\": 90 },\n  \"swap\": { \"warn\": 60, \"critical\": 80 },\n  \"disk\": { \"warn\": 85, \"critical\": 95 }\n}\n```\n\n**Platform support:**\n- **macOS** — CPU via `top -l 2` (current delta), RAM via `vm_stat`, Swap via `sysctl vm.swapusage`, Disk via `statfs`\n- **Linux** — CPU via `/proc/stat` (200ms dual-sample including steal field), RAM+Swap via `/proc/meminfo` (single read, shared), Disk via `statfs`\n\n**API endpoint:** `GET /api/system` — returns JSON with all metrics, thresholds, version info, and the `openclaw` runtime block. Includes stale-serving semantics (returns cached data immediately while refreshing in background).\n\n**`openclaw` block in `/api/system`** — provides live gateway runtime state beyond what the refresh collector gathers:\n\n| Field | Description |\n|-------|-------------|\n| `openclaw.gateway.live` | `true` when `/healthz` returns 200 |\n| `openclaw.gateway.ready` | `true` when `/readyz` indicates all deps ready |\n| `openclaw.gateway.uptimeMs` | Process uptime in milliseconds (from `/healthz`) |\n| `openclaw.gateway.failing` | Array of failing dependency names from `/readyz` |\n| `openclaw.gateway.healthEndpointOk` | Whether `/healthz` endpoint responded |\n| `openclaw.gateway.readyEndpointOk` | Whether `/readyz` endpoint responded |\n| `openclaw.status.currentVersion` | Installed OpenClaw version |\n| `openclaw.status.latestVersion` | Latest published version (from npm) |\n| `openclaw.status.connectLatencyMs` | Gateway connection latency (ms) |\n| `openclaw.freshness.gateway` | RFC3339 timestamp of last successful gateway probe |\n| `openclaw.freshness.status` | RFC3339 timestamp of last successful status probe |\n\n---\n\n### AI Chat Setup\n\nThe chat panel requires:\n\n1. Your OpenClaw gateway running with the `chatCompletions` endpoint enabled:\n   ```json\n   \"gateway\": {\n     \"http\": { \"endpoints\": { \"chatCompletions\": { \"enabled\": true } } }\n   }\n   ```\n2. `OPENCLAW_GATEWAY_TOKEN` set in your `.env` file (defaults to `~/.openclaw/.env`)\n\nThe chat is stateless — each question is sent directly to the gateway with a system prompt built from live `data.json`. No agent memory or tools bleed in.\n\nSee [docs/CONFIGURATION.md](docs/CONFIGURATION.md) for full details.\n\n## Screenshots\n\nFull dashboard view — all sections at a glance:\n\n![Dashboard Full View](screenshots/00-full-page.png)\n\n---\n\n### 🔔 Overview \u0026 System Health\nReal-time bot status, gateway uptime, memory usage, active session count, today's cost, all-time spend, projected monthly cost, and a per-model cost breakdown donut chart. Smart alert banners surface high costs, failed crons, and context overflows automatically.\n\n![Overview](screenshots/01-overview.png)\n\n---\n\n### 📈 Charts \u0026 Trends\nThree always-visible SVG charts with 7d/30d toggle: cost trend over time, per-model cost breakdown bars, and sub-agent activity volume. No external chart libraries — pure inline SVG.\n\n![Charts \u0026 Trends](screenshots/02-charts-trends.png)\n\n---\n\n### ⏰ Cron Jobs\nAll scheduled jobs with status badges (active/idle/error), schedule expression, last run time, next run, duration, and the model used. At-a-glance view of your automation health.\n\n![Cron Jobs](screenshots/03-cron-jobs.png)\n\n---\n\n### 📡 Active Sessions + Agent Hierarchy Tree\nLive sessions with model, type badges (DM / group / subagent), context usage %, and token count. Above the session list: a visual agent hierarchy tree showing parent → sub-agent → sub-sub-agent relationships with live/idle status and trigger labels — updated every refresh.\n\n![Active Sessions](screenshots/04-active-sessions.png)\n\n---\n\n### 📊 Token Usage \u0026 Cost\nPer-model token and cost breakdown with 7d / 30d / all-time tabs. Includes input tokens, output tokens, cache reads, and total cost per model — sortable at a glance.\n\n![Token Usage](screenshots/05-token-usage.png)\n\n---\n\n### 🤖 Sub-Agent Activity\nAll sub-agent runs with cost, duration, status, and token breakdown. Separate 7d/30d tabs. Useful for tracking which tasks spawn the most agents and where spend is concentrated.\n\n![Sub-Agent Activity](screenshots/06-subagent-activity.png)\n\n---\n\n### 🧩 Available Models, Skills \u0026 Git Log\nQuick reference panel showing all configured models, active skills, and the last 5 git commits from your OpenClaw workspace — so you always know what's deployed.\n\n![Models Skills Git](screenshots/07-models-skills-git.png)\n\n---\n\n### ⚙️ Agent \u0026 Model Configuration\nFull agent setup at a glance: model routing chain (primary → fallbacks), sub-agent routing by purpose (General / Dev+Coding / Work), agent details table with per-agent fallbacks, agent bindings with resolved group names, runtime config (compaction, memory flush), and subagent limits (max depth, max children/agent).\n\n![Agent Config](screenshots/08-agent-config.png)\n\n## Uninstall\n\n```bash\nopenclaw-dashboard uninstall\n```\n\nThis stops the service, removes the LaunchAgent (macOS) or systemd unit (Linux), and preserves all config and data at `~/.openclaw/dashboard`.\n\nTo also remove all data:\n```bash\nopenclaw-dashboard uninstall\nrm -rf ~/.openclaw/dashboard\n```\n\nOr using the uninstall script to remove the runtime directory as well:\n```bash\n./uninstall.sh\n```\n\n## Requirements\n\n- Pre-built Go binary — no runtime dependencies\n- `bash` (only needed if using the optional `refresh.sh` wrapper script, not required for the binary itself)\n- **OpenClaw** — Installed at `~/.openclaw` ([docs](https://docs.openclaw.ai))\n- **macOS** 10.15+ or **Linux** (Ubuntu 18.04+, Debian 10+, ARM64)\n- Modern web browser\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n## License\n\nMIT License — see [LICENSE](LICENSE)\n\n---\n\nMade with 🦞 for the [OpenClaw](https://github.com/openclaw/openclaw) community\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmudrii%2Fopenclaw-dashboard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmudrii%2Fopenclaw-dashboard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmudrii%2Fopenclaw-dashboard/lists"}