mrkeyoor.com_
Wed 02 Sept 07:11 UTC
Self-Hostedevaluationupdated 02 Sept 2026

headscale review

Headscale is a self-hosted coordination server for creating one private network with Tailscale clients. It handles the exchange of device keys, assigns network addresses, and tells connected machines which routes and peers are available. The point is to keep that control service under your own administration for a personal lab or small organization.

trackingstars / 7d
Verdict

Our build succeeded in 130 seconds, but the test step ended with only 9 of 13 packages passing. Headscale is the clearest choice for a technically capable self-hoster who specifically wants Tailscale clients, one tailnet, and control of the coordination server. Its narrow scope is a virtue for labs and small organizations, but the unsupported container and reverse-proxy path makes it a poor default for teams whose operations are standardized around those tools. Use it after reproducing the four integration failures in your intended environment, not merely because its 43,459 stars make it look safe.

We ran it

Install✓ · 67s760 packages
Build✓ · 130s
Tests✗ · 479s9 passed · 4 failed of 13 (go test)
Repo1464 files~166,057 lines of source · 385.5 MB · 18 CI workflows

Answers from our run

Does headscale build from source?

Dependencies installed in 67 seconds (760 packages), and the build succeeded in 130 seconds. We cloned commit cbe3030 into a clean Debian container with 3 CPUs and no project-specific setup.

Do headscale's tests pass?

Not all of them: 9 of 13 passed and 4 failed when we ran the project's own test command (go test). Some failures need services or credentials a bare container does not have.

Who should not use headscale?

Teams needing several separately managed organizations or tailnets, because Headscale deliberately targets one tailnet

What are the alternatives to headscale?

Tailscale, NetBird, Netmaker. Our build succeeded in 130 seconds, but the test step ended with only 9 of 13 packages passing.

Setup2/5Build worked, but 4 of 13 test packages failed
Docs4/5Versioned stable docs and explicit tag guidance
Community5/543,459 stars, recent push, release, Discord, and 18 workflows
Maturity4/5Focused v0.29.3 project with active maintenance

Who it’s for

Self-hosters who already like Tailscale clients but want to run the control server
Home-lab operators managing one private network across several locations
Small open-source organizations willing to maintain a Go service
Administrators comfortable following version-specific documentation and upgrades

Who it’s NOT for

Teams needing several separately managed organizations or tailnets, because Headscale deliberately targets one tailnet
Anyone wanting a fully managed VPN with vendor support and minimal operations
Operators whose standard deployment requires a reverse proxy or containers, which the project does not support or encourage
Buyers who need every integration test to pass unchanged in a fresh Debian container

Setup reality

In our sandbox, installation succeeded in 67 seconds with 760 packages, the build succeeded in 130 seconds, and the tests failed after 479 seconds: 9 of 13 passed and 4 failed. This was an unprivileged Go 1.24 Debian container, and the visible log names four failing integration tests without showing their causes. The README sends operators to the versioned documentation and explicitly discourages reverse proxies and containers, so real deployment is more involved than copying one command; match the configuration examples to the exact v0.29.3 tag and expect to make deliberate hosting choices.

It replaces one specific part of Tailscale

Headscale is an open-source implementation of the control server used to coordinate a Tailscale network. Tailscale itself builds an overlay network on WireGuard, while the control server exchanges public keys, assigns client addresses, separates users, enables machine sharing, and exposes advertised routes. Running Headscale means those coordination duties sit on infrastructure you administer, while the connected devices still use Tailscale clients. That is a precise and useful promise, not an attempt to become a general-purpose network appliance.

The boundary matters: Headscale is designed for a single tailnet, aimed at personal use, home labs, and small open-source organizations. It is not presented as a multi-organization service or a drop-in enterprise account system. At v0.29.3, the project tells users to select the same GitHub tag as the release they install because main can contain unreleased configuration changes. That warning is practical, and ignoring it is an easy way to combine a stable binary with the wrong example configuration.

What happened when we ran it

We cloned commit cbe3030 and tested it on September 1, 2026 in an unprivileged Debian container with 3 CPUs, 8 GB of RAM, and the golang:1.24-bookworm image. Installation succeeded in 67 seconds and installed 760 packages. The build then succeeded in 130 seconds. Those results show that the source can be fetched, its dependency graph resolved, and the program compiled in a clean environment, but they do not establish that the service is ready for a real network.

The test step failed after 479 seconds. Our run recorded 9 passing packages and 4 failing packages out of 13. The visible log named TestTagsReauthEmptyTagsReturnsToUserSurvives, TestTailscaleRustAxum, TestTS2021WebSocketGET, and TestTS2021WASMClientUnderNode. It did not show enough detail to identify a cause, so blaming missing system packages, container restrictions, or the application would be speculation. The defensible conclusion is simply that the documented test command did not finish cleanly on our box.

