This is itsAnchorpoint's fork of DeedleFake/Trayscale, based on upstream v0.20.0. It adds persistent Automatic exit-node selection, verified Mullvad failover with connection checks, and IPN watcher recovery after daemon restarts.
git clone https://github.com/itsAnchorpoint/trayscale.git
cd trayscale/packaging/arch
makepkg -siThe package is named trayscale-anchorpoint and replaces the installed
trayscale package through a package conflict. It keeps the same executable,
desktop entry, settings, and autostart integration. Ordinary AUR updates for
trayscale will no longer replace the fork. Fork updates are installed from
this repository; see fork maintenance.
The Flathub, AUR, and go install ...@latest instructions below install upstream.
Trayscale is an unofficial GUI interface for the Tailscale daemon particularly for use on Linux, as no official Linux GUI client exists. It provides a basic system tray icon and a fairly comprehensive UI with support for many of Tailscale's features.
Disclaimer: This project is in a beta state. There may still be undiscovered bugs or compatibility issues. Use at your own risk.
Trayscale interfaces with the Tailscale daemon, tailscaled, to perform many of its operations. In order for this to work, the daemon must have been configured with the current user as the "operator". To do this, run sudo tailscale set --operator=$USER from the command-line at least once manually.
The exit-node page supports three mutually exclusive modes:
- Automatic uses Tailscale's persistent
auto:anyselection and continues working when Trayscale is closed. It requires Tailscale 1.98.10 or newer and can choose any exit node permitted by tailnet policy. - Automatic with Connection Checks monitors real TCP egress and switches between Mullvad exit nodes after confirmed failures. Trayscale must remain running for these additional checks.
- Specific Exit Node pins the selected node until it is changed manually.
Manual exit-node changes always take precedence over connection checks. Trayscale does not automatically disable an exit node as part of failure recovery.
Note that the above config note about the current user being designated as an "operator" still applies to the Flatpak version of this app. However, the tailscale client is bundled into the Flatpak and thus does not need to be in your $PATH.
If you are on Arch Linux or a derivative, Trayscale is available from the AUR.
First, make sure that you have dependencies installed:
- Go >= 1.24
- GTK >= 4.0
- Libadwaita >= 1.9
The main Trayscale binary can be installed with go install:
$ go install deedles.dev/trayscale/cmd/trayscale@latestIf you would like, you can also copy the .desktop file, the icon, and other pieces of extra metadata into the places that they need to be put to function properly:
dev.deedles-trayscale.desktop->$HOME/.local/share/applications/dev.deedles.Trayscale.png->$HOME/.local/share/icons/hicolor/256x256/apps/
Note that without copying both of these files into the correct locations, notifications will likely not function correctly in GNOME. Also keep in mind that if the trayscale binary is not in your $PATH in a way that the desktop environment can locate then the .desktop file will not be considered valid. If this is an issue, modify the file manually and change the Exec= line to point directly to the binary with an absolute path.
First of all, please note that macOS support is not maintained or tested by the primary developer of Trayscale. Also note that the tray icon will not work in macOS.
The simplest way to install Trayscale on macOS is via Nixpkgs' unstable channel. Note that it will need to be built from source if a binary cache is unavailable and the build can take some time.
To build it locally without Nix, first make sure that you have installed the Go compiler, as well as necessary dependencies. The dependencies are available as the following Homebrew packages:
libadwaitagtk4gobject-introspectionharfbuzz
Then, run the following in the root of the repository:
$ ./dist.sh build
$ ./dist.sh install-macos
Trayscale can display UI strings in other languages via gettext catalogs under po/. Go-constructed strings use gotext; GtkBuilder labels marked translatable="yes" use the same catalogs through libintl. See po/README.md. Prefer LANGUAGE=ja (or install the matching system locale); bare LANG=ja without a generated libc locale is sanitized so GTK does not hang.

