A Tailscale coordination server profile manager for Windows.
Switch between self-hosted coordination servers without touching config files.
Overview
Ganoid is a two-component tool for managing multiple Tailscale profiles — each pointing at a different coordination server — without manual reconfiguration.
| Component | Description |
|---|---|
ganoidd |
Privileged daemon. Runs as a Windows service. Manages Tailscale state, serves the web UI and REST API. |
ganoid |
System tray client. Monitors ganoidd, shows connection status, and lets you switch profiles from the tray or web UI. |
The two components communicate over a local HTTP API authenticated with a per-session bearer token. ganoid self-recovers if ganoidd restarts.
Screenshots
Dashboard — active profile, Tailscale state, peer count, one-click switching
System tray — live status and profile switcher
Installation
Run the following in PowerShell (elevation is handled automatically):
irm https://raw.githubusercontent.com/yashau/ganoid/main/install.ps1 | iex
To install the latest pre-release instead:
$GanoidPreview = $true; irm https://raw.githubusercontent.com/yashau/ganoid/main/install.ps1 | iex
The installer will:
- Download
ganoidd.exeandganoid.exefrom GitHub Releases - Install
ganoiddas a Windows service (auto-start, LocalSystem) - Add a startup shortcut for
ganoidto your user login - Create Start Menu shortcuts
- Start everything immediately
Usage
System tray
ganoid sits in the system tray. Right-click for the menu — it is rebuilt live on every click from the API.
- Status — current Tailscale backend state and active profile name (top, greyed out)
- Profiles — configured profiles; active one is checkmarked; click any other to switch immediately
- Open Dashboard — opens the web UI in your browser
- Quit — exits the tray app (
ganoiddkeeps running as a service)
Double-clicking the tray icon also opens the dashboard.
Web UI
The web UI is served by ganoidd at http://localhost:57400.
- Dashboard — active profile, Tailscale state, peer count, one-click switching with live progress
- Profiles — add, edit, and delete profiles
- Settings — port configuration (stub, not yet functional)
Direct navigation and page refresh work on all routes.
How it works
Profile switching
Each profile maps a friendly name to a coordination server URL. Switching runs an 8-step sequence:
- Stop the Tailscale service (so state files are stable)
- Back up the current Tailscale state directory (with ControlURL verification)
- Clear the active state directory
- Restore the target profile's saved state (verified before restoring; falls back through up to 3 versioned backups)
- Write the login server URL to the registry
- Start the Tailscale service
- Finalize
- Update the active profile in Ganoid's config
Up to 3 versioned backups are kept per profile (.v1, .v2, .v3), rotated automatically. Before overwriting a backup, the live state's ControlURL is verified to match the current profile. Before restoring, each backup version's ControlURL is checked — corrupted or mismatched versions are skipped.
Switch progress is streamed live in the web UI. The tray also triggers a switch directly.
First login
After switching to a profile for the first time, Tailscale will be in the NeedsLogin state. Open the Tailscale app or run tailscale login to authenticate with the new coordination server.
Debug logging
Logs are written to C:\ProgramData\Ganoid\ganoidd.log. Default log level is info. To enable full debug logging:
To revert:
Uninstall
irm https://raw.githubusercontent.com/yashau/ganoid/main/uninstall.ps1 | iex
Ganoid config and profile state backups are left intact.
Building from source
Prerequisites: Go 1.26+, Node.js, pnpm, goversioninfo
# Windows .\build.ps1 -Version 0.2.0 # All platforms .\build.ps1 -Version 0.2.0 -Target all
The build script compiles the SvelteKit UI, generates Windows version resources, and produces ganoidd.exe + ganoid.exe with version metadata embedded.
Platform support
Ganoid is developed and tested on Windows only. The codebase includes Linux and macOS stubs that compile but are not functional. If you're interested in bringing Ganoid to other platforms, feel free to fork the repo, implement the platform layer, and submit a PR.
Name
Ganoid refers to the type of scales found on primitive fish like gars and sturgeons — hard, interlocking, and layered. The name is a nod to Tailscale's fish-scale logo, and to the way Ganoid manages multiple overlapping network profiles.
License
Copyright (c) 2026 Ibrahim Yashau. All rights reserved.
