Skip to content

feat(desktop): release builds, download page, action menu polish + settings fix#2

Merged
meabed merged 16 commits into
masterfrom
feat/desktop-app
Jun 1, 2026
Merged

feat(desktop): release builds, download page, action menu polish + settings fix#2
meabed merged 16 commits into
masterfrom
feat/desktop-app

Conversation

@meabed
Copy link
Copy Markdown
Owner

@meabed meabed commented Jun 1, 2026

Follow-up to the desktop app (#1, already merged) — packaging, docs, and polish.

Release builds & install

  • desktop-release workflow — manual dispatch builds the Wails app on macOS (arm64 + Intel), Windows, and Linux runners, packages each (.dmg via make-macos-dmg.sh, windowsgui .exe.zip, Linux .tar.gz), and publishes a desktop-v<version> GitHub release with install notes.
  • Professional download page at /desktop: app icon, per-platform download buttons, screenshot, feature list, per-OS install steps. Linked from the nav, the home page, and the README (with a polished app-icon.svg).

App polish (since #1)

  • Per-service menu: Open local URL, Open proxy URL, Copy proxy URL, Open folder, Copy info, Kill process (with a confirmation dialog). Endpoints gated to live services; clipboard via pbcopy/clip/xclip, kill via TERM/taskkill.
  • No-flicker list (keyed in-place row updates), HH:MM uptime, native right-click disabled, Esc unwinds confirm → menu → panel.
  • Settings reopen bug fixed — the window is now created on demand and the reference cleared on close, so open → close → open always works (the earlier Cancel+Hide didn't survive this Wails alpha).

This branch also merges master (the squash-merge of #1 + the CI Slack/Discord notification changes), so it's up to date.

Verified: core tests pass, desktop builds (CGO/WebKit), all workflows are valid YAML, the website builds with the new page, and every panel/menu/confirm/setup state was checked in a headless browser. Live tray/translucency + the packaging runners need a real session to eyeball.

meabed added 15 commits May 31, 2026 23:38
… drive it in-process

All proxy/discovery/expose/store/config/doctor/CLI logic now lives in
internal/core (package core); root main.go is a thin shell calling core.Run.
Version ldflag repointed to internal/core.Version. No behavior change — same CLI,
same flags, tests green, Windows cross-build ok.
…cess

Menu-bar app (separate Go module under desktop/) that runs the proxy in-process —
no sidecar. Start/Stop, Public(Funnel)/Private(Serve) radio, a Services submenu
that opens each URL, and Start-at-login (LaunchAgent / .desktop / HKCU Run key).
macOS is tray-only (Accessory activation, no Dock icon). Shares the same
~/.tailscale-proxy/config.json as the CLI. Compiles against Wails v3 (CGO/WebKit);
the raw 'go build' binary runs the tray, 'wails3 build' produces a bundled app.

Adds core.ConfigPath; documents the app in README + AGENT.md + desktop/README.md.
cmdStart resolves the public base once up front and passes it to the poll loop, so
'discovered <slug> …' lines now end with '→ https://node.ts.net/<slug>/'.
Replace the plain native menu with a dropdown webview panel (assets/panel.html)
served on a random loopback port by a token-gated control API (dashboard.go):
status dot + node, Start/Stop, Public/Private segmented toggle, a styled services
list (runtime badge, port, open button), and Start-at-login / Open-config / Quit.
A frameless Wails window loads it and is attached to the tray. Verified the panel
renders in a headless browser against a mock API; service rows use safe DOM (no
innerHTML interpolation of slugs).
…rk redesign

- Service cards now show runtime, port, pid, and project folder; add a Refresh
  button and a compact, calmer Start/Stop (filled green Start, restrained Stop).
- Add a Settings window (Settings + About tabs): full proxy config form + app
  prefs (start-at-login, hide-dock), and an About tab with the app icon, name,
  and version. Adds core.Controller.Refresh(), prefs.go (desktop-only prefs),
  icon.go (generated menu-bar hub icon: black template idle / green running).
- Hallmark redesign of panel.html + settings.html: native-macOS dark, single cool
  accent, translucent hairlines, mono/tabular numerals, sliding segmented toggle,
  native switches, :focus-visible rings, reduced-motion. Verified both render in a
  headless browser against a mock API.
…-blur, polish

- Window: frameless translucent (MacBackdropTranslucent) rounded shell; hide the
  panel when it loses focus (click-away dismiss).
- Per-service stats: cpu %, memory (MB), process uptime, and 'discovered N ago'
  (procStats via ps on unix; first-seen tracked in the dashboard). New
  core.CheckTailscale() drives a setup screen with install steps + link when
  Tailscale isn't detected, and a login banner when it's not up.
- Start/Stop shows a spinner and is guarded against double-clicks; the Funnel/Serve
  toggle is locked while running ('Stop to switch mode').
- Buttons are icon+text (Refresh, Settings, Config, Quit). New proxy/router glyph
  (anti-aliased exchange arrows) for the menu-bar icon + setup tile.
- Verified the panel, stats, and setup states render in a headless browser.
…Esc/icon polish

- Settings window now hides instead of closing (WindowClosing → Cancel + Hide), so
  it reopens reliably.
- New menu-bar icon: a fan-out routing glyph (one entry → many services); the setup
  tile uses the matching SVG. Settings/About tab icons unified to one ring/line style.
- Service cards restructured: identity (slug · 127.0.0.1:port · folder) on the left,
  a right-aligned metrics column (cpu / MB / uptime) that lines up across rows, then
  the open button — much easier to scan.
- Buttons use a pointer cursor; Esc dismisses the panel.
…, no right-click

- Each service row gets a ⋯ menu: Open URL, Copy URL, Open folder, Copy info,
  Kill process. Backend endpoints (/api/copy, /api/kill, /api/openfolder) are
  gated to pids/dirs that belong to a currently-discovered service; clipboard via
  pbcopy/clip/xclip, kill via TERM/taskkill.
- List no longer flickers: rows are keyed by slug and updated in place (no
  per-poll teardown).
- Uptime formatted as HH:MM (or 'Nd HH:MM').
- Native right-click context menu disabled in both panel and settings; Esc closes
  the action menu first, then the panel.
… uptime label

- Per-service menu now offers Open local URL (127.0.0.1:port), Open proxy URL and
  Copy proxy URL (the ts.net entry), Open folder, Copy info, then Kill.
- Kill process opens a styled confirmation dialog (warning icon, Cancel/Kill);
  Esc dismisses confirm → menu → panel in order.
- Uptime formatted as HH:MM with H/M markers and an 'up' label (e.g. 06H:22M up).
…blish

Manual workflow_dispatch (version input) builds the Wails app on macOS (arm64 +
Intel), Windows, and Linux runners, packages each (macOS .app→.dmg via
make-macos-dmg.sh, Windows windowsgui .exe→.zip, Linux tar.gz), and publishes a
desktop-v<version> GitHub release with install notes.
The Cancel+Hide-on-close approach didn't survive this Wails alpha — closing the
window destroyed it, so Show() on the dead reference was a no-op. Now the settings
window is created on demand and the reference is cleared on close, so open → close
→ open always works.
- Add a polished app icon (gradient squircle + fan-out routing glyph) at
  website/public/app-icon.svg, and a clean panel screenshot.
- New website 'Desktop app' page (/desktop): hero, per-platform download buttons,
  screenshot, feature list, per-OS install steps, requirements — linked in the nav
  and from the home page.
- README 'Desktop app' section with the icon, screenshot, and download links.
- desktop/README documents the desktop-release workflow + downloads.
Resolve conflicts after PR #1 was squash-merged: keep this branch's newer desktop
code (settings recreate-on-demand fix, docs/download page) and adopt master's CI
notification changes (ci.yml/release.yml/ci-notifications.md).
@vercel
Copy link
Copy Markdown

vercel Bot commented Jun 1, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
tailscale-proxy Ignored Ignored Preview Jun 1, 2026 6:49am

… updates

- Replace the stale ring-dot About logo with the fan-out routing mark so it
  matches the app/menu-bar icon.
- Add a Report an issue button (opens GitHub new-issue) and a Check for updates
  button backed by core.CheckUpdate() (latest GitHub release vs running version,
  with a Download/Releases link).
@meabed meabed merged commit a0f7af1 into master Jun 1, 2026
7 checks passed
@meabed meabed deleted the feat/desktop-app branch June 1, 2026 06:51
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.

1 participant