{
  "title": "Control UI (browser)",
  "content": "The Control UI is a small **Vite + Lit** single-page app served by the Gateway:\n\n* default: `http://<host>: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": []
}