Control UI (browser)
De Control UI is een kleine Vite + Lit single-page app die door de Gateway wordt geserveerd:- standaard:
http://<host>:18789/ - optionele prefix: stel
gateway.controlUi.basePathin (bijv./openclaw)
Snel openen (lokaal)
Als de Gateway op dezelfde computer draait, open: Als de pagina niet laadt, start eerst de Gateway:openclaw gateway.
Authenticatie wordt tijdens de WebSocket-handshake aangeleverd via:
connect.params.auth.tokenconnect.params.auth.passwordHet instellingenpaneel van het dashboard laat je een token opslaan; wachtwoorden worden niet opgeslagen. De onboarding-wizard genereert standaard een gateway-token, dus plak dit hier bij de eerste verbinding.
Apparaatkoppeling (eerste verbinding)
Wanneer je de Control UI vanaf een nieuwe browser of apparaat opent, vereist de Gateway een eenmalige koppelingsgoedkeuring — zelfs als je je op hetzelfde Tailnet bevindt metgateway.auth.allowTailscale: true. Dit is een beveiligingsmaatregel om
ongeautoriseerde toegang te voorkomen.
Wat je ziet: “disconnected (1008): pairing required”
Om het apparaat goed te keuren:
openclaw devices revoke --device <id> --role <role>. Zie
Devices CLI voor tokenrotatie en intrekking.
Notities:
- Lokale verbindingen (
127.0.0.1) worden automatisch goedgekeurd. - Externe verbindingen (LAN, Tailnet, enz.) vereisen expliciete goedkeuring.
- Elk browserprofiel genereert een unieke apparaat-ID; wisselen van browser of het wissen van browsergegevens vereist opnieuw koppelen.
Wat het kan (nu)
- Chatten met het model via Gateway WS (
chat.history,chat.send,chat.abort,chat.inject) - Tool-calls streamen + live tool-uitvoerkaarten in Chat (agent-events)
- Kanalen: WhatsApp/Telegram/Discord/Slack + plugin-kanalen (Mattermost, enz.) status + QR-login + per-kanaalconfiguratie (
channels.status,web.login.*,config.patch) - Instanties: aanwezigheidslijst + verversen (
system-presence) - Sessies: lijst + per-sessie overrides voor thinking/verbose (
sessions.list,sessions.patch) - Cron-jobs: lijst/toevoegen/uitvoeren/inschakelen/uitschakelen + uitvoergeschiedenis (
cron.*) - Skills: status, in-/uitschakelen, installeren, API-sleutelupdates (
skills.*) - Nodes: lijst + caps (
node.list) - Uitvoeringsgoedkeuringen: gateway- of node-toegestane lijsten bewerken + beleid vragen voor
exec host=gateway/node(exec.approvals.*) - Config: bekijken/bewerken
~/.openclaw/openclaw.json(config.get,config.set) - Config: toepassen + herstarten met validatie (
config.apply) en de laatst actieve sessie wekken - Config-wegschrijvingen bevatten een base-hash-beveiliging om het overschrijven van gelijktijdige bewerkingen te voorkomen
- Config-schema + formulierweergave (
config.schema, inclusief plugin- en kanaalschema’s); de Raw JSON-editor blijft beschikbaar - Debug: status/health/model-snapshots + eventlog + handmatige RPC-calls (
status,health,models.list) - Logs: live tail van gateway-bestandslogs met filter/export (
logs.tail) - Update: een package/git-update uitvoeren + herstarten (
update.run) met een herstartrapport
- Voor geïsoleerde jobs staat de levering standaard op aankondiging van een samenvatting. Je kunt dit op geen zetten als je alleen interne runs wilt.
- Velden voor kanaal/doel verschijnen wanneer aankondigen is geselecteerd.
Chatgedrag
chat.sendis niet-blokkerend: het bevestigt onmiddellijk met{ runId, status: "started" }en de respons streamt viachat-events.- Opnieuw verzenden met dezelfde
idempotencyKeygeeft{ status: "in_flight" }terug tijdens het uitvoeren, en{ status: "ok" }na voltooiing. chat.injectvoegt een assistentnotitie toe aan het sessietranscript en zendt eenchat-event uit voor UI-only updates (geen agent-run, geen kanaallevering).- Stoppen:
- Klik Stop (roept
chat.abortaan) - Typ
/stop(ofstop|esc|abort|wait|exit|interrupt) om out-of-band te annuleren chat.abortondersteunt{ sessionKey }(geenrunId) om alle actieve runs voor die sessie te stoppen
- Klik Stop (roept
Tailnet-toegang (aanbevolen)
Geïntegreerde Tailscale Serve (voorkeur)
Houd de Gateway op loopback en laat Tailscale Serve deze met HTTPS proxyen:https://<magicdns>/(of je geconfigureerdegateway.controlUi.basePath)
tailscale-user-login) wanneer gateway.auth.allowTailscale is true. OpenClaw
verifieert de identiteit door het x-forwarded-for-adres te resolven met
tailscale whois en dit te matchen met de header, en accepteert deze alleen wanneer het
verzoek loopback raakt met Tailscale’s x-forwarded-*-headers. Stel
gateway.auth.allowTailscale: false in (of forceer gateway.auth.mode: "password")
als je ook voor Serve-verkeer een token/wachtwoord wilt vereisen.
Binden aan tailnet + token
http://<tailscale-ip>:18789/(of je geconfigureerdegateway.controlUi.basePath)
connect.params.auth.token).
Onbeveiligd HTTP
Als je het dashboard opent via plain HTTP (http://<lan-ip> of http://<tailscale-ip>),
draait de browser in een niet-beveiligde context en blokkeert WebCrypto. Standaard
blokkeert OpenClaw Control UI-verbindingen zonder apparaatidentiteit.
Aanbevolen oplossing: gebruik HTTPS (Tailscale Serve) of open de UI lokaal:
https://<magicdns>/(Serve)http://127.0.0.1:18789/(op de Gateway-host)
De UI bouwen
De Gateway serveert statische bestanden vanuitdist/control-ui. Bouw ze met:
ws://127.0.0.1:18789).
Debuggen/testen: dev-server + externe Gateway
De Control UI bestaat uit statische bestanden; het WebSocket-doel is configureerbaar en kan afwijken van de HTTP-origin. Dit is handig wanneer je de Vite dev-server lokaal wilt draaien maar de Gateway elders draait.- Start de UI dev-server:
pnpm ui:dev - Open een URL zoals:
gatewayUrlwordt na het laden opgeslagen in localStorage en uit de URL verwijderd.tokenwordt opgeslagen in localStorage;passwordblijft alleen in het geheugen.- Wanneer
gatewayUrlis ingesteld, valt de UI niet terug op config- of omgevingsreferenties. Levertoken(ofpassword) expliciet aan. Het ontbreken van expliciete referenties is een fout. - Gebruik
wss://wanneer de Gateway achter TLS staat (Tailscale Serve, HTTPS-proxy, enz.). gatewayUrlwordt alleen geaccepteerd in een top-level venster (niet ingebed) om clickjacking te voorkomen.- Voor cross-origin dev-opstellingen (bijv.
pnpm ui:devnaar een externe Gateway), voeg de UI- origin toe aangateway.controlUi.allowedOrigins.