#trying to access the dashboard
1 messages Β· Page 1 of 1 (latest)
Yes, totally possible β the gotcha is that by default the Control UI (βdashboardβ) is only reachable on localhost of the machine running the Gateway (your Ubuntu VM). So when you open http://127.0.0.1:18789/ on your PC, youβre hitting your PCβs localhost, not the VM.
Recommended (works in basically every setup): SSH tunnel
From your PC, run:
ssh -N -L 18789:127.0.0.1:18789 <user>@<vm-ip-or-hostname>
Then on your PC open:
http://127.0.0.1:18789/
If the UI asks for auth, get the token on the VM:
openclaw config get gateway.auth.token
β¦and paste it into the Control UI settings auth field.
Docs: https://docs.openclaw.ai/gateway/remote and https://docs.openclaw.ai/web/dashboard
Alternative (LAN access, less safe): bind to LAN
If you really want to hit the VM directly from your PC (no tunnel), you must bind the gateway to LAN and have a token set:
{
gateway: {
bind: "lan",
auth: { mode: "token", token: "replace-me" }
}
}
Then youβd open:
http://<vm-lan-ip>:18789/
Be careful: this is an admin UI (chat + config + approvals), so donβt expose it broadly.
About the βhttps bitβ
The gateway does not serve HTTPS on that port by default. HTTPS is usually via Tailscale Serve or a reverse proxy in front.
If you paste:
openclaw --versionopenclaw gateway status
β¦and tell me whether your VM networking is NAT or bridged, I can tell you which of the above is the cleanest for your setup.
If you have both bridged + NAT enabled, you basically have two different ways the VM can be reachable β and they behave very differently:
What βbridged + NATβ means for dashboard access
NAT adapter
- Your VM is behind a virtual router.
- From your PC you cannot reach
18789on the VM unless you set up port forwarding in the VM software. - So βlocalhost trickeryβ wonβt work unless you tunnel/forward.
Bridged adapter
- Your VM gets a real LAN IP (same network as your PC).
- In theory you can reach
http://<vm-ip>:18789/but only if the Gateway is bound to LAN (not loopback) and firewall allows it.
Best option (works regardless of NAT/bridged, and avoids HTTPS headaches): SSH tunnel
On your PC:
ssh -N -L 18789:127.0.0.1:18789 <user>@<vm-ip>
Then open on your PC:
This is also nice because the Control UI is running on localhost (which avoids βsecure contextβ issues that can happen when you hit a raw LAN IP over plain HTTP).
Docs: https://docs.openclaw.ai/gateway/remote
If you want to access it directly via bridged IP (less recommended)
On the VM, check what itβs actually bound to:
openclaw config get gateway.bind
openclaw config get gateway.port
openclaw gateway status
If gateway.bind is loopback, your PC will never reach it directly. Youβd need to switch to lan and ensure you have a token configured (non-loopback binds require auth):
Quick question so I can pinpoint it
When you run this on the VM:
openclaw gateway status
Can you paste the output? (It prints the probe/URL it thinks itβs serving on, which usually makes the problem obvious.)
π¦ OpenClaw 2026.2.17 (4134875) β It's not "failing," it's "discovering new ways to configure the same thing wrong."
β
β
Service: systemd (enabled)
File logs: /tmp/openclaw/openclaw-2026-02-19.log
Command: /usr/bin/node /home/openclaw/.npm-global/lib/node_modules/openclaw/dist/index.js gateway --port 18789
Service file: ~/.config/systemd/user/openclaw-gateway.service
Service env: OPENCLAW_GATEWAY_PORT=18789
Config (cli): ~/.openclaw/openclaw.json
Config (service): ~/.openclaw/openclaw.json
Gateway: bind=lan (0.0.0.0), port=18789 (service args)
Probe target: ws://192.168.112.128:18789
Dashboard: http://192.168.112.128:18789/
Probe note: bind=lan listens on 0.0.0.0 (all interfaces); probing via 192.168.112.128.
Runtime: running (pid 1273, state active, sub running, last exit 0, reason 0)
RPC probe: ok
Listening: *:18789
Troubles: run openclaw status
Troubleshooting: https://docs.openclaw.ai/troubleshooting
openclaw@openclaw01:~$
Your openclaw gateway status looks perfect: the Gateway is running, listening on *:18789, and it thinks the dashboard is at:
http://192.168.112.128:18789/
So the issue isnβt βOpenClaw isnβt upβ β itβs almost certainly how youβre accessing it from another machine.
The big gotcha: remote over plain HTTP is blocked by default
If you open the dashboard from your PC via http://<vm-ip>:18789/, thatβs a non-secure browser context (not HTTPS, not localhost). Modern browsers block WebCrypto there, and OpenClaw blocks Control UI connections by default in that mode (youβll usually see it load but fail to connect/auth).
Docs: https://docs.openclaw.ai/web/control-ui (see βInsecure HTTPβ)
Fix options (pick one)
Option A (recommended): SSH tunnel β open on localhost
From your PC:
ssh -N -L 18789:127.0.0.1:18789 <user>@192.168.112.128
Then open on your PC:
This is βsecure contextβ (localhost) so the UI works normally.
Docs: https://docs.openclaw.ai/gateway/remote
Option B (recommended): HTTPS via Tailscale Serve
This gives you a proper https://... URL (secure context) without exposing the port publicly.
Docs: https://docs.openclaw.ai/gateway/tailscale and https://docs.openclaw.ai/web
Option C (workaround): allow insecure HTTP (downgrades security)
If you really want http://<vm-ip>:18789/ from your PC, set:
{
gateway: {
controlUi: { allowInsecureAuth: true }
}
}
(Keep token auth enabled.) Then restart the gateway.
Docs snippet is in the same βInsecure HTTPβ section: https://docs.openclaw.ai/web/control-ui
Quick check
When you hit http://192.168.112.128:18789/ from your PC, does the page load but then show a βcanβt connect/unauthorizedβ style error β or does it not load at all (timeout)? That tells us instantly whether itβs the secure-context block vs networking/firewall.
says this:
disconnected (1008): control ui requires HTTPS or localhost (secure context)
Main Session
|
Disconnected from gateway.
disconnected (1008): control ui requires HTTPS or localhost (secure context)
That error is exactly the βinsecure HTTPβ guardrail.
You opened it as http://192.168.112.128:18789/ from your PC, which is not a secure context, so the Control UI intentionally drops the WS connection with code 1008.
Fix 1 (best / fastest): SSH tunnel, then use localhost
On your PC:
ssh -N -L 18789:127.0.0.1:18789 <user>@192.168.112.128
Then open:
(If it asks for auth, grab token on the VM: openclaw config get gateway.auth.token.)
Fix 2 (nice UX): Tailscale Serve (HTTPS)
This gives you https://<magicdns>/ which satisfies the secure-context requirement.
Docs: https://docs.openclaw.ai/gateway/tailscale
Fix 3 (not recommended, but works): allow insecure auth over HTTP
Add this to ~/.openclaw/openclaw.json on the VM:
{
gateway: {
controlUi: { allowInsecureAuth: true }
}
}
Then restart:
openclaw gateway restart
This disables device identity + pairing protections for the Control UI, so only do it if you trust your LAN.
Docs: https://docs.openclaw.ai/web/control-ui (section βInsecure HTTPβ)
If you tell me what you prefer (SSH tunnel vs Tailscale), Iβll give you the exact minimal steps for that path.
if it is on an internal VM how much of a risk is option 3
Option 3 is basically: βlet me use the admin UI over plain HTTP anyway.β
Thatβs fine for quick testing, but it does remove an important safety layer. The practical risk depends on what βinternal VMβ means in your setup:
What risk it adds
With gateway.controlUi.allowInsecureAuth: true:
- The Control UI will accept token-only auth over HTTP.
- That means the token travels over the network in plaintext (WebSocket handshake), and the UI itself is also served over HTTP (so itβs susceptible to MITM / traffic tampering on that network).
- Anyone who can sniff or intercept traffic on that network could potentially steal the token and get full admin access (chat + config + approvals, etc).
Without that setting, OpenClaw blocks you specifically to avoid this (βHTTPS or localhostβ).
When itβs low-ish risk
- The VM is only reachable from your host machine (host-only / isolated virtual network), and
- You trust everything on that host, and
- Youβre not on shared WiβFi / untrusted LAN segments.
When itβs a bad idea
- Your VM is bridged onto your home/office LAN (which yours is), because now any device on that LAN can at least reach the port.
- Any shared network (roommates, office, coffee shop WiβFi, corp LAN) where sniffing/mitm is a realistic threat.
My recommendation
Use SSH tunneling (option 1) for LAN/VM setups. Itβs almost zero config, and you keep the βlocalhost secure contextβ behavior.
If you tell me what OS your PC is on (Windows/macOS/Linux), Iβll paste the exact tunnel command in the right format (PowerShell vs Terminal).
k - i did fix 1
PS C:\Users\Bobe> ssh -N -L 18789:127.0.0.1:18789 openclaw@192.168.112.128
The authenticity of host '192.168.112.128 (192.168.112.128)' can't be established.
ED25519 key fingerprint is SHA256:MDLJv4d1FXAF1Lblxo7+iOGSmTr4vCfryk5MrrLw0jk.
This host key is known by the following other names/addresses:
C:\Users\Bobe/.ssh/known_hosts:1: 192.168.121.130
C:\Users\Bobe/.ssh/known_hosts:4: 192.168.1.84
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.112.128' (ED25519) to the list of known hosts.
openclaw@192.168.112.128's password:
from the browser: interventions.
disconnected (1008): unauthorized: device token mismatch (rotate/reissue device token)
Main Session
|
Disconnected from gateway.
disconnected (1008): unauthorized: device token mismatch (rotate/reissue device token)
That one means your browser is presenting a stale/incorrect device identity token for a device the Gateway already knows about (so it rejects with 1008).
Easiest fix (usually): reset the browserβs saved device identity
On your PC, for the dashboard origin youβre using (e.g. http://192.168.112.128:18789):
- Open DevTools β Application β Storage
- Clear site data (localStorage / indexedDB for that site)
- Reload the dashboard
Or just try an Incognito/Private window (fresh storage).
After that youβll either:
- connect cleanly, or
- get βpairing requiredβ (also normal for remote access)
If you see βpairing requiredβ: approve the new device on the VM
Run on the VM:
openclaw devices list
openclaw devices approve <requestId>
Docs: https://docs.openclaw.ai/web/control-ui and https://docs.openclaw.ai/cli/devices
Alternative (also good): use an SSH tunnel so it counts as βlocalhostβ
If you access via an SSH tunnel and open http://127.0.0.1:18789/ on your PC, the Gateway sees it as a local connection and itβs typically auto-approved, which avoids most device-pairing weirdness.
If you paste the output of openclaw devices list (redact tokens if any show), I can tell you exactly which device entry to revoke/rotate.
Paired (1)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββ¬ββββββββββββββββββ
β Device β Roles β Scopes β Tokens β IP β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββΌββββββββββββββββββ€
β 717b3a3d3382517d7b374c52da8744647d21a4c84dd5771ad07739cf9c9de13d β operator β operator.admin, operator.approvals, operator.pairing β operator β 192.168.112.128 β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄βββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄ββββββββββββββ΄ββββββββββββββββββ
-bash: syntax error near unexpected token `newline'
openclaw@openclaw01:~$
^
That device token mismatch error is the Control UIβs device identity getting out of sync (usually because the browser has an old stored device token, or you changed auth/bind settings and the server-side device record no longer matches).
Do this in order:
1) Clear the browserβs stored device token (fastest)
On your PC, for http://192.168.112.128:18789:
- DevTools β Application β Storage β Clear site data
(or just try an Incognito/Private window)
Reload the page.
2) If it then says βpairing requiredβ, approve it on the VM
On the VM:
openclaw devices list
openclaw devices approve <requestId>
Docs: https://docs.openclaw.ai/web/control-ui
3) If it still says βdevice token mismatchβ, revoke the old device entry
On the VM:
openclaw devices list
Find the device that corresponds to that browser, then:
openclaw devices revoke --device <deviceId> --role operator
Reload the browser; it should generate a fresh pairing request you can approve.
Docs: https://docs.openclaw.ai/cli/devices
If you paste the output of openclaw devices list (no tokens should appear, but redact anything secret if it does), Iβll tell you exactly which one to revoke/approve.
how do i get to dev tools - my machine is a pc
On a PC youβll use your browserβs built-in Developer Tools. Here are the quick ways:
Chrome / Edge (Windows)
- Press F12, or
- Press Ctrl + Shift + I, or
- Rightβclick the page β Inspect
Firefox (Windows)
- Press F12, or
- Press Ctrl + Shift + I, or
- Rightβclick β Inspect
Then clear the site data (to fix the device token mismatch)
- Open DevTools
- Go to the Application tab (Chrome/Edge)
- If you donβt see it: click the Β» overflow menu to find Application
- Left sidebar: Storage
- Click Clear site data (or clear Local Storage for
http://192.168.112.128:18789)
Reload the dashboard page after clearing.
If you tell me which browser youβre using (Chrome, Edge, Firefox), I can give the exact clicks for that one.
im using brave
Brave is Chromium-based, so itβs the same as Chrome.
Open DevTools in Brave (Windows)
- Press F12, or
- Press Ctrl + Shift + I, or
- Rightβclick the page β Inspect
Clear the saved device token / site data (fixes the mismatch)
- Open DevTools
- Click the Β» (double-arrow) at the top if needed β choose Application
- In the left sidebar, open Storage
- Click Clear site data
- Reload the page (
Ctrl+R)
If you canβt find βApplicationβ
Use Braveβs menu instead:
- Menu (β‘) β More tools β Developer tools
After you clear site data and reload, youβll typically either connect or get βpairing requiredβ β if you see pairing required, run on the VM:
openclaw devices list
openclaw devices approve <requestId>
β 717b3a3d3382517d7b374c52da8744647d21a4c84dd5771ad07739cf9c9de13d β operator β operator.admin, operator.approvals, operator.pairing β operator β 192.168.112.128 β
That line looks like a paired operator device entry (device id starts with 717b3a...). If your browser is now saying:
unauthorized: device token mismatch (rotate/reissue device token)
β¦then the quickest way to fix it is to revoke that device, clear the browser storage, and let it re-pair.
On the VM, run:
openclaw devices revoke --device 717b3a3d3382517d7b374c52da8744647d21a4c84dd5771ad07739cf9c9de13d --role operator
Then on your PC (Brave) for the dashboard site:
- clear site data again (DevTools β Application β Storage β Clear site data)
- reload the dashboard page
If after reload you get βpairing requiredβ, do:
openclaw devices list
openclaw devices approve <requestId>
One note: if youβre accessing via http://192.168.112.128:18789/ (LAN HTTP), youβll still hit the βHTTPS or localhost (secure context)β rule unless youβre using SSH tunnel / HTTPS / or you enabled gateway.controlUi.allowInsecureAuth. The βcleanβ path is still SSH tunnel β open http://127.0.0.1:18789/ on your PC.
βStill not workingβ can mean a couple different things here β the next step depends on the exact message you see in the browser now.
1) First: what URL are you opening?
- If you are opening
http://192.168.112.128:18789/from your PC β you will keep getting secure-context / device-auth weirdness unless you explicitly allow insecure auth. - If you use an SSH tunnel, you must open
http://127.0.0.1:18789/on your PC (thatβs the whole point: it becomes βlocalhostβ on your PC).
2) If youβre trying the SSH tunnel, use this exact flow
On your PC (PowerShell is fine), run and leave it running:
ssh -N -L 18789:127.0.0.1:18789 openclaw@192.168.112.128
Then in Brave on your PC, open:
http://127.0.0.1:18789/
If that page doesnβt load at all, the tunnel isnβt up (usually SSH canβt connect).
3) If the page loads but disconnects: paste the new disconnect reason
Common ones:
- βpairing requiredβ β on the VM run:
openclaw devices list openclaw devices approve <requestId> - βdevice token mismatchβ β you need to clear the site data for the exact origin youβre using (so if you switched from
192.168β¦to127.0.0.1, clear both), then reload. If it still persists, revoke the device and re-pair.
4) Quick question so I can land this:
When you open the dashboard right now, are you opening http://127.0.0.1:18789/ or http://192.168.112.128:18789/ β and what is the full disconnect (1008) message you see?
βnotβ as in youβre not opening http://127.0.0.1:18789/ on your PC (through an SSH tunnel)?
Because if youβre still opening http://192.168.112.128:18789/, youβll keep hitting the secure-context/device-auth issues.
If you want the SSH-tunnel path (recommended)
On your PC, run this and leave it running (it wonβt print anything when itβs working):
ssh -N -L 18789:127.0.0.1:18789 openclaw@192.168.112.128
Then on your PC open (this part matters):
If that still fails, paste the exact error from the PC terminal (e.g. βconnection refusedβ, βpermission deniedβ, etc.). Also confirm you can run:
ssh openclaw@192.168.112.128
If you donβt want SSH tunnels
Then you must do either:
- HTTPS (Tailscale Serve), or
- set
gateway.controlUi.allowInsecureAuth: trueand restart (works overhttp://192.168β¦, but is a security downgrade).
Quick thing to paste so I can pinpoint it
- Which URL are you opening in Brave right now? (
127.0.0.1vs192.168.112.128) - What is the full
disconnected (1008): ...message you see now?
disconnected (1008): unauthorized: device token mismatch (rotate/reissue device token)
disconnected (1008): unauthorized: device token mismatch (rotate/reissue device token)
That message means: the Gateway recognizes your browserβs device ID, but the browser is sending a different (old) device token than what the Gateway has on record for that device.
In practice, it almost always means you need to re-pair the browser (server-side revoke + client-side clear).
Step A (on the VM): revoke the paired operator device(s)
Run:
openclaw devices list
For every row with role operator, revoke it (you can start with the one you pasted earlier):
openclaw devices revoke --device 717b3a3d3382517d7b374c52da8744647d21a4c84dd5771ad07739cf9c9de13d --role operator
Then run openclaw devices list again to confirm itβs gone.
Step B (on your PC / Brave): actually clear the site data for the right origin
Make sure you clear data for the exact URL youβre using:
- if you browse
http://192.168.112.128:18789β clear data for that - if you browse
http://127.0.0.1:18789(SSH tunnel) β clear data for that too
Fastest way (avoids missing some storage): open a new Brave profile:
- Brave menu β Create new profile
- Open the dashboard in that fresh profile
Step C: reconnect β you should get βpairing requiredβ
If you now see pairing required, approve it on the VM:
openclaw devices list
openclaw devices approve <requestId>
If it still says βdevice token mismatchβ after Step A, paste the full output of openclaw devices list (all lines). That will show whether thereβs another operator device entry still present that needs revoking.
it is not revoking the device - it is still there
it is not revoking the device - it is still there
not gone
openclaw@openclaw01:~$ openclaw devices revoke --device 717b3a3d3382517d7b374c52da8744647d21a4c84dd5771ad07739cf9c9de13d --role operator
π¦ OpenClaw 2026.2.17 (4134875) β curl for conversations.
β
β
{
"deviceId": "717b3a3d3382517d7b374c52da8744647d21a4c84dd5771ad07739cf9c9de13d",
"role": "operator",
"revokedAtMs": 1771466866511
}
openclaw@openclaw01:~$ openclaw devices list
π¦ OpenClaw 2026.2.17 (4134875) β IPC, but it's your phone.
β
β
Paired (1)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββ¬ββββββββββββββββββ
β Device β Roles β Scopes β Tokens β IP β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββΌββββββββββββββββββ€
β 717b3a3d3382517d7b374c52da8744647d21a4c84dd5771ad07739cf9c9de13d β operator β operator.admin, operator.approvals, operator.pairing β operator β 192.168.112.128 β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄βββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄ββββββββββββββ΄ββββββββββββββββββ
openclaw@openclaw01:~$
If the device row is still showing Tokens: operator (not operator (revoked)), then either:
- the revoke command didnβt actually succeed, or
- you revoked a different device/role than the one youβre looking at.
The good news: openclaw devices revoke always prints a JSON result. Can you run this on the VM and paste the exact output?
openclaw devices revoke --device 717b3a3d3382517d7b374c52da8744647d21a4c84dd5771ad07739cf9c9de13d --role operator
openclaw devices list
What we should see:
- The revoke command should print something like:
{ "ok": true, "result": { "deviceId": "...", "role": "operator", "revokedAtMs": 123 } }
- And then
openclaw devices listshould show Tokens as:operator (revoked)(thatβs the βit workedβ indicator)
If you get { "ok": false, "error": ... } from revoke, paste that too β itβll tell us exactly why it isnβt changing.
Also double-check: are you running these commands as the same Linux user that runs the gateway service? (From your prompt it looks like openclaw@..., which is correct β just confirming.)
openclaw@openclaw01:~$ openclaw devices revoke --device 717b3a3d3382517d7b374c52da8744647d21a4c84dd5771ad07739cf9c9de13d --role operator
π¦ OpenClaw 2026.2.17 (4134875) β curl for conversations.
β
β
{
"deviceId": "717b3a3d3382517d7b374c52da8744647d21a4c84dd5771ad07739cf9c9de13d",
"role": "operator",
"revokedAtMs": 1771466866511
}
openclaw@openclaw01:~$ openclaw devices list
π¦ OpenClaw 2026.2.17 (4134875) β IPC, but it's your phone.
β
β
Paired (1)
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬βββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββ¬ββββββββββββββββββ
β Device β Roles β Scopes β Tokens β IP β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌβββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββΌββββββββββββββββββ€
β 717b3a3d3382517d7b374c52da8744647d21a4c84dd5771ad07739cf9c9de13d β operator β operator.admin, operator.approvals, operator.pairing β operator β 192.168.112.128 β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄βββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄ββββββββββββββ΄ββββββββββββββββββ
openclaw@openclaw01:~$
Yep β that device will still show up in openclaw devices list even after revoking. Revoke doesnβt delete the device entry, it only revokes the token for that role.
What you should see change is the Tokens column:
- before:
operator - after revoke:
operator (revoked)
1) Run revoke and paste the command output
On the VM, run:
openclaw devices revoke --device 717b3a3d3382517d7b374c52da8744647d21a4c84dd5771ad07739cf9c9de13d --role operator
That command prints JSON. Paste what it prints (this will tell us if it actually succeeded or if itβs failing with unknown deviceId/role / unauthorized / etc).
2) Re-list to confirm itβs revoked
openclaw devices list
If it still shows operator (not operator (revoked)), then revoke didnβt take.
3) After itβs revoked: fix the browser side
In Brave, use a fresh Brave profile (best) or clear site data, then reload. You should then get either βpairing requiredβ (approve it) or it should connect.
If you paste the revoke JSON output, I can tell you exactly whatβs blocking it.
βNot goneβ is expected β revoke does not remove the device row. It only marks the operator token as revoked.
What should change is the Tokens column:
- before:
operator - after revoke:
operator (revoked)
1) Letβs verify whether the revoke command is actually succeeding
On the VM, run this exact command and paste what it prints:
openclaw devices revoke --device 717b3a3d3382517d7b374c52da8744647d21a4c84dd5771ad07739cf9c9de13d --role operator
It will print JSON with either ok: true or an error (that error is what we need).
Then run:
openclaw devices list
β¦and check whether it now says operator (revoked).
2) Easiest way to stop fighting device tokens: use an SSH tunnel
This avoids the whole remote device-token pairing path.
On your PC:
ssh -N -L 18789:127.0.0.1:18789 openclaw@192.168.112.128
Then open in Brave on your PC:
This should not hit βdevice token mismatchβ.
Paste the JSON output from the revoke command and weβll know immediately why itβs not flipping to β(revoked)β.
it is not revoking - that is where we are stuck.
Your revoke did work β the JSON confirms it:
{ "deviceId": "...", "role": "operator", "revokedAtMs": ... }
Two important gotchas:
1) The device entry will NOT disappear
openclaw devices revoke doesnβt remove the device from the list. It only revokes the token for that role. So seeing the device still listed is normal.
To see the real state, run this (on the VM):
openclaw devices list --json
and look for the paired[].tokens[] entry β it should include revokedAtMs for the operator token.
2) The browser still has an old token cached β thatβs why you keep getting βdevice token mismatchβ
Even after revoking on the server, Brave will keep trying with whatever it has saved for that site.
The clean fix (recommended): use an SSH tunnel so the UI is βlocalhostβ
On your PC:
ssh -N -L 18789:127.0.0.1:18789 openclaw@192.168.112.128
Then open in Brave:
- http://127.0.0.1:18789/ (not the 192.168β¦ URL)
This uses a different origin, so Brave wonβt reuse the old device token, and it avoids the whole βsecure contextβ pain.
If you insist on opening http://192.168.112.128:18789/
Then you must clear site data for that exact origin (or use a brand new Brave profile) after you revoke/rotate β otherwise youβll keep sending the stale token.
If you paste the output of:
openclaw devices list --json
I can point to the exact revokedAtMs field so we know whether the gateway side is clean, and then weβll focus purely on the browser side.
openclaw@openclaw01:~$ openclaw devices list --json
{
"pending": [],
"paired": [
{
"deviceId": "717b3a3d3382517d7b374c52da8744647d21a4c84dd5771ad07739cf9c9de13d",
"publicKey": "wGCbGaG9oOLvqAGcLd5wRqhJNfwroF_-uG6D1cx-y50",
"platform": "linux",
"clientId": "cli",
"clientMode": "cli",
"role": "operator",
"roles": [
"operator"
],
"scopes": [
"operator.admin",
"operator.approvals",
"operator.pairing"
],
"createdAtMs": 1771366414793,
"approvedAtMs": 1771366414793,
"remoteIp": "192.168.112.128",
"tokens": [
{
"role": "operator",
"scopes": [
"operator.admin",
"operator.approvals",
"operator.pairing"
],
"createdAtMs": 1771366414793,
"rotatedAtMs": 1771467195355
}
]
}
]
}
get to look at this output?
It is revoking β the JSON you pasted proves it.
Whatβs confusing you is this:
devices revokedoes not delete the device row. It only revokes/rotates the token for that device+role.- And as soon as the browser tries to connect again, the Gateway can auto re-issue a fresh token for that same device entry (so the list goes back to showing just
operator). So it can look like βrevoke didnβt stickβ, even though it did.
What youβre actually stuck on
Brave still has a stale saved token for that device β the Gateway has already moved on to a new one β you get:
device token mismatch
Fix (do this exact sequence)
- In Brave, create a new profile (best)
Brave menu β Create new profile
(or clear site data for the dashboard origin)
- On the VM, get your Gateway token (donβt paste it into Discord):
openclaw config get gateway.auth.token
-
Open the dashboard in the fresh Brave profile and paste that token into the Control UI Settings auth field, then connect.
-
If it then says pairing required, approve it on the VM:
openclaw devices list
openclaw devices approve <requestId>
Even simpler (recommended): SSH tunnel
This avoids most of the device-auth pain:
ssh -N -L 18789:127.0.0.1:18789 openclaw@192.168.112.128
Then open on your PC:
If you tell me which URL youβre opening right now (192.168... vs 127.0.0.1), Iβll point you to the exact βclear site dataβ entry to wipe.
It is revoking β but youβre revoking the CLI device, not the browser, and the device row is not supposed to disappear.
What your devices list --json is telling us
This entry:
clientId: "cli"platform: "linux"clientMode: "cli"
β¦is the OpenClaw CLI itself (created when you run openclaw devices β¦ commands). Itβs not Brave.
Also, notice:
- Your
revokeprintedrevokedAtMs: β¦(so revoke succeeded) - but your later
devices list --jsonshows onlyrotatedAtMsand norevokedAtMs
That means a new token got re-issued/rotated after you revoked (so the list no longer shows βrevokedβ). That can happen just by making another authorized connection.
The βdevice token mismatchβ you see in Brave is a browser-side cache problem
Brave is still sending an old stored device token for the dashboard origin youβre visiting.
The fix is not βkeep revokingβ, itβs:
Option A (recommended): SSH tunnel so the UI is localhost
On your PC:
ssh -N -L 18789:127.0.0.1:18789 openclaw@192.168.112.128
Then in Brave open:
http://127.0.0.1:18789/
This uses a different origin (localhost), so the stale device token problem goes away.
Option B: wipe Braveβs storage for the exact URL youβre using
If youβre opening http://192.168.112.128:18789/, you must clear site data for that exact origin (not for 127.0.0.1), or use a brand new Brave profile.
One question to unblock this fast
Which URL are you opening in Brave right now?
http://192.168.112.128:18789/
orhttp://127.0.0.1:18789/(through an SSH tunnel)
If you answer that, I can give the exact next click/command with no guessing.
i tried accessing this on edge: http://127.0.0.1:18789/
and it fails
http://127.0.0.1:18789/ only works if the Gateway is running on your PC.
Right now your Gateway is running on the Ubuntu VM, so 127.0.0.1 on the PC points to the PC itself β it will fail unless you create a tunnel.
Fix: make 127.0.0.1 on your PC forward to the VM (SSH tunnel)
On your PC, open PowerShell and run (leave this window open):
ssh -N -L 18789:127.0.0.1:18789 openclaw@192.168.112.128
Then open in Edge:
If that still fails, the usual cause is: local port already in use
Try a different local port:
ssh -N -L 18790:127.0.0.1:18789 openclaw@192.168.112.128
Then open:
Quick check
When you open http://127.0.0.1:18789/ in Edge, what exact error do you get? (e.g. ERR_CONNECTION_REFUSED vs a page that loads and then shows a disconnect message)
back to disconnected (1008): unauthorized: gateway token missing (open the dashboard URL and paste the token in Control UI settings)
Good β that means the tunnel/network part is now fine. Youβre just missing the Gateway token in the Control UI.
1) Get the token on the VM
Run this on the Ubuntu VM:
openclaw config get gateway.auth.token
(Do not paste the token into Discord.)
2) Paste it into the Control UI on your PC
In Edge/Brave Control UI:
- Click Settings (gear icon) in the Control UI
- Find the Gateway Token field
- Paste the token
- Click Connect / Save (wording varies a bit)
After that, the disconnect should go away.
If you donβt see the token field: itβs in the Control UI under something like Control β Overview β Gateway Access (there are usually two auth inputs side-by-side: Token and Password).
i cant find the control ui - where is that?
The page youβre looking at is the Control UI β itβs the βdashboardβ.
You just need to open the Settings panel inside it to paste the token.
In the dashboard page (http://127.0.0.1:18789/)
Look for:
- a gear icon (Settings), usually in the top bar, or
- a left sidebar item called Settings
In there youβll see auth inputs, typically:
- Gateway Token
- (sometimes also) Password
Paste the token from:
openclaw config get gateway.auth.token
If you still canβt find it
Do this on the VM (it prints the correct dashboard URL and helps you find auth):
openclaw dashboard --no-open
Also: what do you see on the page exactly β is it a blank page, a simple βDisconnected from gatewayβ screen, or a full UI with tabs? If you can screenshot it, I can point to the exact button.
i cant get to the dashboard - how can i do that?
To get to the dashboard from your PC you need two things:
- a way for your PC to reach the VMβs Gateway port
- the gateway token entered in the Control UI
Step 1: open the dashboard via an SSH tunnel (recommended)
On your PC (PowerShell), run and keep it running:
ssh -N -L 18789:127.0.0.1:18789 openclaw@192.168.112.128
Then open in your PC browser:
Step 2: easiest way to avoid hunting for the token field
On the VM, run:
openclaw dashboard --no-open
It will print a dashboard URL that includes the auth (usually as a #token=... fragment). Copy that printed URL and open it on your PC through the tunnel (so it starts with http://127.0.0.1:18789/...).
If you still see gateway token missing
Then you need to paste the token into the UI:
On the VM:
openclaw config get gateway.auth.token
Then in the dashboard UI, open Settings (gear icon) and paste it into Gateway Token.
When you say βI canβt get to the dashboardβ, which one is happening on your PC?
- Page wonβt load at all (
ERR_CONNECTION_REFUSED/ timeout)
or - Page loads but says βDisconnected (1008) β¦β
the tunnel does not work
The tunnel failing usually means SSH to the VM isnβt working (or youβre not actually keeping the tunnel running).
1) First check: can you SSH into the VM at all?
On your PC, run:
ssh openclaw@192.168.112.128
- If that fails (timeout / connection refused), the tunnel canβt work yet.
- Paste the exact error text you get.
Quick port test (Windows):
Test-NetConnection 192.168.112.128 -Port 22
If port 22 is closed, on the VM you likely need to install/start SSH:
sudo apt update
sudo apt install openssh-server
sudo systemctl enable --now ssh
2) If SSH works, start the tunnel (and keep the window open)
Run this in PowerShell and leave it running (it should look like it βhangsβ with no output β thatβs normal):
ssh -N -L 18789:127.0.0.1:18789 openclaw@192.168.112.128
Then open in the browser:
If it immediately exits back to the prompt, paste whatever it printed.
3) Common Windows gotcha: local port already in use
Try a different local port:
ssh -N -L 18790:127.0.0.1:18789 openclaw@192.168.112.128
Open:
Tell me this (so I can pinpoint it)
When you run the SSH tunnel command, what exact error do you see in PowerShell? (Copy/paste the line.)
Last login: Thu Feb 19 01:24:37 2026 from 192.168.1.31
openclaw@openclaw01:~$ ssh -N -L 18789:127.0.0.1:18789 openclaw@192.168.112.128
openclaw@192.168.112.128's password:
bind [127.0.0.1]:18789: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 18789
Could not request local forwarding.
Perfect β SSH works. The tunnel failed because port 18789 is already in use on the machine where you ran the tunnel command.
And from your output, you ran the tunnel on the VM itself (openclaw@openclaw01:~$), not on your PC. Thatβs why itβs colliding: the gateway is already listening on 18789 on the VM.
Do this instead
Option A (recommended): run the tunnel on your PC
On your PC (PowerShell):
ssh -N -L 18789:127.0.0.1:18789 openclaw@192.168.112.128
Then open on your PC:
Option B: if you want to test the tunnel from the VM anyway, use a different local port
On the VM:
ssh -N -L 18790:127.0.0.1:18789 openclaw@192.168.112.128
Then youβd open (on that same machine):
β¦but this doesnβt help your PC unless you do the tunnel on the PC.
Quick check
Can you run SSH from your PC? (Windows has it built in now.) If not, tell me your PC OS/version and weβll pick the easiest way (PowerShell SSH vs PuTTY).
fails
βFailsβ can mean a few different things here β but your last log proves the idea is right; we just need the tunnel to run on the PC, and we need the exact error text from the PC.
1) Make sure youβre running the tunnel on your PC (Windows), not inside the VM
If your prompt looks like this:
openclaw@openclaw01:~$
β¦you are on the VM, not on the PC.
On the PC, open PowerShell (or Windows Terminal) and run:
ssh -N -L 18790:127.0.0.1:18789 openclaw@192.168.112.128
(Using 18790 avoids βport already in useβ on the PC.)
Then open in your PC browser:
2) If it still fails: paste the exact PowerShell error
Copy/paste exactly what PowerShell prints after you run the command above.
Common ones and what they mean:
bind ... Address already in useβ that port is taken on your PC (try another like 18791)Connection timed out/Could not resolve hostnameβ PC canβt reach the VM at that IP, or wrong IPssh : The term 'ssh' is not recognizedβ SSH client missing (rare on modern Windows)
3) Quick port-use check (on the PC)
If you get βAddress already in useβ, run:
netstat -ano | findstr :18790
and weβll pick a free local port.
Send the PowerShell output and Iβll tell you the exact next step.
This site canβt be reached
127.0.0.1 refused to connect.
This site canβt be reached
127.0.0.1 refused to connect.
hello?
Iβm here β weβre just missing one concrete detail from the PC side.
Right now we know:
- SSH works (you can log into the VM)
- The tunnel command you ran was inside the VM, where port 18789 is already taken (so it failed with βAddress already in useβ)
Do this exact thing on your PC (Windows)
- Open PowerShell on your PC (not the VM)
- Run:
ssh -N -L 18790:127.0.0.1:18789 openclaw@192.168.112.128
Leave that window open (it should βhangβ with no output).
- In your PC browser open:
Then tell me which of these happens
A) PowerShell prints an error immediately (copy/paste it), or
B) The command stays running, but the browser still canβt load (tell me the browser error).
If youβre unsure whether youβre on the PC vs VM: on the PC youβll see a PS C:\...> prompt; on the VM youβll see openclaw@openclaw01:~$.
bind [127.0.0.1]:18790: Address already in use
channel_setup_fwd_listener_tcpip: cannot listen to port: 18790
Could not request local forwarding.
Great, thatβs a clear one: port 18790 is already taken on your PC.
Just pick another local port for the tunnel.
1) Find whatβs using 18790 (optional, but helpful)
On your PC PowerShell:
netstat -ano | findstr :18790
That will show the PID thatβs holding it.
2) Use a different local port (quick fix)
Try 18791:
ssh -N -L 18791:127.0.0.1:18789 openclaw@192.168.112.128
Then open:
If 18791 is also taken, just keep incrementing (18792, 18793, β¦) until it stays running.
3) Once the page loads, youβll likely need the gateway token
If you get 1008: gateway token missing, grab it on the VM:
openclaw config get gateway.auth.token
β¦and paste it into the dashboard Settings.
Tell me which local port finally works (or paste the netstat line if you want to free the port instead).
connection refused
βConnection refusedβ (in the browser) means nothing is listening on that local port on your PC β i.e. the SSH tunnel is not actually up (or you opened the wrong port).
Letβs make it unambiguous:
1) Pick a βweirdβ local port to avoid conflicts
On your PC PowerShell, run (and leave it running):
ssh -N -L 18889:127.0.0.1:18789 openclaw@192.168.112.128
This command should appear to βhangβ with no output. Thatβs good.
2) While thatβs running, test the local port (PC, new PowerShell window)
Test-NetConnection 127.0.0.1 -Port 18889
- If it says
TcpTestSucceeded : Trueβ tunnel is up β open: - If it says
Falseβ tunnel isnβt up. Then the SSH window must have printed an error or exited. Paste that error.
3) Tell me which βconnection refusedβ you mean
When you say βconnection refusedβ, is it:
- the browser error (
ERR_CONNECTION_REFUSED) to127.0.0.1:xxxxx, or - the ssh command error like
connect to host ... port 22: Connection refused?
Reply with:
- the exact URL you opened, and
- whether
Test-NetConnection β¦18889is True/False, and - anything printed in the SSH window.
This is the result:
Last login: Thu Feb 19 02:40:03 2026 from 192.168.112.1
openclaw@openclaw01:~$ ssh -N -L 18777:127.0.0.1:18789 openclaw@192.168.112.128
openclaw@192.168.112.128's password:
When I try http://127.0.0.1:18777/ it times out. refused to connect
I cannot be the only one trying to do this
Youβre not β this is a super common βremote localhostβ + βport already usedβ tunnel dance. The good news is: the errors youβre seeing are normal and very specific.
Right now youβve hit two different issues:
- βAddress already in useβ β you picked a local port on your PC that some other program is already using.
- βConnection refusedβ in the browser β the tunnel wasnβt actually running on the port you opened.
Letβs do a clean, almost-guaranteed-to-work run:
Clean recipe (Windows PC β Ubuntu VM dashboard)
Step A β Start tunnel on a fresh port (18889)
On your PC PowerShell:
ssh -N -L 18889:127.0.0.1:18789 openclaw@192.168.112.128
Important: leave that PowerShell window open. If it closes or prints an error, the tunnel is not running.
Step B β Verify the tunnel is up (no guessing)
Open a second PowerShell window on your PC:
Test-NetConnection 127.0.0.1 -Port 18889
- If it says
TcpTestSucceeded : Trueβ tunnel is up. - If
Falseβ the tunnel is not up (we need the exact SSH error).
Step C β Open dashboard through the tunnel
In your PC browser, open:
Step D β If it says βgateway token missingβ
On the VM:
openclaw config get gateway.auth.token
Paste that into the dashboard settings βGateway Tokenβ field.
Tell me just one thing and Iβll pinpoint it
What does this show on your PC?
Test-NetConnection 127.0.0.1 -Port 18889
(Just paste the output.)
no tunnel is working - i have tried like 5 of them
Youβre not the only one β but the tunnel part is very binary: either the SSH command is still running (then it works), or it exited (then the browser gets βconnection refusedβ).
Also: earlier you got 1008 β¦ gateway token missing β that actually means the tunnel was working at that moment. So weβre close.
Make the tunnel succeed 100% (Windows PC β Ubuntu VM)
On your PC (PowerShell prompt should look like PS C:\...>, not openclaw@...$), run:
ssh -v -o ExitOnForwardFailure=yes -N -L 18889:127.0.0.1:18789 openclaw@192.168.112.128
Leave that window open. If it exits, paste what it printed.
In a second PowerShell window, verify the port is actually listening:
Test-NetConnection 127.0.0.1 -Port 18889
- If
TcpTestSucceeded : Trueβ openhttp://127.0.0.1:18889/ - If
Falseβ the tunnel is not up (we need the SSH output from the first window)
If the page loads but says βgateway token missingβ
Thatβs expected with a remote setup. On the VM, run:
openclaw config get gateway.auth.token
Then paste it into the dashboard Settings (gear icon) β Gateway Token.
One key question
When you run the tunnel command on the PC, does it stay open (no prompt), or does it return to the prompt with an error? If it errors, paste the error line(s).
ComputerName : 127.0.0.1
RemoteAddress : 127.0.0.1
RemotePort : 18889
InterfaceAlias : Loopback Pseudo-Interface 1
SourceAddress : 127.0.0.1
TcpTestSucceeded : True
Nice β that means the tunnel is working right now. So youβre past the hard part.
Now do this:
1) Open the dashboard through the tunnel
On your PC browser, go to:
2) If you see 1008: gateway token missing
Thatβs normal. Grab the token on the VM:
openclaw config get gateway.auth.token
Then on the dashboard page (the Control UI):
- open Settings (gear icon)
- paste into Gateway Token
- connect/reload
3) If you instead see pairing required
Approve it on the VM:
openclaw devices list
openclaw devices approve <requestId>
Tell me what exact disconnect/error message you see now when you open http://127.0.0.1:18889/ (token missing vs pairing required vs something else).
omg we did it!
Hell yeah. The key pieces were:
- run the SSH tunnel on the PC (not inside the VM)
- use a free local port (
18889) - then paste the gateway token when the UI complained
If you want to help the next person: the βtunnel is actually upβ check is:
Test-NetConnection 127.0.0.1 -Port 18889
If this solved it, please mark the solution message (rightβclick β Apps β β Mark Solution) so Answer Overflow indexes it.