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)
Hij communiceert rechtstreeks met de Gateway WebSocket op dezelfde poort.
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
met gateway.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:
# List pending requests
openclaw devices list
# Approve by request ID
openclaw devices approve <requestId>
Na goedkeuring wordt het apparaat onthouden en is hernieuwde goedkeuring niet nodig,
tenzij je deze intrekt met 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
Notities bij het Cron-jobs-paneel:
- 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
Tailnet-toegang (aanbevolen)¶
Geïntegreerde Tailscale Serve (voorkeur)¶
Houd de Gateway op loopback en laat Tailscale Serve deze met HTTPS proxyen:
openclaw gateway --tailscale serve
Open:
https://<magicdns>/(of je geconfigureerdegateway.controlUi.basePath)
Standaard kunnen Serve-verzoeken authenticeren via Tailscale-identiteitsheaders
(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¶
openclaw gateway --bind tailnet --token "$(openssl rand -hex 32)"
Open daarna:
http://<tailscale-ip>:18789/(of je geconfigureerdegateway.controlUi.basePath)
Plak het token in de UI-instellingen (verzonden als 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)
Downgrade-voorbeeld (alleen token over HTTP):
{
gateway: {
controlUi: { allowInsecureAuth: true },
bind: "tailnet",
auth: { mode: "token", token: "replace-me" },
},
}
Dit schakelt apparaatidentiteit + koppeling uit voor de Control UI (zelfs op HTTPS). Gebruik dit alleen als je het netwerk vertrouwt.
Zie Tailscale voor richtlijnen voor HTTPS-instelling.
De UI bouwen¶
De Gateway serveert statische bestanden vanuit dist/control-ui. Bouw ze met:
pnpm ui:build # auto-installs UI deps on first run
Optionele absolute base (wanneer je vaste asset-URL’s wilt):
OPENCLAW_CONTROL_UI_BASE_PATH=/openclaw/ pnpm ui:build
Voor lokale ontwikkeling (aparte dev-server):
pnpm ui:dev # auto-installs UI deps on first run
Richt daarna de UI op je Gateway WS-URL (bijv. 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:
http://localhost:5173/?gatewayUrl=ws://<gateway-host>:18789
Optionele eenmalige authenticatie (indien nodig):
http://localhost:5173/?gatewayUrl=wss://<gateway-host>:18789&token=<gateway-token>
Notities:
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.
Voorbeeld:
{
gateway: {
controlUi: {
allowedOrigins: ["http://localhost:5173"],
},
},
}
Details voor externe toegang: Remote access.