Keep working.
VPN up, tailnet up.
tailroute watches your Mac’s routing table and toggles Tailscale’s MagicDNS when your VPN connects—and back when it drops—internet through the VPN, peers through the mesh. A root daemon that is fail-safe, self-verifying, and entirely local.
Requires Tailscale · No account · No telemetry · Every install sha256-verified · Uninstall restores everything
- tagged releases · public since mar ’26
- 31
- shell tests · 348 → 417 in five weeks
- 417
- telemetry · external calls · accounts
- 0
- forever · apache-2.0 core
- $0
What it does
A daemon that makes the call, so you don’t.
Every routing-table change lands in one of three states, and the response is always the same. You do nothing.
demo · the decision loop, replayed
the matrix
Three states, zero judgment calls
Ambiguous? Two VPNs at once—it logs a warning and does nothing. Fail-safe first.
When the VPN connects—on hotel or café Wi-Fi, this is your Tuesday. The usual escape is a $100 travel router.
Every peer times out.
01SOCKS5 mesh proxy
A tsnet-based proxy on 127.0.0.1:1055 routes peer traffic through the mesh even when
the VPN blocks the CGNAT range. Starts and stops with the VPN—never configured by you.
Helpers included: sshproxy, curlproxy, generated SSH config.
When you need a peer’s dashboard
Cert warnings, extensions, luck.
02Browser tunnels
One command registers a launchd-managed tunnel and maps a managed /etc/hosts entry—
a valid, real .ts.net certificate in Safari, Chrome, or Firefox.
Adaptive path: SOCKS5 when the VPN is up, direct when it isn’t.
When it asks for root
Why trust a DNS-flipping daemon?
03Self-verifying install
An install-time SHA-256 integrity manifest is verified before any library loads—tampered files refuse to start, and say what changed. Strict validation, absolute paths, fail-safe on ambiguity, 417 tests and counting.
compatibility
Works with any utun-route VPN
The daemon classifies routing changes from any VPN that takes the default route—including corporate clients like Cisco AnyConnect, GlobalProtect or Zscaler (classified, not lab-tested: report yours ↗) —no per-VPN plugins, no allowlists.
Built in the open
Shipped, not promised.
No stars to flex, no fake logos. The repo is six months old and the commit history is the pitch: a slow spring, then a hardening sprint that hasn’t stopped.
View data table
| Date | Cumulative tagged releases |
|---|---|
| 2026-03-27 | 1 |
| 2026-04-09 | 2 |
| 2026-08-24 | 3 |
| 2026-08-31 | 4 |
| 2026-09-01 | 11 |
| 2026-09-02 | 23 |
| 2026-09-03 | 26 |
| 2026-09-11 | 27 |
| 2026-09-22 | 28 |
| 2026-09-23 | 29 |
| 2026-09-24 | 30 |
| 2026-09-30 | 31 |
Log rotation actually rotates—staged at daemon startup for every layout; integrity manifest now layout-aware.
2026-09-30 · tests 408 → 417
Second peers stay removable—hosts mappings land inside the managed block.
2026-09-24 · tests 406 → 408
Proxy registry self-heals against reality—and the auth key no longer leaks through argv.
2026-09-23 · tests 383 → 405
Every tunnel verb accepts the ssh alias—no more dead ends on tunnel check prime.
2026-09-23 · tests 367 → 383
tunnel check—the browser’s truth: hosts → listener → TLS → HTTP, zero ssh.
2026-09-03 · read-only by construction
22 releases in 72 hours (Sep 1–3)—the v0.7→v0.8 hardening sprint: a burst of fixes after the 0.8.0 rewrite, each one tagged and tested. Full history: CHANGELOG.md ↗
The model
One engine. Two apps.
Open core, honestly drawn: the engine is free and open source forever. The app is polish on the same engine—free while we sand the edges, a one-time license when it’s v1.0.
The core—CLI daemon
Everything, in your terminal
The full engine: MagicDNS toggling, SOCKS5 proxy, browser tunnels, helpers, integrity gate.
$0 forever · Apache-2.0 · no account
- Every feature, no gates—proxies, tunnels, helpers
- Homebrew or source; runs as a root launchd service
- Your traffic never touches our infrastructure (there isn’t any)
star it, fork it, audit it—that’s the point
The shell—menu bar app
Set it and forget it
The same engine behind a native macOS UI: onboarding, live state, proxy and tunnel controls, update alerts.
Free during early access · planned one-time license at v1.0—never a subscription
- Menu bar icon with live connection state
- First-run onboarding and a diagnostic panel
- Brew-aware updates with DMG download
early adopters shape the v1.0 roadmap—file issues
Honest limits
What it can’t fix
Told up front, not discovered later.
Network Extensions can still block the mesh
Modern macOS VPN apps intercept all outbound traffic—including packets to Tailscale’s CGNAT range
(100.64/10). tailroute fixes the DNS conflict and can bridge peers through its proxy, but it cannot
bypass Network-Extension packet interception. When direct mesh traffic is blocked, use the SOCKS5 proxy or a browser tunnel.
Also on the record: VPN active → MagicDNS names don’t resolve (use IPs or tunnels) · Firefox DoH bypasses /etc/hosts · won’t-fix by research: split-DNS, multi-VPN, IPv6. Report your VPN’s behavior ↗
FAQ
Asked, answered
Can I use Tailscale and my VPN at the same time on a Mac?
Does it work with Mullvad or NordVPN?
What about corporate VPNs—Cisco AnyConnect, GlobalProtect, Zscaler?
Which Tailscale install does it need?
brew install tailscale) is fully supported—tailroute toggles DNS over its unix socket.
The GUI app works with limitations (fall-back MagicDNS detection), and the Mac App Store version is not supported.Does it phone home?
It runs as root—why should I trust it?
What happens when I quit the VPN or uninstall?
Who is tailroute for—and who is it not for?
What’s the best way to run Tailscale and a VPN together on a Mac?
Support the work
Open source isn’t free to build.
The CLI stays free and open source. If tailroute saved your sanity mid-deadline, a star or a sponsorship keeps the hardening sprint going.
Next milestone
Notarized, Gatekeeper-clean builds Apple Developer ID ($99/yr) buys signed + notarized DMGs—no more right-click-to-open for new users. Sponsorship goes here first.