Technical Field NotesBack to articles
Self-hosted mesh operations · Updated September 15, 2026

Headscale 0.29.1: Preserving Users on null-Tagged Nodes

Headscale 0.29.1 is a one-line patch over 0.29.0: it stops nodes stored with tags='null' from losing their assigned user on upgrade. Here is the bug and who is affected.

Short answer: Headscale 0.29.1 is a small patch release with a single fix. It corrects a bug where nodes whose tags column was stored as the literal string 'null' lost their assigned user during an upgrade. The changelog entry is one line: it preserves the user_id on untagged nodes with tags='null'. The minimum supported Tailscale client remains 1.80.0, unchanged from 0.29.0. For an operator, the question is whether any node in your environment has a tags value of 'null' rather than being properly untagged, because that is the exact state this fix protects. If you are on 0.29.0 and have not seen a user-assignment problem after upgrading, the patch is still worth taking as a one-line correctness fix that removes a known data-loss path.

A one-line fix with a specific data-loss shape

0.29.1 is the kind of patch that is easy to skip because the release notes are one line, but the one line describes a data-loss path, which is the category of bug that makes a patch worth taking even when it is small. The shape of the bug is specific: a node whose tags column holds the string 'null' loses its user_id on upgrade. That is not a crash or a performance issue; it is a silent change to the identity of a node, which is exactly the kind of thing that is hard to notice in the moment and expensive to find later.

The operator value of the patch is that it closes that specific path. Once it is applied, a node in the tags='null' state keeps its user across the upgrade, which means the identity the node had before the upgrade is the identity it has after. For a mesh where node identity drives ACLs and access, preserving the user_id is preserving the access model, and that is why a one-line fix is the right shape for it.

How to check whether you are affected

The way to determine exposure is to look at the tags column of your nodes. If every untagged node has a true null or empty tags value, the bug does not apply to you and the patch is a no-op in practice, though still worth applying for correctness. If any node has the literal string 'null' as its tags value, that node is the one the fix protects, and it is the one you want to confirm keeps its user_id after the upgrade.

The practical check is a database query over the nodes table for the tags value, before the upgrade, so you know exactly which nodes (if any) are in the affected state. If the query returns nothing, you are not affected and the patch is a safe, no-risk correctness update. If it returns nodes, those are the ones to verify after the upgrade, and the verification is simply that their user_id is unchanged from the pre-upgrade value.

The minimum supported Tailscale client is 1.80.0, the same as 0.29.0. Because 0.29.1 is a one-line patch in the same minor line, the client floor does not change and the upgrade does not require a client-side update. The only thing that changes is the handling of the tags='null' state on the server.

The upgrade sequencing is the standard Headscale path, and it is worth doing it in the order that makes the verification clean. Back up the database before the upgrade, because even a one-line patch that touches node identity is a change to the data the server holds, and a backup is what makes a one-line patch reversible. Then apply the update, confirm the control server starts cleanly and the mesh re-converges, and only then run the tags-value query to confirm that any node in the affected state kept its user_id. Doing the backup first and the query after means you have a before-state to compare against, which is the difference between an upgrade you verified and one you assumed.

The reason a one-line fix still deserves this discipline is that the fix touches the part of the database that the rest of the ACL model depends on. A node's user_id is what links it to a user account, and that link is what the ACLs and the ownership checks use to decide what the node can do. If an upgrade silently drops that link, the node does not crash and does not report an error; it simply behaves as if it has no owner, which is the kind of regression that surfaces as a confusing access denial weeks later rather than as a failed upgrade in the moment. That is why the patch, the backup, and the before-and-after query are all part of the same step, not separate options.

Limitations

Related infrastructure context

For the physical layer around a systems deployment, TismTek provides fiber and network infrastructure work near Aurora. The team also documents on-premises compute and private AI systems. For a site discussion, call (720) 694-1976. See the Headscale registration and policy for recovery planning and the 3-2-1 backup strategy for the broader on-premises context.

Sources