Tailscale (Gateway dashboard)
Tailscale is the preferred remote-access layer for Fased when you want the gateway reachable off the local machine without opening the raw gateway port to the wider network. The intended pattern is still loopback-first: keep the gateway on127.0.0.1, then let Tailscale expose the control surface on top.
Modes
serve: Tailnet-only Serve viatailscale serve. The gateway stays on127.0.0.1.funnel: Public HTTPS viatailscale funnel. Fased requires a shared password and this should be the exception, not the baseline.off: Default (no Tailscale automation).
Recommended policy
- prefer
serve - keep the raw gateway port closed in your host firewall
- keep
gateway.bind: "loopback"unless you intentionally need a direct tailnet bind - use
funnelonly when you truly need public ingress
First-time setup
For a manual laptop, desktop, or VPS install:- Create or sign in to a Tailscale account.
- Install Tailscale on the gateway host.
- Run
tailscale upand complete the browser sign-in. - Keep Fased bound to loopback.
- Use Tailscale Serve only when you want the Control UI reachable from other devices in your tailnet.
Auth
Setgateway.auth.mode to control the handshake:
token(default whenFASED_GATEWAY_TOKENis set)password(shared secret viaFASED_GATEWAY_PASSWORDor config)
tailscale.mode = "serve" and gateway.auth.allowTailscale is true,
Control UI/WebSocket auth can use Tailscale identity headers
(tailscale-user-login) without supplying a token/password. Fased 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.
Fased 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.
HTTP API endpoints (for example /v1/*, /tools/invoke, and /api/channels/*)
still require token/password auth.
This tokenless flow assumes the gateway host is trusted. If untrusted local code
may run on the same host, disable gateway.auth.allowTailscale and require
token/password auth instead.
To require explicit credentials, set gateway.auth.allowTailscale: false or
force gateway.auth.mode: "password".
Config examples
Tailnet-only (Serve)
https://<magicdns>/ (or your configured gateway.controlUi.basePath)
This is the normal recommendation for both local and hosting profiles when you want browser access from other devices on your tailnet.
Tailnet-only (bind to Tailnet IP)
Use this only when you intentionally want the gateway to listen directly on the tailnet IP instead of staying on loopback behind Serve.- Control UI:
http://<tailscale-ip>:18789/ - WebSocket:
ws://<tailscale-ip>:18789
http://127.0.0.1:18789) will not work in this mode.
Public internet (Funnel + shared password)
FASED_GATEWAY_PASSWORD over committing a password to disk.
This is the exception path, not the default recommendation.
CLI examples
Notes
- Tailscale Serve/Funnel requires the
tailscaleCLI to be installed and logged in. tailscale.mode: "funnel"refuses to start unless auth mode ispasswordto avoid public exposure.- Set
gateway.tailscale.resetOnExitif you want Fased to undotailscale serveortailscale funnelconfiguration on shutdown. gateway.bind: "tailnet"is a direct Tailnet bind (no HTTPS, no Serve/Funnel).gateway.bind: "auto"prefers loopback; usetailnetif you want Tailnet-only.- Serve/Funnel only expose the Gateway control UI + WS. Nodes connect over the same Gateway WS endpoint, so Serve can work for node access.
- In the common loopback-plus-Serve path, you do not need to open port
18789in the public firewall.
Browser control (remote Gateway + local browser)
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.Tailscale prerequisites + limits
- Serve requires HTTPS enabled for your tailnet; the CLI prompts if it is missing.
- Serve injects Tailscale identity headers; Funnel does not.
- Funnel requires Tailscale v1.38.3+, MagicDNS, HTTPS enabled, and a funnel node attribute.
- Funnel only supports ports
443,8443, and10000over TLS. - Funnel on macOS requires the open-source Tailscale app variant.
Learn more
- Tailscale Serve overview: https://tailscale.com/kb/1312/serve
tailscale servecommand: https://tailscale.com/kb/1242/tailscale-serve- Tailscale Funnel overview: https://tailscale.com/kb/1223/tailscale-funnel
tailscale funnelcommand: https://tailscale.com/kb/1311/tailscale-funnel