OC
OpenClaw
Dashboard

2026-04-12-1400.md

/home/ubuntu/.openclaw/workspace/memory/2026-04-12-1400.md

Session: 2026-04-12 14:00:38 UTC

  • Session Key: agent:main:main
  • Session ID: 886986bf-171f-472e-aa64-ccc6d65ac71b
  • Source: webchat

Conversation Summary

assistant: Both errors are coming from the Gateway websocket handshake, and they have two different root causes:

1) “disconnected (1006): no reason”

On your host, the gateway saw a browser coming through the Tailscale Serve proxy, then the socket died without a close frame (code 1006). The most common cause here is the client trying to connect to the wrong URL shape (redirect / trailing slash) or the proxy closing the upgraded connection.

Make sure you’re using:

  • https://openclaw.tail18850e.ts.net/ for the dashboard UI
  • and for the websocket URL exactly: wss://openclaw.tail18850e.ts.net/gateway (no trailing /)

/gateway/ often triggers a redirect, and redirects break WS upgrades in a way that shows up as 1006.

2) “invalid connect params … /client/id must be equal to constant … anyOf”

This one is definitive: the dashboard chat page was sending:

  • client.id = "openclaw-dashboard"

…but the Gateway only accepts an allowlisted set of client ids (e.g. openclaw-control-ui, webchat, cli, etc.). So it closed the connection with 1008 and that schema error.

Fix applied

I updated openclaw-dashboard to use an allowlisted id (openclaw-control-ui) for the connect handshake, then deployed it:

  • commit: f0b7b55 (“fix: use gateway-allowlisted client id for chat connect”)
  • pushed to main
  • restarted openclaw-dashboard.service (it’s currently active)

What to do now

  1. Reload the dashboard (hard refresh).
  2. In the chat page, use wss://openclaw.tail18850e.ts.net/gateway (no trailing slash).
  3. Paste the gateway token again and connect.

If it still drops, tell me whether it drops immediately (handshake) or after ~N seconds, and I’ll pull the corresponding gateway log lines around the disconnect. user: System: [2026-04-12 13:34:30 UTC] Exec completed (nova-val, code 0) :: 31-21-143 node[3820]: Already on 'main' Apr 12 09:15:05 ip-172-31-21-143 node[3820]: fatal: Cannot fast-forward to multiple branches. Apr 12 09:15:05 ip-172-31-21-143 node[3820]: Command exited with code 128 Apr 12 13:32:37 ip-172-31-21-143 node[3820]: 2026-04-12T13:32:37.418Z [ws] webchat connected conn=2829b51d-9808-4608-aac5-9721e889d863 remote=127.0.0.1 client=openclaw-control-ui webchat vdev System: [2026-04-12 13:36:03 UTC] Exec failed (ember-em, signal SIGKILL) System: [2026-04-12 13:36:44 UTC] Exec failed (swift-at, signal SIGKILL) System: [2026-04-12 13:37:08 UTC] Exec failed (faint-fo, signal 9)

control ui requires HTTPS or localhost (secure context) [message_id: 21ba2ddf-3fc5-4981-9101-c34b436b8650] assistant: That message is coming from the Gateway Control UI code path (it checks window.isSecureContext) and it only runs when the page is not considered a secure context by the browser.

A page is a secure context only if it’s loaded from:

  • https://… with a valid cert, or
  • http://localhost / http://127.0.0.1

So this error almost always means you’re actually loading the Control UI over plain HTTP (or via an origin the browser treats as insecure), even if you think you’re on the Tailnet URL.

