{ "title": "Control UI (browser)", "content": "The Control UI is a small **Vite + Lit** single-page app served by the Gateway:\n\n* default: `http://:18789/`\n* optional prefix: set `gateway.controlUi.basePath` (e.g. `/openclaw`)\n\nIt speaks **directly to the Gateway WebSocket** on the same port.\n\n## Quick open (local)\n\nIf the Gateway is running on the same computer, open:\n\n* [http://127.0.0.1:18789/](http://127.0.0.1:18789/) (or [http://localhost:18789/](http://localhost:18789/))\n\nIf the page fails to load, start the Gateway first: `openclaw gateway`.\n\nAuth is supplied during the WebSocket handshake via:\n\n* `connect.params.auth.token`\n* `connect.params.auth.password`\n The dashboard settings panel lets you store a token; passwords are not persisted.\n The onboarding wizard generates a gateway token by default, so paste it here on first connect.\n\n## Device pairing (first connection)\n\nWhen you connect to the Control UI from a new browser or device, the Gateway\nrequires a **one-time pairing approval** — even if you're on the same Tailnet\nwith `gateway.auth.allowTailscale: true`. This is a security measure to prevent\nunauthorized access.\n\n**What you'll see:** \"disconnected (1008): pairing required\"\n\n**To approve the device:**", "code_samples": [], "headings": [ { "level": "h2", "text": "Quick open (local)", "id": "quick-open-(local)" }, { "level": "h2", "text": "Device pairing (first connection)", "id": "device-pairing-(first-connection)" } ], "url": "llms-txt#control-ui-(browser)", "links": [] }