A small KDE-friendly Linux system tray app for Tailscale.
It wraps the official tailscale CLI, shows current connection state in the tray, and gives quick desktop actions for common tasks without trying to replace the Tailscale client itself.
- KDE Plasma users who want a lightweight tray app
- Fedora users first, other Linux desktops second
- People who already have a working Tailscale CLI install and want a friendlier desktop control surface
Current packaged app icon:
A fuller screenshots section is still on the roadmap. For now, the icon and README cover the current UX shape, and real KDE screenshots can be added as the UI settles.
- Branded TS tray icon with per-state status overlays
- Polls
tailscale status --json - Shows current state in the tray menu:
- Connected
- Connecting
- Stopped
- Needs Login
- Needs Approval
- Unknown
- Error
- Quick actions:
- Refresh
- Connect
- Disconnect
- Copy Tailnet IP
- Open Tailscale Admin
- Show diagnostics
- Quit
- Non-blocking status refresh and command execution
- Tray notifications for important state changes and action results
- Diagnostics view for backend state, CLI path, tailnet identity, and current error details
- Snap-friendly CLI detection, plus common fallback binary paths
- Linux desktop with StatusNotifier/system tray support
- KDE Plasma is the primary target and tested path
- Python 3.10+
- A working
tailscaleCLI installation - PySide6
Install Tailscale first if it is not already present:
sudo dnf install tailscale
sudo systemctl enable --now tailscaledThen download the latest RPM from GitHub Releases and install it:
sudo dnf install ./tailscale-tray-<version>-1.$(uname -m).rpmTo reinstall the same version during testing:
sudo dnf reinstall ./tailscale-tray-<version>-1.$(uname -m).rpmTo uninstall:
sudo dnf remove tailscale-trayInstall the runtime dependencies first:
sudo pacman -S --needed tailscale python python-pyside6 hicolor-icon-theme
sudo systemctl enable --now tailscaledEach GitHub release includes a single Arch packaging bundle:
tailscale-tray-<version>-arch-release.zip
That zip contains the Arch-only packaging metadata files:
PKGBUILD.SRCINFO
These are intended for AUR publishing or manual Arch packaging, not direct pacman -U installation.
Typical local build flow on Arch:
curl -LO https://github.com/iamstevedavis/tailscale-tray/releases/download/v<version>/tailscale-tray-<version>-arch-release.zip
unzip tailscale-tray-<version>-arch-release.zip
makepkg -siThis app does not require the Fedora tailscale RPM specifically. It only needs a working tailscale CLI available at runtime.
Lookup order is:
- normal
PATH /var/lib/snapd/snap/bin/tailscale/snap/bin/tailscale/usr/local/bin/tailscale/usr/bin/tailscale
That means Snap installs are supported as long as the desktop session can access the binary.
sudo systemctl enable --now tailscaled
sudo tailscale upLaunch from your app launcher as Tailscale Tray, or run:
tailscale-trayMenu actions:
- Refresh: re-checks current Tailscale state
- Connect: runs
tailscale up - Disconnect: runs
tailscale down - Copy Tailnet IP: copies the currently detected tailnet IP
- Open Tailscale Admin: opens the machine list in the Tailscale admin console
- Show diagnostics: shows current state, backend state, detected CLI path, tailnet info, and current error
- Confirm your desktop supports StatusNotifier/system tray icons
- On KDE, try logging out and back in if the tray host is misbehaving
- Start it from a terminal once to catch runtime errors:
tailscale-trayMake sure one of these works from the same user session that launches the app:
which tailscale
ls -l /var/lib/snapd/snap/bin/tailscale /snap/bin/tailscale /usr/local/bin/tailscale /usr/bin/tailscaleIf the binary exists but the app still cannot find it, open Show diagnostics and check the detected CLI path.
The app tries a sanitized xdg-open launch first, then falls back to Qt URL opening. If it still fails:
xdg-open https://login.tailscale.com/admin/machinesIf that shell command works but the app action does not, file an issue with your desktop environment, distro, install method, and whether the packaged app was installed from the RPM.
Some systems need polkit auth, elevated privileges, or an already-running tailscaled daemon. Use Show diagnostics and the tray notification text to see whether the failure looks like:
- permission/polkit
tailscalednot running- browser login required
- generic command failure
make testpython3 -m pip install --user -r requirements.txt
python3 app.pyThis repo supports RPM builds and generated Arch/AUR packaging artifacts.
This is the easiest and most reproducible option. It only requires Docker on the host.
make build-rpm-container VERSION=0.1.0Or directly:
./scripts/build-rpm-container.sh 0.1.0That flow:
- builds
packaging/Dockerfile.rpm-build - runs the PyInstaller + RPM build inside a Fedora container
- writes finished artifacts to
./artifacts/
On SELinux-enabled Fedora hosts, the script automatically applies the correct Docker bind-mount relabeling.
If you want to build on a Fedora host directly:
sudo dnf install -y python3 python3-pip rpm-build rpmdevtools desktop-file-utils
python3 -m pip install --user -r requirements-build.txt
sudo dnf install -y ruby ruby-devel gcc make
sudo gem install fpm
make build-rpm VERSION=0.1.0Key packaging files:
packaging/tailscale-tray.desktoppackaging/tailscale-tray.specpackaging/Dockerfile.rpm-buildpackaging/arch/PKGBUILD.in- generated
.SRCINFOmetadata
GitHub Actions now handles both validation and release packaging.
On pushes to master and on pull requests:
- runs
make test
There is a release workflow that:
- builds the RPM in Docker
- generates an Arch release bundle containing
PKGBUILDand.SRCINFO - uploads workflow artifacts
- creates a GitHub Release
- attaches the built RPM, Arch bundle, and
SHA256SUMS.txt - uses tag-driven versioning
- generates release notes automatically
- respects
.github/release.ymlchangelog categories
Release versioning is based on Git tags like:
v0.1.0
v0.1.1
v0.2.0You can trigger releases in two ways:
- push a tag like
v0.1.1 - run the Release RPM workflow manually and provide
0.1.1orv0.1.1
- KDE-first, Linux-only for now
- No DE-specific packaging beyond RPM yet
- No auto-update mechanism yet
- No autostart installer flow yet
Issues and PRs are welcome.
See:
CONTRIBUTING.mdRELEASE_CHECKLIST.md.github/ISSUE_TEMPLATE/
Useful commands:
make test
make build-rpm-container VERSION=0.1.0
make build-aur-artifact VERSION=0.1.0If you are shipping a release:
- use
RELEASE_CHECKLIST.md - prefer tagging
vX.Y.Z - let GitHub Actions build and attach the RPM instead of hand-uploading artifacts