OpenClaw and Tailscale
Serve for the tailnet, Funnel for the public, and the identity-header shortcut
Tailscale is the docs’ preferred way to reach an OpenClaw dashboard that is not on your own machine. OpenClaw can configure Serve, tailnet only, or Funnel, public, by itself: the Gateway stays bound to loopback while Tailscale supplies HTTPS, routing and, for Serve, identity headers that can replace a token. Here are the three modes, the auth rules that go with them, the prerequisites and limits, and the recovery step for a claim an older Gateway left behind.
Three modes
- Serve: tailnet-only HTTPS through Tailscale Serve, with the Gateway still on the loopback address; open the MagicDNS name and you are there.
- Funnel: public HTTPS, which requires a shared password and refuses to start without one; the same URL remains usable from inside the tailnet, where peers take the Serve identity path.
- Off, the default: no Tailscale automation. A separate bind option listens directly on the tailnet IP without HTTPS or Serve, which the docs call a downgraded transport: the browser’s identity signing does not encrypt anything, so prefer Serve.
Auth
The handshake has four modes: none for private ingress only, token by default, password, and trusted proxy for an identity-aware reverse proxy. A resolved password selects password mode; token mode with no credential generates a runtime-only token on loopback startup. With Serve and the allow-Tailscale flag, the Control UI and its WebSocket can authenticate through Tailscale identity headers instead: OpenClaw resolves the forwarded address through the local Tailscale daemon and matches it to the header before accepting it, and only on its dedicated managed listener. That tokenless path assumes the host is trusted; if untrusted local code can run there, turn the flag off and require a token or password.
tailscale.mode: "funnel" refuses to start unless auth mode is password, to avoid public exposure.
Prerequisites and limits
- The Tailscale CLI installed and logged in, and HTTPS enabled for the tailnet; the CLI prompts if it is missing.
- Funnel needs Tailscale 1.38.3 or later, MagicDNS, HTTPS, a funnel node attribute, and one of ports 443, 8443 or 10000; on macOS it needs the open-source app variant.
- Serve and Funnel expose only the control UI and the WebSocket. Nodes connect over the same endpoint, so Serve works for node access too; for browser control on another machine run a node host there and avoid Funnel.
OpenClaw on a VPS is the SSH-tunnel alternative for a rented server, and OpenClaw on Hetzner shows the tunnel in a full install.
Claims, doctor, and routes you do not own
OpenClaw holds Serve or Funnel as a foreground claim: startup succeeds only once the claim is active, and stopping the Gateway releases it. Older Gateways could leave a claim behind after a forced shutdown; if startup reports an occupied HTTPS port, read the Serve status output, confirm which process created the route, and only then stop it. Named Tailscale Services are not supported and the doctor’s fix flag disables that setting; a route another service owns can point at the ordinary listener only through the trusted-proxies path, which never grants tokenless auth. OpenClaw Gateway security controls sets these beside the other Gateway controls.
On Diali
On Diali the dashboard has a stable HTTPS address without a tailnet, because the instance is ours to expose: no Serve, no Funnel, no password on a public URL, and your devices join as nodes through the same authenticated endpoint. Hosted OpenClaw on Diali is the assistant and Security on Diali describes the boundary.
- Serve for the tailnet, Funnel for the public, off by default.
- Funnel needs a password; Serve can use identity headers on a trusted host.
- Only the control UI and WebSocket are exposed, and nodes ride the same endpoint.
Stop reading about it, build one
Set up an agent, pick a channel, and have it working inside the app you already keep open.
