A friendlier chat UI for OpenClaw gateways.
OpenClaw ships a built-in Control UI at http://<gateway>:18789. This is a
separate, opinionated client that talks the same WebSocket protocol but trades
breadth for polish — it focuses on the daily-driver chat surface and leaves
gateway administration to the upstream Control UI.
Status: v0 scaffold. Connection, settings, basic chat send/receive work. Tool-event cards, approval UI, action groups, and richer history rendering are queued up — see Roadmap below.
npx @clawnify/agent-control-uiThat's it. The command starts a local static server on
http://127.0.0.1:5174/. Open it in your browser, fill in the gateway URL +
token, and you're connected.
When run locally, the UI reads ~/.openclaw/openclaw.json over a
loopback-only HTTP endpoint and offers a one-click connect. The token
stays in memory unless you explicitly persist it.
If no local gateway is found (or you want to point at a remote one), the Connection dialog accepts manual settings:
- Gateway URL —
ws://127.0.0.1:18789for a local gateway, orwss://magicdns.example.ts.netover Tailscale Serve. - Gateway token — the shared secret from your gateway's
~/.openclaw/openclaw.jsonundergateway.auth.token.
You can pre-fill via the URL:
http://127.0.0.1:5174/?gatewayUrl=ws://127.0.0.1:18789#token=<your-token>
gatewayUrlis persisted tolocalStorageafter first load.tokenlives in the URL fragment (never sent to any server) and is kept in memory only unless you tick "Remember token in this browser".
pnpm install
pnpm devOpens a Vite dev server at http://localhost:5173.
Auto-start @clawnify/agent-control-ui on boot alongside the OpenClaw gateway. Unit
templates ship with the repo:
- Linux (systemd) — see packaging/systemd/
- macOS / Mac mini (launchd) — see packaging/launchd/
Setup instructions: packaging/README.md.
For non-loopback connections, your gateway must whitelist this app's origin.
Edit ~/.openclaw/openclaw.json:
{
gateway: {
controlUi: {
allowedOrigins: [
"http://localhost:5173",
"https://chat.example.com"
]
}
}
}Loopback (127.0.0.1, localhost) is allowed automatically.
The first browser to connect to a gateway needs a one-time pairing approval.
You will see disconnected (1008): pairing required. On the gateway host:
openclaw devices list
openclaw devices approve <requestId>Once approved, the device is remembered until you revoke it.
- v0: connect handshake, settings, basic
chat.history/chat.send/ streamingchatevents / abort - v0.1: tool-event cards (
tool-eventscap), action groups, action icon/label lookup - v0.2: approval cards (
exec.approval.*,plugin.approval.*) - v0.3: rich history parser (compaction events, retrying phase, fallback toasts, abort partials)
- v0.4: session/model picker, slash commands
src/lib/gateway-ws.ts— disposable WebSocket client for the gateway protocol (v4). Connect handshake with Ed25519 device identity.src/lib/device-identity.ts— Ed25519 keypair generation + challenge signing. Keys persist inlocalStorage.src/lib/config.ts— bootstraps the gateway URL and token from URL fragment / query param /localStorage.src/components/Settings.tsx— form for gateway URL + token.src/components/Chat.tsx— v0 chat surface.
This is an independent client. It speaks the standard Gateway WebSocket protocol documented at openclaw.ai/web/control-ui. No fork, no patches — point it at your gateway and it works.
Issues and pull requests welcome from anyone — see CONTRIBUTING.md for the lightweight workflow.
MIT. See LICENSE.
Initiated by the Clawnify team.