control-ui
Skill556 starsChanged 34 days agoMITView on GitHub
Operate and troubleshoot the OpenClaw Control UI: navigate connected clients, organize sessions, build session dashboards, and handle direct or Tailscale-hosted Gateways.
19 other projects use a version of this, 7 of them edited.
Adopted by
Most recently taken up by
- paramcodes/skillstheir own version, first seen Nov 8, 2026
- ArchitektApx/cursor-skills-for-claudetheir own version, first seen Nov 1, 2026
- AnastasiyaW/codex-claude-code-configtheir own version, first seen Oct 30, 2026
- conscientiousness/herdr-pstack-orchestratortheir own version, first seen Oct 20, 2026
- ngcto/oh-my-pstacktheir own version, first seen Oct 20, 2026
- anis-dr/skillstheir own version, first seen Oct 15, 2026
Used with
Projects with it also use openclaw-performance and plugin-sdk-impact.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
clawdbotSkillopenclaw-performance
Performance work in OpenClaw: a slow or heavy flow (latency, CPU, memory, SQL, RPC, renders), writing or reviewing a perf PR, or adding a cache. Count the work, delete waste first, cache last.
Also in 7 projects that use this
clawdbotSkillplugin-sdk-impact
Count Plugin SDK consumers across live ClawHub releases and bundled OpenClaw plugins before deprecation, removal, or behavior changes; supports public release-date filters.
Also in 7 projects that use this
Other versions19 projects use a version of this.
Word for word · 2
- molt-bot/clawdbot★ 391k100% same
- friuns2/openclaw-android-assistant★ 573100% same
Edited · 7
- moltbot/clawdbot★ 394k97% same
- steipete/warelay★ 394k97% same
- steipete/clawdis★ 394k97% same
- moltbot/moltbot★ 394k97% same
- clawdbot/clawdbot★ 394k98% same
- openclaw/openclaw★ 394k98% same
- bighamx/openclaw-android-node-apk★ 5797% same
Wrote their own version · 10
- AnastasiyaW/claude-code-config★ 214same name
- AnastasiyaW/codex-claude-code-config★ 214same name
- anis-dr/skills★ 3same name
- conscientiousness/herdr-pstack-orchestrator★ 2same name
- EvanBatten/pstack-for-cc★ 2same name
- ElyzeSolutions/skills★ 1same name
- khgouldy/skills★ 1same name
- ngcto/oh-my-pstack★ 1same name
- ArchitektApx/cursor-skills-for-claude★ 0same name
- paramcodes/skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository107 other files it gives its agents.
- AGENTS.mdAGENTS.md
- docs/AGENTS.mdAGENTS.md
- extensions/AGENTS.mdAGENTS.md
- openclaw-android/AGENTS.mdAGENTS.md
- scripts/AGENTS.mdAGENTS.md
- test/AGENTS.mdAGENTS.md
- ui/AGENTS.mdAGENTS.md
- agent-transcriptSkill
- auto-qaSkill
- autoreviewSkill
- channel-message-flowsSkill
- clawdtributorSkill
- claw-scoreSkill
- clawsweeperSkill
- codex-app-paritySkill
- control-ui-e2eSkill
- crabboxSkill
- deslopSkill
- discord-clawdSkill
- discord-e2eSkill
- discord-user-postSkill
- discrawlSkill
- gitcrawlSkill
- graincrawlSkill
- notcrawlSkill
- openclaw-changelog-updateSkill
- openclaw-ci-limitsSkill
- openclaw-debuggingSkill
- openclaw-docker-e2e-authoringSkill
- openclaw-ghsa-maintainerSkill
- openclaw-live-updaterSkill
- openclaw-parallels-smokeSkill
- openclaw-pr-maintainerSkill
- openclaw-qa-testingSkill
- openclaw-refactor-docsSkill
- openclaw-release-validationSkill
- openclaw-repair-sweepSkill
- openclaw-secret-scanning-maintainerSkill
- openclaw-test-heap-leaksSkill
- openclaw-testingSkill
- openclaw-test-performanceSkill
- openclaw-updateSkill
- parallels-discord-roundtripSkill
- proof-videoSkill
- prototype-openclaw-tuiSkill
- release-openclaw-announcementSkill
- release-openclaw-ciSkill
- release-openclaw-macSkill
- release-openclaw-maintainerSkill
- release-openclaw-plugin-testingSkill
- security-triageSkill
- slack-e2eSkill
- slacrawlSkill
- tag-duplicate-prs-issuesSkill
- technical-documentationSkill
- telegram-e2e-userbotSkill
- test-auditSkill
- update-team-serverSkill
- verify-releaseSkill
- 1passwordSkill
- The first 60 shown.
The file
Show its rules and text
We split this skill into the rules it gives an agent
29 rules. 0 are common, 19 are distinctive, and 10 are very specific to this project.
0
Common
Most of the 17 edited versions we read keep these.
19
Distinctive
This author's own choices. Worth a look.
10
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 9
Use OpenClaw's typed UI tools for state and layout.
- Distinctive: line 25
Do not replace these operations with shell calls or raw Gateway RPC when the typed tool exists.
- Distinctive: line 32
If the user wants a dedicated sidebar dashboard, choose or create its visible session before authoring any widget.
- Distinctive: line 35
If the current turn is running in a temporary or parent session, hand the dashboard task to the intended visible session first.
- Distinctive: line 38
Read current state before changing it:
- Very specific: line 39
use sessions_list to resolve the session.
- Very specific: line 40
use dashboard with action: "read" for the current session.
- Distinctive: line 42
If the task targets another session's board, move the work into that session.
- Distinctive: line 45
Read hosting.md before opening or repairing a remote Control UI.
- Very specific: line 48
Use the visualize skill for widget composition, libraries, interactive code explanations, and dashboard content.
- Very specific: line 53
Use screen for deterministic client commands:
- Distinctive: line 66
Use the in-app browser or an available browser-control tool when the task needs DOM inspection, clicking, typing, or screenshots.
- Very specific: line 72
Call dashboard read. Reuse suitable tabs and widget names.
- Very specific: line 73
Create or rename tabs with tab_create / tab_update.
- Distinctive: line 75
Add content with the correct owner:
- Very specific: line 82
Do not embed Grafana or another external application in an <iframe> inside show_widget.
- Very specific: line 87
Use a stable name when calling show_widget.
- Very specific: line 92
Call dashboard focus_tab to show the intended tab in the dashboard side panel.
- Distinctive: line 101
Never create a fake top-level page for a dashboard.
- Distinctive: line 106
Read first and mutate the smallest unit.
- Distinctive: line 107
Keep stable tab IDs and widget names unless replacement is intentional.
- Distinctive: line 108
Do not change a widget's content owner in place.
- Distinctive: line 117
Use two layers of proof:
- Distinctive: line 127
Do not claim the dashboard works until the sandboxed frame renders.
- Distinctive: line 131
If no browser-control or connected-client inspection is available, report the dashboard as published but visually unverified instead of …
- Distinctive: line 136
When a widget is blank or stale:
- Distinctive: line 141
verify the Control UI origin, the separate widget sandbox origin, and the protocol used on every reverse-proxy hop.
- Very specific: line 143
if widget JavaScript reports Failed to fetch, verify its exact HTTPS origin is declared and granted in capabilities.netOrigins, then check …
- Distinctive: line 146
after a Gateway restart or routing change, republish/update the widget so the browser receives a fresh ticketed frame URL.
“Common” is measured: kept by at least 6 in 10 of the 17 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Control UI
Use OpenClaw's typed UI tools for state and layout. Use browser automation only to inspect or interact with rendered pixels.
Mental model
- A sidebar item is a session, not a dashboard page.
- Each session owns one board. The board contains tabs and widgets.
- Pinning a session keeps it in the sidebar. Sessions with a stored board appear
in the
/dashboardsgallery. screenchanges connected Control UI layout and navigation. It does not read the page or take screenshots.sessions_listfinds sessions.sessionsrenames, groups, pins, or archives them. It does not edit board content.dashboardreads and arranges the current session's board and registered plugin widgets.show_widgetauthors or updates custom HTML/SVG widgets.
Do not replace these operations with shell calls or raw Gateway RPC when the typed tool exists.
Start safely
- Identify the target session and whether the Control UI is local/direct or
published through Tailscale or another HTTPS proxy.
- If the user wants a dedicated sidebar dashboard, choose or create its visible session before authoring any widget. A tab is only a partition inside one session's board; it never creates a sidebar row.
- If the current turn is running in a temporary or parent session, hand the dashboard task to the intended visible session first. Board widgets are keyed by session and cannot be moved to another session afterward.
- Read current state before changing it:
- use
sessions_listto resolve the session; - use
dashboardwithaction: "read"for the current session; - inspect existing tabs, stable widget names, owners, sizes, and panel layout.
- use
- 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 before opening or repairing a remote
Control UI. Read 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.
Navigate and arrange the UI
Use screen for deterministic client commands:
navigateto open a session bysessionKey;sidebar_show/sidebar_hidefor the session sidebar;split_right/split_down,focus, andclose_panefor panes;terminal_show/terminal_hideandbrowser_show/browser_hidefor 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.
Build a session dashboard
- Call
dashboard read. Reuse suitable tabs and widget names. - Create or rename tabs with
tab_create/tab_update; use short lowercase slug IDs. - Add content with the correct owner:
- native text, metrics, tables, charts, and links:
show_widgetwithpin: trueandreport; - self-contained custom HTML/SVG or registered-source content:
show_widgetwithpin: true; - trusted plugin widgets:
dashboard widget_putwith an advertisedpluginKind. Do not embed Grafana or another external application in an<iframe>insideshow_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 declaredcapabilities.netOrigins, use a Gateway data binding, or install/use a trusted plugin widget instead.
- native text, metrics, tables, charts, and links:
- Use a stable
namewhen callingshow_widget. Reusing the same name with newwidget_codeupdates the widget in place. - Arrange with
widget_move,widget_resize, and tab reordering. Prefer size presets and board order over pixel placement. - Pin the current session with
sessions patchwhen it should stay prominent. - Call
dashboard focus_tabto 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. - Choose the presentation after focusing the tab.
set_presentationwithpresentation: "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.
Update without breaking the board
- Read first and mutate the smallest unit.
- Keep stable tab IDs and widget names unless replacement is intentional.
- Do not change a widget's content owner in place. Remove it, then recreate it with the new owner or registered kind.
- Capability grants are bound to exact widget bytes and revision. Changed content may require approval again.
- Resetting a conversation preserves its board. Deleting the session deletes the board.
Verify the result
Use two layers of proof:
- State:
dashboard readshows the expected tabs, widgets, names, owners, order, and sizes;sessions_listshows the expected session metadata. - Rendered UI: open the actual Control UI, confirm the correct session and dashboard panel, then inspect or screenshot the widget frame. Exercise any important controls.
An HTTP 200 for the shell or widget route is transport proof, not visual proof.
Do not claim the dashboard works until the sandboxed frame renders.
For widgets that fetch live data, exercise that fetch from the rendered frame.
A host-side curl does not prove the browser received the required capability
grant or accepted the endpoint's CORS and mixed-content policy.
If no browser-control or connected-client inspection is available, report the
dashboard as published but visually unverified instead of claiming success.
Recovery order
When a widget is blank or stale:
- confirm the expected session, tab, widget name, and revision with
dashboard read; - classify the hosting path using hosting.md;
- verify the Control UI origin, the separate widget sandbox origin, and the protocol used on every reverse-proxy hop;
- if widget JavaScript reports
Failed to fetch, verify its exact HTTPS origin is declared and granted incapabilities.netOrigins, then check browser CORS and mixed-content errors; - after a Gateway restart or routing change, republish/update the widget so the browser receives a fresh ticketed frame URL;
- reload the Control UI and verify the rendered frame, not only route status.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
Reviews can't be read right now.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

