Skip to content

Trayscale: Tailscale in the tray, and overrides back above Wolfi - #40

Merged
aledbf merged 6 commits into
mainfrom
trayscale
Nov 7, 2026
Merged

aledbf merged 6 commits into
mainfrom
trayscale

Conversation

@aledbf

@aledbf aledbf commented Nov 7, 2026

Copy link
Copy Markdown
Collaborator

What

Trayscale (a GTK 4 / libadwaita Tailscale client with a StatusNotifierItem icon) joins the image and starts at login in the tray, from the new fork Construct-Linux/trayscale on gnome-51. It replaces the plan to port KTailctl (Qt/Kirigami), which never fitted GNOME.

To lock the image at all, six recipes had to catch up with Wolfi first: Wolfi's index had moved past our overrides, so task lock refused the roots on main too.

Commits

  • recipes: move overrides back above Wolfi's newer builds
    • bluez 5.88. Upstream removed gatttool; bluetoothctl's gatt menu replaces it.
    • gst-plugins-bad 1.28.9.
    • systemd 262.2, with its man pages in systemd-doc, as Wolfi builds them now.
    • pipewire gains pipewire-doc the same way.
    • glib stays at 2.90.1, epoch 3. Wolfi's r1 and r2 are not taken: LTO, a static build, and a patch putting GChecksum/GHmac on OpenSSL, which would make glib depend on libcrypto.
    • nss-mdns is dropped: Wolfi packages it now.
  • image: Trayscale, Tailscale in the tray from login: the recipe, the package in the image, and /etc/xdg/autostart with --hide-window.
  • trayscale: the pages' tailscaled calls off the main thread: the fork's fix for upstream #262 and #239, where a slow tailscaled froze the window.
  • docs: Trayscale among the desktop's apps and forks: README and the fork-merge skill.
  • image: tray icons in the top bar's padding, Trayscale's icon from Tela: AppIndicator's compact mode set 10 px by hand on each tray icon; it is now off, so they take Orchis's 6 px. Trayscale's icon now comes from Tela: the Tela fork links it to the VPN icon.
  • trayscale: tailscale.com 1.104.5, tray 0.2.0, x/net 0.62.0: tray 0.2.0 fixes a menu race.

Checked

  • task build for each changed recipe.
  • task lock, which builds both roots.
  • task check.
  • task disk -- -test and go run ./cmd/image check.
  • task test: 534/534 passed, 2 skipped, 0 journal errors. Boot takes 6.5 s and shell startup 2.63 s; AppIndicator, the slowest extension, loads in 504 ms.
  • The fork's own CI on gnome-51 is green: lint, go fix, tests with -race and -asan, metainfo, and the exit-node model check.

Not run yet

  • task test:usb, which also compares the shell's views against the needles. The tray icon changes the top bar, so new needles are likely needed (task needles:propose).
  • task test:lifecycle.

🤖 Generated with Claude Code

aledbf and others added 6 commits November 6, 2026 22:12
task lock refused the roots: Wolfi's index now carries bluez 5.88,
glib 2.90.1-r2, gst-plugins-bad 1.28.9, systemd 262.2 and nss-mdns
0.15.1-r1 above our overrides, and check-docs wanted pipewire-doc,
which Wolfi now builds. Each recipe moves the way its own reason asks:

- bluez 5.88 and gst-plugins-bad 1.28.9, from upstream's tags (Wolfi's
  index has them before its recipes on GitHub). bluez 5.88 removed
  attrib/ and gatttool with it; bluetoothctl's gatt menu replaces it.
- systemd 262.2, with its manual pages in systemd-doc as Wolfi builds
  them since 262.2-r1: without ours, apko would take Wolfi's
  systemd-doc beside our systemd. Installed with the other manuals.
- pipewire keeps 1.6.11 and gains pipewire-doc the same way.
- glib keeps 2.90.1 at epoch 3. Wolfi's r1 and r2 (LTO, a static
  build, and its own patch putting GChecksum and GHmac on OpenSSL 4's
  libcrypto) are not taken: the desktop needs none of them, and glib,
  under every app, would depend on libcrypto.
- nss-mdns goes: Wolfi packages it now, the same release with avahi's
  socket under /run, so the reason for the recipe is gone.

The lock also takes hwdata-pci (pci.ids) as apko now resolves it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tailscale had a command line and the Construct app's page to join a
tailnet; nothing showed its state or switched an exit node at a
glance. Trayscale (Construct-Linux/trayscale, gnome-51) is a GTK 4 and
libadwaita client with a StatusNotifierItem icon, which the
AppIndicator extension shows. It starts at login with --hide-window,
in the tray only.

The recipe builds what dist.sh would, which needs bash. puregotk
dlopens GTK and libadwaita, so the runtime dependencies are declared;
the translations are embedded, so there is no -lang.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fork's gnome-51 moves the self, peer and Mullvad pages' calls to
tailscaled into goroutines with a timeout, so a slow or stuck daemon
no longer freezes the window (upstream #262, #239).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Trayscale's icon is the first tray icon the session shows, and task
test caught two things about it. AppIndicator's compact mode, on by
default, sets -natural-hpadding: 10px on each tray icon by hand; off,
they take Orchis's panel-button padding like every other button in the
bar. And the app showed its own PNG among Tela's icons: the Tela fork
now links dev.deedles.Trayscale to preferences-system-network-vpn, as
yast-vpn does.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The fork's gnome-51 takes the daemon's patch releases (Construct ships
1.104.4), deedles.dev/tray 0.2.0, which writes menu replies under the
menu lock (a race behind tray menus that stop answering, upstream
#239), and x/net 0.62.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@aledbf
aledbf merged commit 4d0b435 into main Nov 7, 2026
5 checks passed
@aledbf
aledbf deleted the trayscale branch November 7, 2026 02:42
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