Its narrow design is its strongest feature

Headscale benefits from a refreshingly explicit goal. If the problem is that you like the Tailscale client experience but do not want Tailscale's proprietary control server to coordinate your network, this project addresses that exact gap. It does not claim to replace the proprietary graphical clients for Windows, macOS, or iOS, and it does not pretend to cover every organizational model. The linked stable documentation separates feature and client-support details from the README, which keeps the front page readable.

The contributor path also looks disciplined for a project with 43,459 stars. Go code is checked with golangci-lint and formatted with golines and gofumpt; Protocol Buffer work uses Buf and clang-format; documentation and other files have their own formatters. The recommended Nix environment is intended to align contributor tools with the maintainers' setup, while Make targets cover generation, formatting, linting, tests, and builds. There is enough structure here to understand how changes are expected to reach CI.

The deployment advice rules out common defaults

The biggest operational catch is bluntly stated: the project does not support or encourage running Headscale behind reverse proxies or in containers. For many self-hosting teams, those are the default deployment building blocks. Development builds are offered as container images and binaries, but that does not reverse the production guidance. The repository also had no Dockerfile in our 1,464-file checkout. You should read the stable setup documentation before choosing a host, rather than assuming an existing Compose or ingress pattern will be accepted.

Setup instructions in the README focus more on contributors than operators. They name Go, Buf, and Protocol Buffer tooling, recommend nix develop, and expose make test and make build. Actual operation is delegated to the versioned documentation. That split is reasonable, but it means the README alone cannot tell you the full installation, upgrade, persistence, or recovery story. The need to align examples with v0.29.3 adds a small but real release-management burden.

The failed integration run is another reason to stage this carefully. Four named tests touch reauthentication, a Rust Axum client, WebSocket GET behavior, and a WASM client under Node, based only on their names. We cannot say which product behavior, if any, was broken because the supplied log stops at the failures. Before adopting Headscale, repeat the suite in the intended environment and investigate the full output. A successful 130-second build is encouraging, but it is not a substitute for passing tests.

Recent activity supports confidence, with caveats

The health signals are current rather than historical. The latest listed release, v0.29.3, arrived on July 29, 2026, and the repository was pushed on August 29, 2026. Alongside 18 CI workflows and 43,459 stars, that points to active maintenance and unusually broad awareness for self-hosted networking software. The 149 open issues are a meaningful queue, though the count alone cannot tell us response time, severity, or maintainer throughput.

It belongs in a small, deliberately operated network

In a real stack, Headscale occupies the coordination layer for one Tailscale-compatible private network. It is a sensible fit when an administrator can dedicate a supported hosting pattern, pin the release and matching configuration, test upgrades, and accept responsibility for the control service. The clients form the useful network; Headscale tells them how that network is organized. Keep its role narrow and avoid treating it as a general identity, multi-tenant, or managed networking product.

Choose Headscale when self-hosting the control plane is a requirement and its single-tailnet scope matches the organization. Choose Tailscale's managed service when operational convenience is worth surrendering that control. Evaluate NetBird, Netmaker, or ZeroTier One when compatibility with Tailscale clients is not the deciding factor. For the right lab or small organization, v0.29.3 looks focused and actively maintained, but adoption should pass through a staging environment that can explain all 4 failed test packages.

Alternatives

ProjectWhat it isPick it when
Tailscale gh↗The official Tailscale client paired with Tailscale's managed control service.Pick this instead when convenience, vendor support, and a managed control plane matter more than self-hosting.
NetBird gh↗A WireGuard-based private networking platform with hosted and self-hosted options.Pick this instead when you want to evaluate a broader self-hosted networking platform rather than a narrow Tailscale control-server replacement.
NetmakerA platform for creating and managing WireGuard-based virtual networks.Pick this instead when your design calls for managing multiple WireGuard networks and you do not require Tailscale-client compatibility.
ZeroTier OneA peer-to-peer virtual networking system with its own protocol and client ecosystem.Pick this instead when you are open to a different networking stack rather than specifically using Tailscale clients.

What people are saying

  1. [github-trending] juanfont/headscale
  2. [velocity-scout] juanfont/headscale

Sources

  1. Headscale repository
  2. Headscale stable documentation
  3. Headscale features
  4. Headscale client and operating system support

More self-hosted reviews

linera-protocol · v2 · OpenShell · wigolo · Mindwtr · club-3090 · the whole board →