Tailscale Control is an unofficial native macOS utility for configuring tailscale serve routes to local apps and Docker-published ports.
It is intentionally small: it validates input, runs the local tailscale and docker CLIs with explicit argument arrays, and shows command output in the app.
This is free and open-source software (MIT) for everyone. There is no vendor, no account, no telemetry, and no branding — just a local utility you can read, build, and modify.
This project is not affiliated with, endorsed by, or sponsored by Tailscale Inc. Tailscale is a trademark of Tailscale Inc.
- Native macOS Swift/AppKit app; no web runtime or Electron.
- Quick route:
HTTPS :443on your tailnet tohttp://127.0.0.1:8080. - Custom routes: choose tailnet mode/port and local target scheme/host/port.
- Docker target discovery for containers with published host ports.
- Status and reset controls for
tailscale serve. - Closes like a normal small utility: closing the main window quits the app.
Runtime:
- macOS 13 or newer.
- Tailscale CLI installed and logged in.
- Docker CLI installed only if you want Docker target discovery.
Build from source:
- macOS with Xcode Command Line Tools.
swiftc,codesign,plutil, andhdiutilavailable in PATH.
For normal installation, download the latest .dmg from the project's GitHub Releases page:
- Open the repository on GitHub.
- Go to Releases.
- Download
Tailscale-Control-<version>.dmg. - Open the DMG and drag Tailscale Control.app to Applications.
- Launch the app from Applications.
The GitHub release workflow in this repository builds the DMG on macOS runners when a version tag is pushed.
git clone <repository-url>
cd tailscale-control
make build
open "build/Tailscale Control.app"Run verification:
make verifyCreate a local DMG:
make dmgThe DMG will be written to dist/.
-
Update version notes if needed.
-
Tag the release:
git tag v0.1.0 git push origin v0.1.0
-
GitHub Actions builds the app and uploads:
Tailscale-Control-v0.1.0.dmg- the generated
.appartifact
The app configures Tailscale Serve. For example, the quick route runs:
tailscale serve --bg --yes --https=443 http://127.0.0.1:8080That means:
tailnet HTTPS :443 -> http://127.0.0.1:8080
For Docker on macOS, publish the container port to the host first:
docker run -p 8080:80 your-imageThen route Tailscale to:
http://127.0.0.1:8080
The app does not route to Docker private container IPs. On Docker Desktop for macOS, host-published ports are the reliable path.
Sources/TailscaleControl/main.swift Native app source
scripts/build.sh Build and ad-hoc sign the .app
scripts/package-dmg.sh Create a local DMG
.github/workflows/release.yml CI/release build workflow
Makefile Convenience commands
LICENSE MIT License
- Commands are executed without shell interpolation.
- Port, host, scheme, and mode inputs are validated before command execution.
- The
--self-testmode verifies command construction without changing live Tailscale configuration. - The
--close-self-testmode verifies that closing the window terminates the app process.
MIT. See LICENSE.