Do these checks

  1. Confirm the exact URL in the address bar

    • It must start with: https://openclaw.tail18850e.ts.net/...
    • If it’s http://openclaw.tail18850e.ts.net/... (or an IP like http://100.x.y.z:...), the Control UI will refuse.
  2. Don’t browse directly to /gateway

    • On your machine, Tailscale Serve is configured as:
      • / → dashboard (http://127.0.0.1:3579)
      • /gatewaywebsocket proxy to the gateway (http://127.0.0.1:18789)
    • /gateway is meant to be used as a WS endpoint (wss://…/gateway) by the dashboard chat client, not as a page you navigate to.
  3. If you’re trying to open the Gateway Control UI remotely

    • Right now / is the dashboard, so you don’t have a separate public path for the gateway UI page.
    • If you want, I can add a second Serve path like /controlhttp://127.0.0.1:18789/ (the actual Control UI), so you can visit it at:
      • https://openclaw.tail18850e.ts.net/control

Quick question (so I can tell you exactly which of the above applies)

What’s the full URL you’re visiting when you see “control ui requires HTTPS or localhost”? (Copy/paste the address bar.) user: https://openclaw.tail18850e.ts.net/chat. also yes i'd like 3 [message_id: a9237f73-e03a-4e77-9500-0d5f9531d868] assistant: Done. I added a dedicated Control UI path in Tailscale Serve:

Your Serve map is now:

  • / → dashboard (http://127.0.0.1:3579)
  • /chat (handled by dashboard app)
  • /gateway → gateway WS proxy (http://127.0.0.1:18789)
  • /control → gateway Control UI (http://127.0.0.1:18789)

Try opening /control in the browser. If you still see the “requires HTTPS or localhost” warning on that URL, tell me what browser/OS you’re using and whether any extension is forcing an http downgrade. assistant: Don’t give up — we just hit an annoying but known class of problems: path-prefix proxying an SPA that assumes it lives at /.

What you’re seeing lines up with that:

  • /control blank: the Gateway Control UI HTML loads, but it likely references assets like /_next/... or /assets/... as absolute paths. When you serve it under /control, those asset requests go to the wrong backend (your dashboard at /), so the app never boots → blank page.
  • /control/ 1006: same story, plus websocket/connect attempts can get mangled by redirects/trailing slash.
  • /chat showing “control ui requires HTTPS or localhost”: that string is from the Gateway Control UI bundle, which strongly suggests you’re sometimes getting gateway UI content (18789) where you expected dashboard content (3579), likely due to the asset-path collision above.

The “easy mode” that will work

Use localhost port-forwarding for interactive UI stuff:

  1. From your laptop:
ssh -L 3579:127.0.0.1:3579 -L 18789:127.0.0.1:18789 ubuntu@openclaw.tail18850e.ts.net
  1. Then open:
  • Dashboard chat: http://127.0.0.1:3579/chat
  • Gateway Control UI (if you want it): http://127.0.0.1:18789/

This satisfies the “localhost / secure context” requirement and avoids all the path-prefix proxy weirdness.

Recommendation

Let’s stop trying to expose the Control UI under /control (it’s not worth it), and keep Tailscale Serve for:

  • / → dashboard
  • /gateway → websocket endpoint used by the dashboard

If you want, I can remove the /control mapping right now so it stops interfering. user: System: [2026-04-12 13:45:11 UTC] Cron: Dashboard Activity Sync complete.

  • Ran npm run sync:activity on main (after git pull --ff-only)
  • Detected changes in:
    • data/activity.json
    • data/activity-state.json
  • Committed + pushed to main: chore: sync activity (commit c2bcbea)

i don't want to use local port forwarding. since my own dashboard is working, i'm assuming the gateway dashboard can work too . plus docs says you can access remotely https://docs.openclaw.ai/gateway/remote. also regardless the chat is not working, and chat is on my own dashboard, so i'm assumign it's different issue? [message_id: 773c2bfa-4e48-410e-9983-68618c22c7ff] assistant: No, we shouldn’t give up — this is fixable, and you’re right: your dashboard (/chat) is a different app and should work remotely.

What happened is we introduced a path-prefix hosting problem when we added /control:

  • The Gateway Control UI is built assuming it’s hosted at / (absolute asset paths).
  • Serving it at /control caused asset/path collisions and weird caching effects, which is why you started seeing the Control UI’s “secure context” warning bleed into /chat.

I’ve backed that out and replaced it with the “correct” remote setup

I removed /control entirely and set up the Gateway Control UI on its own HTTPS port, at root, so it behaves exactly as designed:

What I need you to try now

  1. Open https://openclaw.tail18850e.ts.net/chat in an incognito window (or hard refresh + clear site data).
    If you were cached into the broken /control asset state, incognito bypasses it immediately.

  2. In the chat page, make sure the gateway URL is exactly:

    • wss://openclaw.tail18850e.ts.net/gateway (no trailing slash)
  3. Separately, confirm the Gateway Control UI works at:

If /chat still shows “control ui requires HTTPS or localhost”, paste a screenshot of the page + the DevTools Console first 20 lines. At this point that message should not even be present in the dashboard bundle unless the browser is still using a cached/bad asset path. user: https://openclaw.tail18850e.ts.net:444/ - also doens't work, disconnected (1008): unauthorized: gateway token missing (open a tokenized dashboard URL or paste token in Control UI settings) [message_id: 20457c2b-8a35-4593-a914-2a01f4f365c2] assistant: That :444 result is actually progress: the Gateway is reachable and speaking WS, it’s just rejecting the Control UI because it isn’t receiving a token in its own settings yet.

More importantly: your /chat error was not “secure context” in your browser — it was the Gateway closing the connection with reason:

control ui requires HTTPS or localhost (secure context)

…and that happened because we identified your dashboard chat client as openclaw-control-ui, which triggers Control-UI-specific constraints inside the Gateway.

Fix applied (for your dashboard chat)

I changed the dashboard chat handshake to identify as webchat-ui with mode webchat (instead of pretending to be the Control UI). This avoids the Gateway’s Control-UI-only secure-context/device-signing rules.

Deployed:

  • commit: 44ebc61 fix(chat): identify as webchat-ui for gateway connect
  • pushed to main
  • restarted openclaw-dashboard (service is active)

What to do now

  1. Open /chat in an incognito window (to bypass any cached JS from the earlier attempts).
  2. Connect using:
    • WS URL: wss://openclaw.tail18850e.ts.net/gateway
    • Token: (the same one you pasted in the screenshot)

If it still fails, the next thing I’ll check is the Gateway log line for the new connection and adjust accordingly, but this change should eliminate the “secure context” closure.


About https://openclaw.tail18850e.ts.net:444/ (Control UI)

This is expected until you set the token inside the Control UI:

(That error is specifically token_missing, which matches the gateway logs.)


If you try /chat after the new deploy and it still errors, paste the exact red error text it shows now (it should no longer be the secure-context string). user: System: [2026-04-12 13:53:21 UTC] Exec failed (marine-b, signal SIGKILL) :: [main 44ebc61] fix(chat): identify as webchat-ui for gateway connect 1 file changed, 4 insertions(+), 4 deletions(-) To https://github.com/elite-flacco/openclaw-dashboard.git c2bcbea..44ebc61 main -> main System: [2026-04-12 13:53:46 UTC] Exec failed (ember-bi, signal SIGKILL)

its showing no data at all. i feel like it's not set up correctly [message_id: 42515707-958e-47f4-a835-f275e856300d] assistant: It is set up correctly — the screenshots show the Gateway UI loading fine, it’s just not authenticated, so it can’t fetch anything (hence all the n/a, “Health Offline”, and “Schema unavailable”).

The red banner in your screenshot is the whole story:

unauthorized: gateway token missing (open a tokenized dashboard URL or paste token in Control UI settings)

Fix (1 minute)

  1. Click the gear icon (top right) to open Settings.
  2. Find the field for Gateway token (or “Token”).
  3. Paste the gateway token (the same one you’ve been using in your dashboard chat page).
  4. Save (if needed), then refresh.

As soon as the Control UI has the token, Health should flip to online and the Cron/Config/Sessions panes will populate.

Why you’re seeing “no data”

Without a token, the Gateway intentionally refuses:

  • config.get (so “Schema unavailable”)
  • cron/scheduler endpoints (so n/a)
  • basically everything that makes the UI useful

Two extra notes so you don’t get spooked

  • Those “Exec failed (SIGKILL)” system lines you pasted are from my exec sessions getting killed when I aborted long commands; your services are fine. openclaw-dashboard is running.
  • Your dashboard chat at /chat is separate. The gateway UI auth doesn’t automatically carry over to it; each UI stores its own token locally.

If you paste the token into the Control UI settings and it still doesn’t populate, tell me what it shows in the top-right pill (the Health status text), and I’ll pull the gateway log line for that connection. assistant: I didn't receive any text in your message. Please resend or add a caption. user: there's no place to set the token [message_id: 277ab183-3f61-464a-8723-483a7bd533d8] assistant: That banner is coming from the Control UI, not the Config editor. The token field doesn’t live on the “Config” page.

Here’s where it is:

  1. Top-right toolbar → click the sliders/controls icon (in your screenshot it’s just left of the theme icon).
  2. Open Control UI settings
  3. Paste the Gateway token there and save.

If you truly don’t see that menu (some builds hide it when disconnected), you can also do it by opening the dashboard with a tokenized URL (same idea the banner mentions), e.g.:

  • https://<dashboard-host>/?gatewayUrl=http://<gateway-host>:<port>&token=<TOKEN>

A couple notes:

  • Don’t paste the token in chat; paste it into the UI/settings.
  • Once the token is set, the “Schema unavailable” message should go away after reconnecting.

If you tell me which dashboard build/repo you’re using (or the URL path you’re on, e.g. /config), I can tell you the exact menu label/route it uses in that version.