A Tailscale coordination server profile manager for Windows.
Switch between self-hosted coordination servers without touching config files.
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.
Dashboard — active profile, Tailscale state, peer count, one-click switching
System tray — live status and profile switcher
Run the following in PowerShell (elevation is handled automatically):
irm https://raw.githubusercontent.com/yashau/ganoid/main/install.ps1 | iexTo install the latest pre-release instead:
$GanoidPreview = $true; irm https://raw.githubusercontent.com/yashau/ganoid/main/install.ps1 | iexThe 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
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.
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 — coming soon
Direct navigation and page refresh work on all routes.
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.
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.
Logs are written to C:\ProgramData\Ganoid\ganoidd.log. Default log level is info. To enable full debug logging:
set-log-level.cmd debugTo revert:
set-log-level.cmd infoirm https://raw.githubusercontent.com/yashau/ganoid/main/uninstall.ps1 | iexGanoid config and profile state backups are left intact.
Prerequisites: Go 1.26+, Node.js, pnpm, goversioninfo
# Windows
.\build.ps1 -Version 0.2.0
# All platforms
.\build.ps1 -Version 0.2.0 -Target allThe build script compiles the SvelteKit UI, generates Windows version resources, and produces ganoidd.exe + ganoid.exe with version metadata embedded.
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.
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.
Copyright (c) 2026 Ibrahim Yashau. All rights reserved.
