Skip to content

Open the Tailscale admin console from the panel mark - #9234

Open
cschaba wants to merge 1 commit into
omacom:quattrofrom
cschaba:tailscale-admin-console
Open

Open the Tailscale admin console from the panel mark#9234
cschaba wants to merge 1 commit into
omacom:quattrofrom
cschaba:tailscale-admin-console

Conversation

@cschaba

@cschaba cschaba commented Aug 30, 2026

Copy link
Copy Markdown

The problem

Machine management — renaming, key expiry, ACLs, approving a subnet route — all lives in the Tailscale admin console, and reaching it from the panel meant leaving it to type the URL by hand.

The change

Click the Tailscale mark at the top of the panel, or press a, to open the admin console in the default browser via omarchy-launch-browser. The panel closes behind it the same way sendPeerFile closes it for a Taildrop send: the browser has taken over.

The mark was status-only decoration (iconComponent in the PanelHero), so this costs no existing gesture. The toggle switch still owns turning Tailscale on and off, from both mouse and keyboard, and the bar icon's left/right/middle click behaviour is untouched.

Self-hosted control servers

Which console opens comes from the daemon's own prefs rather than a hardcoded URL. tailscale status --json carries no control-plane URL, so tailscale debug prefs supplies ControlURL:

  • empty, or controlplane/login.tailscale.com → the hosted console at https://login.tailscale.com/admin/machines
  • anything else → that control server's own URL, since a self-hosted control server (Headscale and friends) has no console at Tailscale's address

The control URL only moves when the connection does, so it is read once at startup and again on the forced refresh that follows an account switch — never on the refresh interval, which would spawn a process every tick for a value that stands still for the life of a login. The poll watchdog stops it like the other three polls. A daemon too old for debug prefs, or one that refuses it, exits nonzero and leaves the link pointing at the hosted console.

Tests

The URL derivation lives in Model.js as two pure functions and is covered in test/shell.d/tailscale-test.sh — hosted control plane, empty prefs, trailing slashes, a self-hosted URL, and unparseable prefs. Further assertions cover the wiring: the browser launch, the prefs read, both entry points, and the panel close.

Verified live against a hosted tailnet; the self-hosted path is covered by unit tests only, as I have no Headscale server to point at.

🤖 Generated with Claude Code

Machine management — renaming, key expiry, ACLs, approving a subnet
route — all lives in the admin console, and reaching it meant leaving the
panel to type the URL by hand.

Click the Tailscale mark at the top of the panel, or press `a`, to open
it in the default browser, and the panel closes behind it the way it does
for a Taildrop send: the browser has taken over. The mark was status-only
decoration, so this costs no existing gesture — the toggle switch still
owns turning Tailscale on and off from both mouse and keyboard.

Which console that is comes from the daemon's own prefs. A tailnet on
Tailscale's control plane opens the hosted console; a self-hosted control
server has none at that address, so its own URL is the closest thing to
one and is what opens instead. The control URL only moves when the
connection does, so it is read once and again after an account switch,
never on the refresh interval. A daemon that will not answer `debug
prefs` leaves the link pointing at the hosted console.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants