CoderClaw can auto-configure Tailscale Serve (tailnet) or Funnel (public) for the Gateway dashboard and WebSocket port. This keeps the Gateway bound to loopback while Tailscale provides HTTPS, routing, and (for Serve) identity headers.
serve: Tailnet-only Serve via tailscale serve. The gateway stays on 127.0.0.1.funnel: Public HTTPS via tailscale funnel. CoderClaw requires a shared password.off: Default (no Tailscale automation).Set gateway.auth.mode to control the handshake:
token (default when CODERCLAW_GATEWAY_TOKEN is set)password (shared secret via CODERCLAW_GATEWAY_PASSWORD or config)When tailscale.mode = "serve" and gateway.auth.allowTailscale is true,
valid Serve proxy requests can authenticate via Tailscale identity headers
(tailscale-user-login) without supplying a token/password. CoderClaw verifies
the identity by resolving the x-forwarded-for address via the local Tailscale
daemon (tailscale whois) and matching it to the header before accepting it.
CoderClaw only treats a request as Serve when it arrives from loopback with
Tailscale’s x-forwarded-for, x-forwarded-proto, and x-forwarded-host
headers.
To require explicit credentials, set gateway.auth.allowTailscale: false or
force gateway.auth.mode: "password".
{
gateway: {
bind: "loopback",
tailscale: { mode: "serve" },
},
}
Open: https://<magicdns>/ (or your configured gateway.controlUi.basePath)
Use this when you want the Gateway to listen directly on the Tailnet IP (no Serve/Funnel).
{
gateway: {
bind: "tailnet",
auth: { mode: "token", token: "your-token" },
},
}
Connect from another Tailnet device:
http://<tailscale-ip>:18789/ws://<tailscale-ip>:18789Note: loopback (http://127.0.0.1:18789) will not work in this mode.
{
gateway: {
bind: "loopback",
tailscale: { mode: "funnel" },
auth: { mode: "password", password: "replace-me" },
},
}
Prefer CODERCLAW_GATEWAY_PASSWORD over committing a password to disk.
coderclaw gateway --tailscale serve
coderclaw gateway --tailscale funnel --auth password
tailscale CLI to be installed and logged in.tailscale.mode: "funnel" refuses to start unless auth mode is password to avoid public exposure.gateway.tailscale.resetOnExit if you want CoderClaw to undo tailscale serve
or tailscale funnel configuration on shutdown.gateway.bind: "tailnet" is a direct Tailnet bind (no HTTPS, no Serve/Funnel).gateway.bind: "auto" prefers loopback; use tailnet if you want Tailnet-only.If you run the Gateway on one machine but want to drive a browser on another machine, run a node host on the browser machine and keep both on the same tailnet. The Gateway will proxy browser actions to the node; no separate control server or Serve URL needed.
Avoid Funnel for browser control; treat node pairing like operator access.
443, 8443, and 10000 over TLS.tailscale serve command: https://tailscale.com/kb/1242/tailscale-servetailscale funnel command: https://tailscale.com/kb/1311/tailscale-funnel