-
released this
2025-12-18 12:42:32 +01:00 | 8 commits to main since this release📅 Originally published on GitHub: Thu, 18 Dec 2025 11:55:06 GMT
🏷️ Git tag created: Thu, 18 Dec 2025 11:42:32 GMTMinimum supported Tailscale client version: v1.74.0
Tags as identity
Tags are now implemented following the Tailscale model where tags and user ownership are mutually exclusive. Devices can be either
user-owned (authenticated via web/OIDC) or tagged (authenticated via tagged PreAuthKeys). Tagged devices receive their identity from
tags rather than users, making them suitable for servers and infrastructure. Applying a tag to a device removes user-based
ownership. See the Tailscale tags documentation for details on how tags work.User-owned nodes can now request tags during registration using
--advertise-tags. Tags are validated against thetagOwnerspolicy
and applied at registration time. Tags can be managed via the CLI or API after registration.Smarter map updates
The map update system has been rewritten to send smaller, partial updates instead of full network maps whenever possible. This reduces bandwidth usage and improves performance, especially for large networks. The system now properly tracks peer
changes and can send removal notifications when nodes are removed due to policy changes.
#2856 #2961Pre-authentication key security improvements
Pre-authentication keys now use bcrypt hashing for improved security #2853. Keys
are stored as a prefix and bcrypt hash instead of plaintext. The full key is only displayed once at creation time. When listing keys,
only the prefix is shown (e.g.,hskey-auth-{prefix}-***). All new keys use the formathskey-auth-{prefix}-{secret}. Legacy plaintext keys in the format{secret}will continue to work for backwards compatibility.Web registration templates redesign
The OIDC callback and device registration web pages have been updated to use the Material for MkDocs design system from the official
documentation. The templates now use consistent typography, spacing, and colours across all registration flows.Database migration support removed for pre-0.25.0 databases
Headscale no longer supports direct upgrades from databases created before version 0.25.0. Users on older versions must upgrade
sequentially through each stable release, selecting the latest patch version available for each minor release.BREAKING
- Tags: The gRPC
SetTagsendpoint now allows converting user-owned nodes to tagged nodes by setting tags. Once a node is tagged, it cannot be converted back to a user-owned node. #2885 - Tags: Tags are now resolved from the node's stored Tags field only #2931
--advertise-tagsis processed during registration, not on every policy evaluation- PreAuthKey tagged devices ignore
--advertise-tagsfrom clients - User-owned nodes can use
--advertise-tagsif authorized bytagOwnerspolicy - Tags can be managed via CLI (
headscale nodes tag) or the SetTags API after registration
- Database migration support removed for pre-0.25.0 databases #2883
- If you are running a version older than 0.25.0, you must upgrade to 0.25.1 first, then upgrade to this release
- See the upgrade path documentation for detailed guidance
- In version 0.29, all migrations before 0.28.0 will also be removed
- Remove ability to move nodes between users #2922
- The
headscale nodes moveCLI command has been removed - The
MoveNodeAPI endpoint has been removed - Nodes are permanently associated with their user at registration time
- The
Changes
- Smarter change notifications send partial map updates and node removals instead of full maps #2961
- Send lightweight endpoint and DERP region updates instead of full maps #2856
- Add
oidc.email_verified_requiredconfig option to control email verification requirement #2860- When
true(default), only verified emails can authenticate via OIDC withallowed_domainsorallowed_users - When
false, unverified emails are allowed for OIDC authentication
- When
- Add NixOS module in repository for faster iteration #2857
- Add favicon to webpages #2858
- Redesign OIDC callback and registration web templates #2832
- Reclaim IPs from the IP allocator when nodes are deleted #2831
- Add bcrypt hashing for pre-authentication keys #2853
- Add prefix to API keys (
hskey-api-{prefix}-{secret}) #2853 - Add prefix to registration keys for web authentication tracking (
hskey-reg-{random}) #2853 - Tags can now be tagOwner of other tags #2930
- Add
taildrop.enabledconfiguration option to enable/disable Taildrop file sharing #2955 - Allow disabling the metrics server by setting empty
metrics_listen_addr#2914 - Log ACME/autocert errors for easier debugging #2933
- Improve CLI list output formatting #2951
- Use Debian 13 distroless base images for containers #2944
- Fix ACL policy not applied to new OIDC nodes until client restart #2890
- Fix autogroup:self preventing visibility of nodes matched by other ACL rules #2882
- Fix nodes being rejected after pre-authentication key expiration #2917
- Fix list-routes command respecting identifier filter with JSON output #2927
Upgrade
Please follow the steps outlined in the upgrade guide to update your existing Headscale installation.
It's best to update from one stable version to the next (e.g., 0.24.0 → 0.25.1 → 0.26.1) in case you are multiple releases behind. You should always pick the latest available patch release.
Be sure to check the changelog above for version-specific upgrade instructions and breaking changes.
Backup Your Database
Always backup your database before upgrading. Here's how to backup a SQLite database:
# Stop headscale systemctl stop headscale # Backup sqlite database cp /var/lib/headscale/db.sqlite /var/lib/headscale/db.sqlite.backup # Backup sqlite WAL/SHM files (if they exist) cp /var/lib/headscale/db.sqlite-wal /var/lib/headscale/db.sqlite-wal.backup cp /var/lib/headscale/db.sqlite-shm /var/lib/headscale/db.sqlite-shm.backup # Start headscale (migration will run automatically) systemctl start headscaleChangelog
c4600346f9.github/workflows: prebuilt integration test artifacts (#2954)2c3c943acf.github/workflows: split long TestAutoApproveMultiNetwork into multiple jobs5655ef86d7AGENTS: golangci-lint from main, no "full matrix"249630bed8Add API documentation14af9b3ab1Add docs to manage headscale from another local user21af106f68Containers should be read-onlya288f04a1aDockerfile: align packages9c33cbfdc8Exclude docs/ only for prettier pre-commit hook665cc44094Explicitly dropapt-get cleanand usedist-cleanc5133ee5d3Fix trailing whitespace5c6cd62df1Legacy preauthkeys must be used as-ise86d063056Mention /health instead of /windowsf00c412cdeMove static doc assets into docs/assets2010805712Provide Headscale's favicon at its expected place72d5fd04a7Remove duplicated documentation and link to getting started insteade0c9e18e22Update OIDC documentation for allowed groups filter9b327f6b56Update pre-commit-hooks6359511a62Use debian13 distroless imagesbba91a89beUse lists for integration docs218a8db1b9add favicon to webpages (#2858)6d24afba1cadd pre-commit hooks, move claude to agents. (#2877)0e1673041call: remove deadcode (#2952)56bec66a44app: only wire up debug server if set3cf2d7195aauth: ensure machines are allowed in when pak change (#2917)f3767dddf8batcher: ensure removal from batcher616c0e895dbatcher: fix closed panic7fb0f9a501batcher: send endpoint and derp only updates. (#2856)e8753619decapver: generate8394e7094acapver: update latest (#2774)5767ca5085change: smarter change notifications1dcb04ce9bchangelog: add changelog entry2aa5b8b68dchangelog: add entry for templates redesign705b239677changelog: prep for 0.27.2 rc3f0bfe28ccchangelog: prepare for 0.28.0 beta0078eb7790chore: fix filterHash to work with autogroup:self in the acls (#2882)f3f2d30004cli: better formatting of lists (#2951)16d811b306cli: remove node move command (#2922)ed78bf4b98cmd/hi: improve test cleanup to reduce CI disk usage (#2881)bfcd9d261dcmd/hi: reject if we are already running (#2919)4b25976288db: add comment to always check errors in migration1c146f70e9db: remove _schema from migration testsd2fcd5b95bdocs(tools): Add tailscale-exporterdaf9f36c78editorconfig: add basic editor config299cef4e99fix: free ips from usedIps ipset on DeleteNode5d0a6ab0e9fix: list-routes command now respects identifier filter with JSON output75e24de7bdflake: disable CGO in dev shellcf1ad47b42flake: remove hi from shell9368fee1c5generate: add new patches (#2921)87bd67318bgolangci-lint: use forbidigo to block time.Sleep (#2946)75247f82b8hscontrol/db: add init schema, drop pre-0.25 support (#2883)cb4d5b1906hscontrol/oidc: fix ACL policy not applied to new OIDC nodes (#2890)db293e0698hscontrol/state: make NodeStore batch configuration tunable (#2886)285c4e46a9hscontrol/templates: add Material for MkDocs design assets3ed1067a95hscontrol/templates: refactor to use CSS classes and embedded filesa496864762hscontrol: add template HTML consistency teste3ced80278hscontrol: consolidate assets into single package09c9762fe0hscontrol: convert BlankHandler to use elem-go1f5df017a1hscontrol: log acme/autocert errors (#2933)4e77e910c5hscontrol: use octal literal syntax in test21ba197d06integration: make entrypoint override more robusta50bd13930integration: prepare AutoApprove test for new tagsf67ed36fe2integration: replicate tag propagation issueeb788cd007make tags first class node owner (#2885)82d4275c3bmapper: correct some variable names missed from changec8376e44a2mapper: move tail node conversion to node type (#2950)eec196d200modernize: run gopls modernize to bring up to 1.25 (#2920)d14be8d43bnix: add NixOS module and tests (#2857)7be20912f5oidc: make email verification configurablef0e464dc36policy: add test to confirm group cant approve tag15c84b34e0policy: allow tags to own tags (#2930)9d77207ed8policy: clarify usernam resolve comment506bd8c8ebpolicy: more accurate node change000d5c3b0cprettier: use standard config for all files including changelog (#2879)22ee2bfc9ctags: process tags on registration, simplify policy (#2931)89285c317btemplates: migrate OIDC callback to elem-go251e16d772tools/capver: regenerate from docker tags642073f4b8types: add option to disable taildrop, improve tests (#2955)da9018a0ebtypes: make pre auth key use bcrypt (#2853)
Downloads
- Tags: The gRPC
mirror of
https://github.com/juanfont/headscale.git
synced 2026-01-11 11:50:30 +01:00