Headscale is an open-source, self-hosted control server that implements the Tailscale coordination protocol, letting you run your own WireGuardWireGuardA modern VPN protocol and Linux kernel module, maintained as an open-source project, that establishes encrypted tunnels using minimal code and fast cryptography, giving cyber tools a lightweight, high-performance transport layer.-based overlay network instead of using Tailscale's hosted service. It runs as a service you deploy yourself, exposing an HTTP API and CLI for managing users, nodes, and access policy. The README frames it for self-hosters and hobbyists, or small organizations running a single tailnet, rather than large enterprises needing multi-tailnet management, and it positions itself explicitly as an alternative to Tailscale's own control server. Recent work adds OAuth-based API authentication, SSH check-mode approvals, and policy reachability testing, alongside a rewritten map-update system for bandwidth efficiency. With 273 contributors, over a thousand commits in the past year, and a release 23 days ago, it is under continuing development.
Headscale is an open source, self-hosted implementation of the Tailscale control server.
Which of my devices can reach which others once this policy goes live?
evaluates the reachability assertions written into the policy file and rejects the change before it is applied if any expected path is blocked or any forbidden path is open
Which machines are actually allowed to SSH into a given host, and under what conditions?
checks each SSH rule's accept, deny, and check outcomes against the declared test cases at load time and refuses to apply a policy that fails one
Who is trying to get into a machine right now and needs my sign-off?
tracks pending check-mode authentication requests and lets an operator approve or reject them directly, without waiting on an OIDC round-trip
Which credential can do what, and can I take it away without touching my admin keys?
issues OAuth client-credential tokens scoped to specific operations and tagged to specific devices, separate from the all-access admin API keys
Did my last policy edit change what's reachable without me noticing?
runs the same reachability and SSH-reachability assertions on every reload, so a rule change that flips a verdict is caught at reload time rather than discovered in production
Which nodes get special network capabilities like file sharing or DNS overrides?
reads the node-attribute block in the policy file and reports which targeted nodes carry which capability, so grants aren't scattered across ad hoc configuration
34 capabilities
across 5 areas
· 1 backed by code, an API document or a real run
Built from Headscale's releases, docs, README and our own runs.
“Seen” marks the month we first spotted a release the vendor didn't date.
Group names and tags are our labels.
+Access Control and Policy Management3 capabilitiesHeadscale lets operators define and validate who can reach what across the tailnet, including SSH access rules and wildcard group semantics. Policies are checked for errors before being applied to live nodes.▸
+ACL policy authoring and validationshippedOperators can write and validate ACL policy files, including reachability and SSH rules, before pushing them to the network.28 releases · 4 other sources · first seen Jul 2021▸
release
28 total
Evaluates the tests block in policy files (beta): reachability assertions run on headscale policy set, SIGHUP reload, and headscale policy check, rejecting bad policy before it is applied.
v0.29.0 · Jun 2026
· source
· release history
Supports nodeAttrs block in ACL policy files to assign Tailscale node capabilities (e.g. disable-captive-portal-detection, nextdns:<profile>, drive:share, drive:access) to targeted nodes.
v0.29.0 · Jun 2026
· source
· release history
BREAKING: proto:icmp now covers only ICMPv4; use proto:ipv6-icmp or protocol 58 for ICMPv6.
v0.29.0 · Jun 2026
· source
· release history
Evaluates the sshTests block in policy files (beta): per-SSH-rule accept/deny/check reachability assertions with the same rejection semantics as the tests block.
v0.29.0 · Jun 2026
· source
· release history
Evaluates the sshTests block in policy files (beta), asserting SSH reachability with accept, deny, and check user lists per source/destination pair.
v0.29.0 · Jun 2026
· source
· release history
Adds support for Tailscale Grants (grants block in policy), enabling application-level controls like Taildrive file sharing and traffic steering via tagged subnet routers or exit nodes.
v0.29.0 · Jun 2026
· source
· release history
example
Validate a policy file's tests and sshTests blocks before pushing it live, catching reachability regressions without affecting running nodes.$ headscale policy check
v0.29.0 · Jun 2026
· source
Validate that a policy change won't break existing reachability assertions before applying it.$ headscale policy check
v0.29.0 · Jun 2026
· source
Validate a policy file for v2 compliance before pushing it live, catching load-time errors (such as missing @ in usernames) without disrupting a running instance.$ headscale policy check --file policy.json
v0.26.0 · May 2025
· source
Reload network policies without stopping the service$ kill -HUP $(pgrep headscale)
v0.16.0 · Jul 2022
· source
+SSH check-mode approval workflowverifiedAdministrators can approve or reject pending SSH access requests when policy requires an explicit check before granting a session.5 releases · 3 other sources · first seen Jan 2025▸
Shared capability: OIDC SSO
Also counts toward: Command-line interface
release
Supports Tailscale SSH "action": "check" rules, prompting OIDC or CLI approval before granting SSH access to a node.
v0.29.0 · Jun 2026
· source
· release history
Adds SSH check action support: when a policy rule uses "action": "check", connecting users must authenticate via OIDC or CLI approval before SSH access is granted.
v0.29.0 · Jun 2026
· source
· release history
New headscale auth CLI command group: approve, reject, and register subcommands manage SSH check-mode and web auth approval flows.
v0.29.0 · Jun 2026
· source
· release history
New headscale auth CLI command group with approve, reject, and register subcommands for managing pending SSH-check and web-auth flows.
v0.29.0 · Jun 2026
· source
· release history
Supports client certificate verification for DERP connections.
v0.24.0 · Jan 2025
· source
· release history
command line
reject — Reject a pending authentication request
v0.29.0-beta.1 · May 2026
· command-line history
example
Approve a pending SSH check-mode or web auth request identified in server logs, granting the user access without re-keying.$ headscale auth approve --auth-id <id>
v0.29.0 · Jun 2026
· source
Approve a pending SSH check-mode authentication request from the CLI without waiting for OIDC.$ headscale auth approve --auth-id <id>
v0.29.0 · Jun 2026
· source
+ACL wildcard and autogroup semanticsshippedControls how wildcards and built-in autogroups are resolved in ACL rules, keeping behaviour consistent with Tailscale's own validation logic.6 releases · first seen Oct 2025▸
release
BREAKING: autogroup:self destinations now reject tags, hosts, and IPs as sources, matching Tailscale validation.
v0.29.0 · Jun 2026
· source
· release history
Introduces autogroup:danger-all as a source-only ACL target resolving to all IPs (0.0.0.0/0 and ::/0), replacing the prior behavior of wildcard *.
v0.29.0 · Jun 2026
· source
· release history
Adds autogroup:danger-all as a source that resolves to 0.0.0.0/0 and ::/0 for policies that need to match all IPs including non-Tailscale addresses.
v0.29.0 · Jun 2026
· source
· release history
Policies using tags, hosts, or IP addresses as sources for autogroup:self destinations now fail validation
v0.29.0 · Jun 2026
· source
· release history
Wildcard (*) in ACL sources and destinations now resolves to the Tailscale CGNAT range (100.64.0.0/10) and ULA range (fd7a:115c:a1e0::/48) instead of all IPs (0.0.0.0/0 and ::/0); policies relying on * to match all IP addresses must switch to autogroup:danger-all (source only) or explicit CIDR ranges…
v0.29.0 · Jun 2026
· source
· release history
Adds experimental support for autogroup:self autogroup (may be expensive on large installations; report bugs).
v0.27.0 · Oct 2025
· source
· release history
+Version and Upgrade Lifecycle2 capabilitiesHeadscale enforces a controlled upgrade path for the server itself and sets a floor on which client versions are permitted to join the tailnet. This prevents skipped releases, downgrades, and connections from outdated clients.▸
+Minimum Tailscale client version enforcementshippedRejects Tailscale clients that fall below the minimum supported version from connecting to the tailnet.7 releases · first seen Jan 2025▸
release
7 total
Minimum supported Tailscale client version is now v1.80.0.
v0.29.0 · Jun 2026
· source
· release history
Minimum supported Tailscale client version is now v1.80.0
v0.29.0 · Jun 2026
· source
· release history
Raises minimum supported Tailscale client version to v1.80.0.
v0.29.0 · Jun 2026
· source
· release history
The minimum supported Tailscale client version is now v1.74.0.
v0.28.0 · Feb 2026
· source
· release history
The minimum supported Tailscale client version is now v1.64.0.
v0.27.0 · Oct 2025
· source
· release history
Tailscale clients older than version 1.62 (capability version 87) are no longer supported and will not be able to connect.
v0.25.0 · Feb 2025
· source
· release history
+Upgrade path enforcementshippedPrevents operators from skipping minor versions during upgrades or rolling back to an earlier release.3 releases · first seen Jun 2026▸
release
Enforces a strict one-minor-version-at-a-time upgrade path; skipping minor versions or downgrading is now blocked at startup.
v0.29.0 · Jun 2026
· source
· release history
BREAKING: Headscale enforces a strict sequential upgrade path — skipping minor versions (e.g., 0.27 → 0.29) and downgrading are blocked.
v0.29.0 · Jun 2026
· source
· release history
Skipping minor versions (e.g. 0.27 → 0.29) is blocked; upgrades must proceed one minor version at a time, and downgrading to a previous minor version is blocked
v0.29.0 · Jun 2026
· source
· release history
+Client Configuration and Distribution1 capabilityHeadscale distributes tailnet-wide settings to connected clients, including whether those clients should update themselves automatically. These settings are pushed through the capability map rather than requiring per-device configuration.▸
+Client auto-update controlshippedSets a tailnet-wide default that controls whether Tailscale clients automatically update themselves.2 releases · first seen Jun 2026▸
release
Adds auto_update.enabled config option to set the tailnet-wide default for client auto-update via CapMap.
v0.29.0 · Jun 2026
· source
· release history
New auto_update.enabled config option sets the tailnet-wide default for client auto-update via CapMap.
v0.29.0 · Jun 2026
· source
· release history
+Server Startup and Configuration Integrity2 capabilitiesHeadscale validates its own configuration at startup and refuses to run when deprecated or removed keys are present. It also normalises node hostnames to avoid DNS collisions before nodes become reachable.▸
+MagicDNS hostname sanitisationshippedSanitises node hostnames into valid MagicDNS names, handling special characters, non-ASCII input, and duplicate name collisions consistently.7 releases · first seen Feb 2025▸
release
7 total
GivenName collision suffix changed from random 8-char hash to monotonic numeric suffix (laptop, laptop-1, laptop-2, …), matching Tailscale SaaS.
v0.29.0 · Jun 2026
· source
· release history
Hostname sanitisation now uses Tailscale's MagicDNS rules, allowing previously-rejected hostnames with apostrophes, special characters, and dots to register successfully.
v0.29.0 · Jun 2026
· source
· release history
Hostname sanitisation now uses Tailscale's MagicDNS rules, supporting hostnames with apostrophes, special characters, and non-ASCII characters.
v0.29.0 · Jun 2026
· source
· release history
Empty or all-non-ASCII hostnames now fall back to the literal node instead of invalid-<rand>
v0.29.0 · Jun 2026
· source
· release history
MagicDNS GivenName collision suffix changed from 8-char random hash (laptop-abc12xyz) to monotonic numeric suffix (laptop, laptop-1, laptop-2, …); MagicDNS names change on upgrade for any node whose previous label was a random-suffix form
v0.29.0 · Jun 2026
· source
· release history
Stricter hostname validation is enforced: hostnames must be 2–63 characters, alphanumeric and hyphens only, and cannot start or end with a hyphen.
v0.27.0 · Oct 2025
· source
· release history
+Server configuration validation on startupshippedRefuses to start if the configuration file contains deprecated or removed keys, prompting the operator to migrate them.5 releases · 1 other source · first seen Jul 2022▸
release
The randomize_client_port server-config key was removed; headscale refuses to start when the old key is present — the toggle must be moved to the policy file as the top-level randomizeClientPort field
v0.29.0 · Jun 2026
· source
· release history
BREAKING: randomize_client_port server-config key removed; headscale refuses to start if the old key is present — move it to the policy file.
v0.29.0 · Jun 2026
· source
· release history
Adds configtest CLI command to validate configuration files before starting
v0.21.0 · Mar 2023
· source
· release history
db_ssl defaults to false instead of previous default; if your database requires SSL, you must explicitly set db_ssl = true in your config file.
v0.18.0 · Jan 2023
· source
· release history
allow_random_port configuration key allowing Tailscale clients to use random WireGuard ports
v0.16.0 · Jul 2022
· source
· release history
example
Validate a configuration file without starting the server to catch syntax errors early$ headscale configtest --config /etc/headscale/config.yaml
v0.21.0 · Mar 2023
· source
+Other26 capabilities▸
+OIDC Authentication SupportshippedAdds beta support for OpenID Connect authentication for node registration.17 releases · 1 other source · first seen Dec 2021▸
release
17 total
Harden the OIDC callback: state and nonce cookies take their Secure flag from server_url so they survive a TLS-terminating proxy, a callback state is single-use, and an invalid oidc.issuer or a missing oidc.client_id/oidc.client_secret now fails at startup.
0.29.4 · Sep 2026
· source
· release history
Adds oidc.email_verified_required config option to control whether OIDC authentication requires a verified email address.
v0.28.0 · Feb 2026
· source
· release history
OIDC: Group claims are now sourced from UserInfo, and user details are updated from UserInfo claims before evaluating allowed groups, email, and domain.
v0.27.0 · Oct 2025
· source
· release history
OIDC integration now fetches UserInfo to populate email_verified, name, email, and username when the ID token omits them.
v0.26.0 · May 2025
· source
· release history
OIDC-managed users can no longer be renamed via OIDC.
v0.25.0 · Feb 2025
· source
· release history
Adds PKCE (Proof Key for Code Exchange) verifier support for OIDC authentication flows.
v0.24.0 · Jan 2025
· source
· release history
example
After upgrading, let legacy OIDC users log in automatically while migration runs, then lock it down once all accounts are migrated.$ # In your headscale config.yaml — keep migration on until all users have logged in: map_legacy_users: true # Once all users have authenticated, disable legacy matching: map_legacy_users: false
v0.24.0 · Jan 2025
· source
+Route Management EnhancementsshippedImproves route management with ptable support and batch enabling of advertised routes.8 releases · 5 other sources · first seen Aug 2021▸
Also counts toward: Command-line interface
release
8 total
The dedicated Route API and Route CLI (headscale routes …) have been removed; route management now goes through headscale nodes list-routes and headscale nodes approve-routes.
v0.26.0 · May 2025
· source
· release history
New headscale nodes list-routes command shows approved, available, and serving (primary) routes per node.
v0.26.0 · May 2025
· source
· release history
New headscale nodes approve-routes --identifier <id> --routes <cidrs> command replaces the old dedicated route API/CLI for managing node routes.
v0.26.0 · May 2025
· source
· release history
Allows deleting routes via the management API
v0.21.0 · Mar 2023
· source
· release history
Enable both exit node routes (IPv4 and IPv6) at the same time
v0.20.0 · Feb 2023
· source
· release history
Enables subnet router failover via a reworked routing implementation, allowing multiple routes to be active for redundancy
v0.18.0 · Jan 2023
· source
· release history
example
Approve specific routes (including dual-stack exit routes) for a node without touching the old route API.$ headscale nodes approve-routes --identifier 1 --routes 0.0.0.0/0,::/0
v0.26.0 · May 2025
· source
List all routes advertised by nodes and see which are approved and actively serving, so you can audit exit-node or subnet-router state at a glance.$ headscale nodes list-routes
v0.26.0 · May 2025
· source
Enable random IP allocation from separate v4/v6 prefix ranges instead of the old single ip_prefixes key.$ prefixes: v4: 100.64.0.0/10 v6: fd7a:115c:a1e0::/48 allocation: random
v0.23.0 · Sep 2024
· source
Delete a specific route from a node using the API endpoint$ curl -X DELETE http://localhost:8080/api/v1/routes/<route-id>
v0.21.0 · Mar 2023
· source
Enable every available advertised route at once without listing them individually.$ headscale routes enable --all
v0.7.0 · Aug 2021
· source
+Control Plane ArchitectureshippedProvides a self-hosted, open-source implementation of the Tailscale control server for managing a private Tailnet.11 releases · 1 other source · first seen Jun 2021▸
Also counts toward: Self-hosted deployment
release
11 total
Key expiry values outside the years 0–9999 UTC are now refused at registration, on the OIDC token-expiry path, and in headscale nodes expire / POST /api/v1/node/{node_id}/expire (HTTP 400).
v0.29.7 · Oct 2026
· source
· release history
Pending registration capacity is now bounded: pending interactive registrations and OIDC logins are kept at capacity rather than evicted, new requests get a retry response, registered nodes keep capacity for SSH checks, and stored pending registration data is capped at 64 KiB (keeping tags and expiry), with oversized…
v0.29.7 · Oct 2026
· source
· release history
Client reports are now bounded to the first 256 endpoints and 4096 announced routes, with oversized hostnames, requested tags, or other metadata returning a registration error or HTTP 413 on map updates and zoned IPv6 endpoints refused; at startup, Headscale trims stored hostnames, endpoints, and routes to these…
v0.29.7 · Oct 2026
· source
· release history
A stalled request body, or a Noise tunnel with no open request, is now closed after 30 seconds.
v0.29.7 · Oct 2026
· source
· release history
Re-registering an expired tagged node now requires a valid pre-auth key, and another user's key or login on a tagged machine now creates a new device for that user instead of re-authenticating the tagged node.
v0.29.7 · Oct 2026
· source
· release history
Unifies derp.yaml into the main config.yaml, eliminating the need for multiple configuration files
v0.11.0 · Oct 2021
· source
· release history
docs
Self-hosted, open source implementation of the Tailscale control server for managing a private Tailscale network.
+Node ManagementshippedProvides CLI commands to delete nodes from the network with interactive confirmation.7 releases · 3 other sources · first seen Jul 2021▸
Also counts toward: Command-line interface
release
7 total
Supports expiring nodes with a custom timestamp, enabling precise lifecycle control over node access.
v0.27.1 · Nov 2025
· source
· release history
A node re-registered with a different (new) user is now registered as a brand-new node rather than updating the existing node record — existing node identities tied to user changes will be affected.
v0.25.0 · Feb 2025
· source
· release history
Registering a node with a new user now creates a distinct new node instead of reusing an existing one.
v0.25.0 · Feb 2025
· source
· release history
headscale nodes move command to migrate nodes between namespaces
v0.16.0 · Jul 2022
· source
· release history
headscale tags create command to assign tags to a node
v0.16.0 · Jul 2022
· source
· release history
Adds --force flag to the node delete CLI subcommand to allow forced deletion of nodes.
v0.10.3 · Oct 2021
· source
· release history
example
Migrate a node from one namespace to another via CLI$ headscale nodes move <node-key> --dest-namespace <target-namespace>
v0.16.0 · Jul 2022
· source
Forcefully remove a node from the network regardless of its current state or locks.$ headscale node delete <node-id> --force
v0.10.3 · Oct 2021
· source
Remove a node from the network after interactive confirmation is provided.$ headscale node delete <node-key-or-name>
v0.3.5 · Jul 2021
· source
+Health Check EndpointshippedExposes an HTTP health endpoint to verify if the Headscale service is responding correctly.6 releases · 1 other source · first seen Aug 2021▸
release
Adds headscale_mapper_changes_dropped_total and headscale_ha_health_updates_total Prometheus counters to track dropped map updates and health probe no-ops.
0.29.4 · Sep 2026
· source
· release history
Adds headscale_mapper_changes_dropped_total and headscale_ha_health_updates_total Prometheus metrics to track suppressed no-op map updates.︀︄︇︀︅︉︀︅︀︀︃︀︀︅︅︀︅︊︀︄︆︀︃︄
v0.29.4 · Sep 2026
· source
· release history
Adds real-time update delivery via go channels (notifier package), replacing fixed-interval polling for lower-latency propagation to connected clients.
v0.23.0 · Sep 2024
· source
· release history
Supports delta network map updates — nodes now receive only changed/added/removed node info instead of full network state on every update.
v0.23.0 · Sep 2024
· source
· release history
Supports manual DERP map entry creation with custom configuration instead of automatic generation only.
v0.23.0 · Sep 2024
· source
· release history
/health HTTP endpoint added to the service
v0.6.0 · Aug 2021
· source
· release history
example
Check if the Headscale service is responding correctly by querying the health endpoint.$ curl http://<host>:<port>/health
v0.6.0 · Aug 2021
· source
+Pre-auth Key ManagementshippedAllows expiring specific pre-auth keys via CLI commands.5 releases · 1 other source · first seen Aug 2021▸
Also counts toward: Command-line interface
release
The pre-auth key API now returns a full user object instead of a username string.
v0.26.0 · May 2025
· source
· release history
The pre-auth key API/CLI now uses the numeric ID instead of username to identify keys.
v0.26.0 · May 2025
· source
· release history
Pre-auth keys belonging to a user are no longer deleted when the user is deleted.
v0.25.0 · Feb 2025
· source
· release history
Pre-auth keys actively used by a node can no longer be deleted.
v0.25.0 · Feb 2025
· source
· release history
headscale expire subcommand allows expiring preauth keys via CLI
v0.6.0 · Aug 2021
· source
· release history
example
Expire a specific pre-auth key by its ID from the command line.$ headscale expire <key-id>
v0.6.0 · Aug 2021
· source
+Experimental SSH SupportshippedEnables experimental SSH ACLs via an environment variable configuration option.4 releases · first seen Nov 2022▸
release
Disable SSH agent and port forwarding on a node by setting TS_SSH_DISABLE_FORWARDING=1 in the tailscaled service environment; applies to all Tailscale SSH sessions on that node and works on older clients too.︀︄︇︀︅︉︀︅︀︀︃︀︀︅︅︀︅︊︀︄︆︀︃︄
v0.29.7 · Oct 2026
· source
· release history
Allows nodes to use SSH agent forwarding.
v0.24.0 · Jan 2025
· source
· release history
Adds Tailscale SSH support, enabling SSH access control through Headscale policy.
v0.23.0 · Sep 2024
· source
· release history
Added HEADSCALE_EXPERIMENTAL_FEATURE_SSH=1 environment variable to enable experimental SSH ACLs
v0.17.0 · Nov 2022
· source
· release history
+Prometheus Metrics ExportshippedExports Prometheus metrics to monitor control plane performance, including dropped map updates and HA health probe efficiency.2 releases · 2 other sources · first seen Sep 2026▸
release
Metrics are no longer exposed to unregistered clients through the Noise protocol and remain available only on the configured metrics_listen_addr; setting metrics_listen_addr to empty disables the listener entirely.
v0.29.7 · Oct 2026
· source
· release history
Added Prometheus metrics headscale_mapper_changes_dropped_total and headscale_ha_health_updates_total to monitor dropped map updates and health probe efficiency.
v0.29.4 · Sep 2026
· source
· release history
example
Restrict Headscale metrics so they are only reachable on the local management interface, not through the Noise protocol.$ metrics_listen_addr: '127.0.0.1:9090'
v0.29.7 · Oct 2026
· source
Monitor for dropped map updates or health probes to detect performance degradation.$ curl -s http://localhost:8097/metrics | grep 'headscale_mapper_changes_dropped_total\|headscale_ha_health_updates_total'
v0.29.4 · Sep 2026
· source
+Node TaggingshippedAllows administrators to create and list tags for nodes via CLI commands.3 releases · 1 other source · first seen Jul 2022▸
Also counts toward: Command-line interface, gRPC API support
release
Enables user-owned nodes to request tags at registration via --advertise-tags, with tags manageable post-registration via headscale nodes tag or the SetTags API.
v0.28.0 · Feb 2026
· source
· release history
headscale tags list command to view node tags
v0.16.0 · Jul 2022
· source
· release history
headscale tags create command to assign tags to a node
v0.16.0 · Jul 2022
· source
· release history
example
Register an infrastructure node as tagged (server identity) rather than user-owned using a tagged PreAuthKey.$ headscale preauthkeys create --reusable --tags tag:server
v0.28.0 · Feb 2026
· source
+Split DNS SupportshippedImplements per-node or per-ACL-based custom DNS resolver configuration.4 releases · first seen Aug 2021▸
release
Restores support for Override local DNS behaviour.
v0.26.0 · May 2025
· source
· release history
Allow split DNS configuration without requiring global nameservers
v0.20.0 · Feb 2023
· source
· release history
Add support for Split DNS implements per-node or per-ACL-based custom DNS resolver configuration.
v0.10.5 · Oct 2021
· source
· release history
Passes DNSConfig to nodes in MapResponse.
v0.7.1 · Aug 2021
· source
· release history
+MagicDNS Server CapabilityshippedEnables Headscale to act as a MagicDNS server, automatically resolving hostnames and generating search domains for the Tailnet.3 releases · 1 other source · first seen Oct 2021▸
release
Adds dns.extra_records_path configuration option for supplying additional DNS records.
v0.24.0 · Jan 2025
· source
· release history
MagicDNS: Enables Headscale to act as a MagicDNS server, allowing nodes in the Tailnet to resolve each other's hostnames automatically.
v0.10.0 · Oct 2021
· source
· release history
Adds automatic generation of MagicDNS search domains for any configured tailnet range (defaulting to 100.64.0.0/10).
v0.10.0 · Oct 2021
· source
· release history
example
Serve custom DNS records (e.g. internal service entries) by pointing Headscale to an external records file.$ # In your headscale config.yaml: dns: extra_records_path: /etc/headscale/extra_records.json
v0.24.0 · Jan 2025
· source
+Configuration Validation on StartupshippedRefuses to start or errors when invalid configuration is detected, including a dedicated CLI command for pre-flight checks.3 releases · first seen Mar 2023▸
Also counts toward: Command-line interface
release
OIDC issuer validation (oidc.issuer) and client credential checks (oidc.client_id, oidc.client_secret) now fail at startup, preventing silent misconfigurations in production environments.
v0.29.4 · Sep 2026
· source
· release history
New headscale policy check --file <file> command validates a policy file for errors before loading it.
v0.26.0 · May 2025
· source
· release history
Adds configtest CLI command to validate configuration files before starting
v0.21.0 · Mar 2023
· source
· release history
+Enhanced PreAuth Key ManagementshippedSupports managing PreAuth keys by ID, secures them with bcrypt hashing, and simplifies API usage by removing user-specific constraints.3 releases · first seen Jun 2021▸
release
Secures PreAuthKeys with bcrypt hashing; full key shown only once at creation, with prefix-only display (hskey-auth-{prefix}-***) when listing.
v0.28.0 · Feb 2026
· source
· release history
Introduces new key prefixes: hskey-auth-{prefix}-{secret} for PreAuthKeys, hskey-api-{prefix}-{secret} for API keys, and hskey-reg-{random} for web registration keys.
v0.28.0 · Feb 2026
· source
· release history
Adds support for ephemeral nodes using pre-auth keys that do not require re-authentication
v0.1.0 · Jun 2021
· source
· release history
+ACME Certificate ConfigurationshippedAllows specifying ACME email address and URL for automatic TLS certificate generation.3 releases · first seen Jun 2021▸
release
Embedded DERP server now requires a private key — add a filepath entry to derp.server.private_key_path in config.
v0.23.0 · Sep 2024
· source
· release history
Adds --acme-email and --acme-url configuration options to specify the ACME email address and URL for node registration
v0.9.3 · Oct 2021
· source
· release history
Adds support for automatic TLS certificates via Let's Encrypt (autocert)
v0.1.0 · Jun 2021
· source
· release history
+CLI JSON Output SupportshippedProvides structured JSON output for CLI commands and internal status queries to facilitate automation and scripting.3 releases · first seen Jun 2021▸
Also counts toward: Command-line interface, JSON data export
release
Disables the version check mechanism when JSON output format is requested, preventing unwanted version mismatch warnings during automated deletions.
v0.10.2 · Oct 2021
· source
· release history
Uses JSON output format for the internal tailscale status command instead of plain text.
v0.9.0 · Sep 2021
· source
· release history
Adds the --json flag to CLI commands to output results in JSON format
v0.1.0 · Jun 2021
· source
· release history
+SSH forwarding restrictionsshippedAllows operators to disable SSH agent forwarding and port forwarding on a node for all Tailscale SSH sessions, either via the `TS_SSH_DISABLE_FORWARDING` environment variable or ACL policy, to limit exposure on nodes accessible to untrusted users.1 release · 1 other source · first seen Oct 2026▸
release
Disable SSH agent and port forwarding on a node by setting TS_SSH_DISABLE_FORWARDING=1 in the tailscaled service environment; applies to all Tailscale SSH sessions on that node and works on older clients too.︀︄︇︀︅︉︀︅︀︀︃︀︀︅︅︀︅︊︀︄︆︀︃︄
v0.29.7 · Oct 2026
· source
· release history
example
Lock down SSH agent and port forwarding on a node exposed to untrusted users via Tailscale SSH.$ # In the tailscaled systemd service override or environment file: TS_SSH_DISABLE_FORWARDING=1
v0.29.7 · Oct 2026
· source
+File Transfer via MeshshippedEnables receiving files over the mesh network using Tailscale's Taildrop mechanism.2 releases · first seen Sep 2021▸
release
Adds taildrop.enabled configuration option to enable or disable Taildrop file sharing.
v0.28.0 · Feb 2026
· source
· release history
Adds taildrop support for receiving files over the mesh network
v0.9.1 · Sep 2021
· source
· release history
+Noise Protocol Key ManagementshippedProvides CLI commands to generate private keys and requires configuration of `noise.private_key_path` for the noise protocol.1 release · 1 other source · first seen Jan 2022▸
Also counts toward: Command-line interface
release
Adds a new keys generate subcommand to create a private key for headscale.
v0.12.4 · Jan 2022
· source
· release history
example
Generate a new private key for headscale from the command line.$ headscale keys generate
v0.12.4 · Jan 2022
· source
+DERP ConfigurationshippedConfigures DERP relay settings and TLS certificates for mesh network connectivity, consolidating settings into a single configuration file.2 releases · first seen Oct 2021▸
release
Bundles TLS certificates in the Docker image to allow fetching the DERP map directly from Tailscale
v0.11.0 · Oct 2021
· source
· release history
The separate derp.yaml file is removed; all DERP settings must now be defined in config.yaml according to the updated schema in /config-example.yaml
v0.11.0 · Oct 2021
· source
· release history
+Namespace ManagementshippedEnables administrators to create, list, unshare, and destroy namespaces for organizing nodes and access control.2 releases · first seen Jun 2021▸
Also counts toward: Command-line interface
release
Adds the headscale nodes unshare CLI command to remove a machine from a specific namespace
v0.10.4 · Oct 2021
· source
· release history
Adds new DestroyNamespace CLI subcommand to delete namespaces
v0.1.0 · Jun 2021
· source
· release history
+Database Backend ConfigurationshippedManages the underlying database backend, supporting SQLite as the default and allowing configuration of database file paths relative to the config directory.2 releases · first seen Jun 2021▸
release
The default database backend changed from PostgreSQL (implied by previous versions) to SQLite; previously deployed instances using PostgreSQL will need migration
v0.1.0 · Jun 2021
· source
· release history
The db_path configuration key is now interpreted as relative to the directory where the config file resides if not absolute
v0.1.0 · Jun 2021
· source
· release history
+Taildrive SupportshippedEnables file-sharing capabilities via Taildrive, configurable through policy using node attributes and grants.1 release · first seen Jun 2026▸
release
Taildrive file-sharing is now configurable through policy using drive:share/drive:access node attributes and tailscale.com/cap/drive grants.
v0.29.0 · Jun 2026
· source
· release history
+Route Type DistinctionshippedDistinguishes subnet routes from exit node routes internally to improve ACL granularity for exit node visibility.1 release · first seen Nov 2025▸
release
Distinguishes subnet routes from exit node routes internally, improving ACL granularity for exit node visibility.
v0.27.1 · Nov 2025
· source
· release history
+CLI gRPC CommunicationshippedAdds a gRPC server to Headscale for efficient CLI communication, replacing or supplementing previous transport methods.1 release · first seen Dec 2021▸
Also counts toward: gRPC API support
release
Adds a headscale gRPC server for CLI communication
v0.12.1 · Dec 2021
· source
· release history
+MagicDNS Configuration ValidationshippedEnforces that DNS servers are explicitly configured before MagicDNS can function, rejecting invalid configurations.1 release · first seen Oct 2021▸
release
Headscale will now reject MagicDNS configuration if no DNS servers are explicitly set up.
v0.10.0 · Oct 2021
· source
· release history
+TLS and HTTPS ConfigurationshippedConfigures the control plane server to serve HTTPS traffic using either manually provided certificates or automatic issuance via Let's Encrypt.1 release · first seen Jun 2021▸
release
Adds HTTPS support for the web endpoint with manually configured certificate and key files via config paths
v0.1.0 · Jun 2021
· source
· release history
Lines in monospace are the tool's own words: help text
parsed from its source, or an endpoint from its API document. Under
release, a line is our summary of a dated release. Under
docs, it is quoted from the tool's own documentation or
website. Each links back to the source it came from.
Command line
View
Source
No command matches.
load a captured run
composed command
No matchesTry a different search, or clear a filter to see more.
option surface across analysed releases
options at that releaseadded, per releaseremoved, per release
option
found in
since
description
No matchesTry a different search, or clear a filter to see more.
option changes per release — drag across the rail to set a range
→
Values are placeholders taken from each option’s declared default.
Nothing is executed here — the output shown is a recording of a run
that already happened.
Score card
Shipping velocityreleases a month, last 12 months
Documentation qualityrelease-notes rubric, 0–100
Breaking-change disciplinehow rarely a release breaks users, and notice given
Maintenance riskquiet time against its own cadence, maintainers
Innovation & surfacenew capabilities, API and MCP surface
Community health
Contributor trenddistinct committers, this year against last
Maintainer concentrationbus factor now against a year ago
Issue backlog trendissues closed per issue opened, 12 months
Responsivenessmedian time to a maintainer’s first reply
Nine scores for Headscale, each built from the releases, notes and API history this site tracks — and, on Researcher and Business, where it stands among every measured tool in its category and how that has moved.
Each score is 0–100 on a published rubric, derived from data this site already shows.
A dimension we cannot measure says so — it is never scored 0 and never enters a rank.
How this is scored
Shipping velocity — releases a month over the last 12 months, on a log scale where 16 a month scores 100. Needs 3 releases in the window.
Documentation quality — the release-notes rubric published on the analytics page, unchanged.
Breaking-change discipline — the share of releases carrying a breaking change (none scores 100, half or more scores 0). Only projects that label breaking changes are measured: a clean record cannot be told from an unlabelled one.
Maintenance risk — quiet time measured against the tool's own release cadence (quiet longer than 90 days and three typical gaps scores 0), plus the number of active maintainers and whether contributors are growing, where known. Higher is lower risk.
Innovation & surface — new capabilities in the feature ledger this year, API and MCP operations added, and the share of commits that are features: the mean of whichever we hold.
Community health (open-source tools only) — each is a direction, not a size: contributors this year against last, the bus factor now against a year ago, and issues closed per issue opened, where steady scores 50, doubled 100 and halved 0; plus the median time to a maintainer's first reply (an hour scores about 100, a month or more 0). A commercial card has no repository and carries none of the four.
Documented delivery (commercial tools) — when a vendor's documented new capabilities have slowed against its own baseline, that counts against the overall standing as heavily as two low dimensions. Steady delivery, or too little history to judge, leaves the standing alone; it is never a sixth score.
Open-source tools are scored on repository signals; commercial tools on their published changelog. Ranks compare tools within one category and one profile and need at least five measured peers; the overall standing needs three ranked dimensions. Best-in-breed or consolidator is a shape, not a quality, and is never scored.
Release-note detail over time
See how much detail Headscale puts in its release notes, quarter by quarter, and compare it with tracked tools in the same category. This history uses up to ten retained, reviewed notes per tool; sparse or blank older quarters may reflect that limit.
Issue, contributor and maintainer activity in juanfont/headscale, 2023-10 – 2026-09,
as of 2026-09-25. Twelve-month figures first; the trend lines run
the whole window.
Contributors52−6 vs prior 12 months
Maintainers2+0 joined · −1 left, last 12 months
Bus factor1committers behind half the commits
Community-filed84%of issues opened, last 12 months
Median time to close14 daysfirst maintainer reply 3.1 days
Open backlog76of 1,353 issues ever filed
Issues opened / month7 · 0communitymaintainers
Open backlog76
Contributors / month9
Commits / month54
Stars43,875
Issue themes, last 12 months
bugs 61%
features 26%
other 13%
Counts from the project's public repository and git history; no individuals
are identified. Maintainers are the committers covering 80% of the last year's
commits. how we measure this
Libraries its release ships
What its latest release locks, checked against known advisories.
None of its release's images build from a lockfile we can read.
Add the badge to your README
Maintain this project? The badge links readers straight to this page, so they can
follow every release here.