Give this prompt to your OpenClaw agent and it will build a full Mission Control dashboard for you.
- OpenClaw running with gateway accessible (default:
http://127.0.0.1:18789) - Node.js installed
- Your gateway token (found in your OpenClaw config)
Build a Mission Control dashboard for my OpenClaw agent using Next.js (App Router), Tailwind CSS, and TypeScript.
Setup:
- Create the project at
~/projects/mission-control/ - Store the gateway URL and token in
.env.local(never expose to the browser) - All gateway calls go server-side through API routes using the
/tools/invokeendpoint
Architecture:
- Create
src/lib/openclaw.ts— a server-side client that POSTs to{GATEWAY_URL}/tools/invokewith{ tool, args }and Bearer token auth - The gateway wraps responses in an envelope:
{ ok, result: { content: [{ type: "text", text: "<JSON>" }], details } }— write an unwrap helper to extract the actual data - Gateway timestamps are epoch milliseconds, not seconds
Pages:
-
/feed(default) — Activity feed- Fetch session list + full history for each session via
sessions_listandsessions_historytools - Parse messages:
contentis an array of{ type: "text"|"toolCall", text?, name?, arguments? }parts, not plain strings - Display as a reverse-chronological timeline with colored dots (blue=tool, green=user, purple=assistant)
- Filter buttons: All, Tools, Assistant, User
- Auto-refresh every 30 seconds
- Fetch session list + full history for each session via
-
/calendar— Cron calendar- Fetch jobs via
crontool withaction: "list" - Schedule is an object
{ kind: "cron", expr: "0 5 * * *", tz: "..." }, not a plain string — extract the expr for parsing - Weekly grid view with prev/next navigation, today highlighted
- Click jobs to expand and show run history via
crontool withaction: "runs"
- Fetch jobs via
-
/search— Global search- Debounced input that searches in parallel:
memory_search, workspace grep viaexec,sessions_list, andcronlist - Group results into Memories, Files, Conversations, Tasks sections
- Highlight matching terms
- Debounced input that searches in parallel:
Agent Banner (top of every page):
- Show agent name, version (parsed from
session_statustool output), and whether it's up to date (check npm registry for latest openclaw version) - Stats row: model, context usage, active sessions, runtime mode
- Connected Resources section: badges for each API key/service available
- Capabilities section: badges for each tool category (Web Browse, Shell Exec, File System, etc.)
- Sub-Agents section: list all sessions with keys matching
:subagent:or:cron:, show label, model, token count, running status (pulsing green dot if updated <2min ago), and task description - Quick info: human name, GitHub username, workspace path, secrets manager
- Collapsible — click header to toggle
Nav:
- Sticky top bar with 🦀 logo, page links, and gateway status indicator (green/red dot, polls
/healthevery 30s)
Theme:
- Dark: #0A0A0F background, #1A1A2E cards, #2A2A3E borders
- Accents: blue (#60A5FA), green (#34D399), purple (#A78BFA), red, yellow
- Subtle fade-in animations, loading skeletons
- If the feed shows 0 entries, the gateway response envelope isn't being unwrapped properly. Check that your unwrap helper parses
result.content[0].textas JSON. - If timestamps look wrong (dates in the year 55000+), you're treating milliseconds as seconds. Don't multiply by 1000 if the value is already > 1e12.
- Cron
schedulecomes back as an object, not a string. Extractschedule.exprbefore parsing. - The
contentfield on messages can be a string OR an array of typed parts — handle both.
Built with OpenClaw 🦀