acp-router
Route plain-language requests for Claude Code, Cursor, Copilot, OpenClaw ACP, OpenCode,…
Operate and troubleshoot the OpenClaw Control UI: navigate connected clients, organize sessions, build session dashboards, and handle direct or Tailscale-hosted Gateways.
$ npx -y skills add openclaw/openclaw --skill control-ui --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/control-uiContext preview
The summary Claude sees to decide when to auto-load this skill.
Operate and troubleshoot the OpenClaw Control UI: navigate connected clients, organize sessions, build session dashboards, and handle direct or Tailscale-hosted Gateways.
name: control-ui description: "Operate and troubleshoot the OpenClaw Control UI: navigate connected clients, organize sessions, build session dashboards, and handle direct or Tailscale-hosted Gateways." user-invocable: true
Use OpenClaw's typed UI tools for state and layout. Use browser automation only to inspect or interact with rendered pixels.
in the `/dashboards` gallery.
the page or take screenshots.
them. It does not edit board content.
plugin widgets. `show_widget` authors or updates custom HTML/SVG widgets.
Do not replace these operations with shell calls or raw Gateway RPC when the typed tool exists.
1. Identify the target session and whether the Control UI is local/direct or published through Tailscale or another HTTPS proxy.
visible session before authoring any widget. A tab is only a partition inside one session's board; it never creates a sidebar row.
dashboard task to the intended visible session first. Board widgets are keyed by session and cannot be moved to another session afterward. 2. Read current state before changing it:
3. If the task targets another session's board, move the work into that session. Dashboard tools intentionally operate on the current session.
Read [hosting.md](references/hosting.md) before opening or repairing a remote Control UI. Read [dashboards.md](references/dashboards.md) before creating or restructuring a board. Use the `visualize` skill for widget composition, libraries, interactive code explanations, and dashboard content. Keep session and board organization here.
Use `screen` for deterministic client commands:
docked panels.
`screen` broadcasts to every connected Control UI that advertises UI commands; it cannot select one browser tab. Confirm the blast radius when several clients may be open. If it reports no capable client, ask the user to open the Control UI and retry.
Use the in-app browser or an available browser-control tool when the task needs DOM inspection, clicking, typing, or screenshots. Reuse the existing signed-in Control UI tab when possible.
1. Call `dashboard read`. Reuse suitable tabs and widget names. 2. Create or rename tabs with `tab_create` / `tab_update`; use short lowercase slug IDs. 3. Add content with the correct owner:
`pin: true` and `report`;
`show_widget` with `pin: true`;
`pluginKind`. Do not embed Grafana or another external application in an `<iframe>` inside `show_widget`; widget sandboxes reject child-frame URLs and navigation. Use an ordinary user-clicked link to open the application, fetch an exact HTTPS API through declared `capabilities.netOrigins`, use a Gateway data binding, or install/use a trusted plugin widget instead. 4. Use a stable `name` when calling `show_widget`. Reusing the same name with new `widget_code` updates the widget in place. 5. Arrange with `widget_move`, `widget_resize`, and tab reordering. Prefer size presets and board order over pixel placement. 6. Pin the current session with `sessions patch` when it should stay prominent. 7. Call `dashboard focus_tab` to show the intended tab in the dashboard side panel. If no Control UI is connected, the command returns unavailable; have the user open the session and retry. 8. Choose the presentation after focusing the tab. `set_presentation` with `presentation: "expanded"` expands the dashboard; `"split"` shows it beside chat in the current panel layout. The human can use **Expand side panel** for a full-width dashboard, **Collapse** to bring chat back, or close the panel for chat alone.
Never create a fake top-level page for a dashboard. For a dedicated dashboard, use a dedicated session, pin that session, and build its board from inside it.
with the new owner or registered kind.
content may require approval again.
the board.
Use two layers of proof:
1. **State:** `dashboard read` shows the expected tabs, widgets, names, owners, order, and sizes; `sessions_list` shows the expected session metadata. 2. **Rendered UI:** open the actual Control UI, confirm the correct session and dashboard panel, then inspect or screenshot the widget frame. Exercise any importan
OpenClaw is an open-source AI assistant that runs on your own computer and meets you in the channels you already use: Discord, iMessage, Slack, Teams, Telegram, WhatsApp, and 20+ more, plus native apps for macOS, iOS, Android, Windows, and Linux.
Repo: openclaw/openclaw
Route plain-language requests for Claude Code, Cursor, Copilot, OpenClaw ACP, OpenCode,…
Use when controlling web pages with the OpenClaw browser tool, especially multi-step flows,…
Present hosted widget documents on a connected macOS panel and control panel visibility or…
Use when asked to open, run, test, or show an app in Crabbox, including native desktops, web…
Use the diffs tool to produce real, shareable diffs (viewer URL, file artifact, or both)…
Discord messaging workflows through OpenClaw's message tool.