Skip to content
This repository was archived by the owner on Nov 12, 2026. It is now read-only.

Tailscale: native Pantheon app for the tailnet - #54

Merged
techmore merged 1 commit into
mainfrom
claude/tailscale-app
Oct 29, 2026
Merged

techmore merged 1 commit into
mainfrom
claude/tailscale-app

Conversation

@techmore

@techmore techmore commented Oct 29, 2026 •

Copy link
Copy Markdown
Owner

Replaces the "Tailscale" launcher, which only opened Tailscale's read-only web page (http://100.100.100.100/, "Viewing" mode) in a browser tab. That page had no device list and no connect/disconnect, and every change needed a separate browser login.

New app rust/mseries-tailscale (org.techmore.mseries.Tailscale), GTK4 + Granite through mseries-pantheon-kit:

  • Status card: connected/disconnected with the Tailscale logo (grey when off), tailnet and account, and a switch for tailscale up / down. Shows this device's name and IP, with copy.
  • Exit node: picker over devices that offer one (tailscale set --exit-node), plus "Allow local network access". It explains when no device offers one.
  • Devices: online first, IP · OS · last seen, search (Ctrl+F). Click a row to copy its IP; buttons copy the IP or ssh <magicdns-name>. Toast confirmation.
  • Settings: Tailscale DNS, subnet routes, incoming connections (shields up), Tailscale SSH server.
  • States: logged out (Log In… runs tailscale login and opens the URL), waiting for approval, service not running (copy sudo systemctl enable --now tailscaled), not installed.
  • Refused changes (no operator set): controls spring back to the real state, and a banner shows sudo tailscale set --operator=$USER with Copy.
  • Refreshes every 3 s while mapped, after each change, and on Ctrl+R/F5.

Conventions: app id, About/Quit menu, Ctrl+Q, toasts, accessible labels, utility window size, gettext tr(), theme colours only. It is registered in conventions.json with no exemptions, and the conventions test passes. It has its own CI workflow (fmt, clippy -D warnings, tests, desktop-file-validate, fixture snapshots).

Icon: the Tailscale logo redrawn from the dot layout in Tailscale's tray code client/systray/logo.go (BSD-3-Clause). The Tailscale name and logo are Tailscale Inc. trademarks, used only to label Tailscale.

Screenshots (from anonymised fixtures): see rust/mseries-tailscale/README.md.

Checked locally: 5 unit tests, conventions test, clippy clean. Rendered all states in light and dark, and rendered against the real tailscaled (status and prefs read correctly). The real daemon refuses changes with "Access denied: checkprefs access denied" (no operator set), which the app classifies as needing setup (unit-tested); the banner itself was rendered from fixtures. Installed to ~/.local and launched on the desktop. Connect/disconnect, exit node and settings changes were not run for real, because the operator isn't set on this machine.

🤖 Generated with Claude Code

Replaces the launcher that opened Tailscale's read-only web page in a browser.
Status card with connect switch, exit node picker and LAN access, device list
(online first, search, copy IP / copy ssh command), settings (DNS, subnet
routes, incoming connections, SSH server), login and service-down states.
Refused changes spring back and show the one-time operator command.

Follows APP-CONVENTIONS (registered in conventions.json), own CI workflow,
fixture screenshots in light and dark.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@techmore
techmore merged commit 8aa6c79 into main Oct 29, 2026
9 of 10 checks passed
@techmore
techmore deleted the claude/tailscale-app branch October 29, 2026 13:33
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant