[Bug]: Tailscale HTTPS row says "Start Tailscale" and hides its toggle while Network access is off, even though Tailscale is running#18753

opened19d agobyMmanimz

Before submitting

  • I searched existing issues and did not find a duplicate.
  • I included enough detail to reproduce or investigate the problem.

Area

apps/desktop

Steps to reproduce

[human] I tried out the Mac app for the first time and the Tailscale section in the settings doesn't seem right. There is no toggle button or explanation. Probably better messaging or a toggle button that's disabled and explains why would make the UX better.

[AI slop follows]

  1. On macOS, run the standalone Tailscale app, signed in to a tailnet with MagicDNS and HTTPS certificates enabled. tailscale status --json reports BackendState: "Running", a Self.DNSName, and a non-empty CertDomains.
  2. In T3 Code, leave Network access off and don't turn on Tailscale HTTPS. Open Settings → Connections and look at the local environment.
  3. Look at the Tailscale HTTPS row.

Expected behavior

I can't tell from the code whether Tailscale HTTPS is meant to need Network access, so either answer should lead to a fix:

  • If Tailscale HTTPS is meant to work with Network access off, the row should detect Tailscale and show the toggle. Tailscale Serve forwards to http://127.0.0.1:<port>, which a local-only backend already listens on. getAdvertisedEndpoints also keeps resolving Tailscale endpoints in local-only mode once tailscaleServeEnabled is true. That suggests this combination is supported, but it can only be reached after Network access has been turned on at least once.
  • If it's meant to need Network access, or detection is skipped on purpose (see Notes), the row shouldn't say "Start Tailscale" when Tailscale was never checked. It should explain why it's unavailable and what to do, for example "Turn on Network access to set up Tailscale HTTPS", or offer a way to check for Tailscale on demand.

Actual behavior

The row says "Start Tailscale to set up HTTPS access through MagicDNS." and has no toggle, even though Tailscale is running and ready to serve HTTPS. Nothing on the page suggests that Network access affects this row.

The cause is in apps/desktop/src/backend/DesktopServerExposure.ts, getAdvertisedEndpoints (main @ 9e55228):

ts
1if (state.mode !== "network-accessible" && !state.tailscaleServeEnabled) {
2 return coreEndpoints;
3}

With Network access off and Tailscale Serve never enabled, the Tailscale CLI isn't called, so no Tailscale endpoint is returned. renderTailscaleRow in apps/web/src/components/settings/ConnectionsSettings.tsx then treats "no endpoint" as "Tailscale isn't running". It shows the "Start Tailscale" text and hides the switch. The fallback text is the same whether Tailscale is stopped or was never checked.

Notes

  • The check was added on purpose in #2745 (fixing #2254 and #2737). It stops the Tailscale CLI from being called while there's no network exposure, because calling it triggers a macOS "Other apps" permission prompt with the Mac App Store Tailscale build. This report isn't asking to undo that. It's about the effect on this settings row.
  • This is a different problem from #15919. That report had Network access on and blames the tailscale command not being on the app's PATH. Here the CLI resolves fine, as /usr/local/bin is on the backend's PATH; it just never runs.

Impact

Minor bug or occasional failure

Version or commit

Desktop Alpha 0.0.45. The same code is on main @ 9e55228.

Environment

macOS 26.6.2 (arm64), standalone Tailscale 1.104.1 (not the Mac App Store build)

Logs or stack traces

shell
1$ tailscale status --json # (trimmed)
2BackendState: Running
3MagicDNSSuffix: <tailnet>.ts.net
4CertDomains: ["<host>.<tailnet>.ts.net"]
5Self.DNSName: <host>.<tailnet>.ts.net.
6
7# No Tailscale errors in desktop/server trace logs, consistent with the CLI never being called.

Screenshots, recordings, or supporting files

2026-10-12_14-51.png

Workaround

Turn on Network access. The Tailscale HTTPS switch then appears. Turning on Network access also makes the backend listen on every network interface, so if you only want tailnet access, turn Network access back off after enabling Tailscale HTTPS.

Note

Grok responding on behalf of Julius.

Thanks for the clear write-up. The behavior itself is intentional, but the copy is wrong, so I'm accepting this as a UX/copy bug.

  • Detection skip is on purpose. getAdvertisedEndpoints in apps/desktop/src/backend/DesktopServerExposure.ts returns only core endpoints when mode !== "network-accessible" && !tailscaleServeEnabled, so the Tailscale CLI is never spawned without opt-in. That's the fix from #2745 (for #2254 / #2737) to avoid the macOS "Other apps" TCC prompt with the Mac App Store Tailscale build. We're not reverting that.
  • The row misreports it. renderTailscaleRow in apps/web/src/components/settings/ConnectionsSettings.tsx treats "no Tailscale endpoint" as "Tailscale isn't running" and shows "Start Tailscale to set up HTTPS access through MagicDNS." with no switch. With Network access off, Tailscale was never checked, so that text is misleading.

Fix scope: when detection was skipped, the row should say why (e.g. "Turn on Network access to detect Tailscale") and/or offer an explicit on-demand "Check for Tailscale" action. That keeps the no-prompt-by-default guarantee. Detection without Network access is otherwise unchanged.

Workaround for now: turn on Network access, enable Tailscale HTTPS, then turn Network access back off if you only want tailnet access (Serve keeps resolving once tailscaleServeEnabled is true).

Unrelated to #15919, which is a PATH issue with Network access on.