Hey there, 0.7.0-beta.2 is finally out. It just makes some changes to the first beta, fixing some issues and also bringing some other changes in. Notably, we've redone how the SSH module works, so it should be more stable now.
Important Things
oidc.headscale_api_keyis now deprecated in the config, the new field to put this value in isheadscale.api_key(andheadscale.api_key_path). The deprecated fields will be fully removed in the future.- The Headplane agent only supports Headscale 0.28+. I've switched it to use the ACL tags model where it isn't associated with a user, and this functionality is only recently supported by Headscale.
- Authentication has been reworked. OIDC logged-in users in Headplane are now connected to Headscale users through a multi-step matching process:
- First, we try to match via OIDC linking.
- Then, we try matching based on the user's email addresses.
- Finally, we allow the user to manually pick their username from the list of "unclaimed" users on Headscale.
- This should result in a much more intuitive onboarding experience.
Changes
- Rebuilt the Browser SSH feature
- Should now work with custom DERP ports and properly handle sessions.
- Switched to using
libghosttyfor a proper, modern terminal experience (closes #515). - Added more resilient error handling and state handling when initiating connections.
- Migrated all UI components from react-aria/react-stately to @base-ui-components/react.
- Removed
react-aria,react-stately, andtailwindcss-react-aria-componentsas dependencies.
- Removed
- Replaced
openid-clientwith a clean-room OIDC implementation. - Rearchitected the Headplane Agent with a new sync model (closes #350, closes #455).
- The Go binary connects to the Tailnet and fetches all peer hostinfo as JSON.
- The Node.js manager auto-generates ephemeral tag-only pre-auth keys (requires Headscale 0.28+).
- Deprecated
integration.agent.pre_authkeyandintegration.agent.cache_pathconfig fields. - Added
integration.agent.executable_pathconfig field.
- Consolidated the Headscale API key under
headscale.api_key(andheadscale.api_key_path).- Deprecated
oidc.headscale_api_key— it is still read as a fallback but will be removed in a future release. - Both the agent and OIDC now use the same key from
headscale.api_key.
- Deprecated
- Reworked the authentication system with a new
AuthServicethat consolidates session management and role enforcement (via #489). - Added an agent status page at
/settings/agentshowing sync status, node count, errors, and a "Sync Now" button. - Added additional machine list filters for user, tag, status, and route (via #507, closes #506).
- Added self-service pre-auth key creation for auditor role users (via #478, closes #453).
- Store OIDC profile pictures in the database to prevent cookie header overload (closes #326, via #510).
- Fixed pre-auth key expiration on Headscale 0.28+ (closes #519).
- Fixed OIDC subject matching for providers that use special characters in user IDs (e.g. Auth0
github|12345) (closes #428). - Fixed
headscale.api_keynot being used consistently across all code paths. - Fixed intermittent SSR crash on the Access Control page caused by client-only CodeMirror imports.
- Fixed first user not being assigned the owner role on OIDC login (via #480, closes #266).
- Fixed login errors throwing an unexpected server error instead of showing form validation (via #475, closes #474).
- Fixed agent HostInfo not refreshing periodically using
cache_ttl(via #477, closes #427). - Fixed agent working directory being wiped on restart.
- Fixed a race condition where the SSE controller could be used after being closed.
- Rewrote the WebSSH WASM module to match Tailscale's proven
tsconnectinit sequence.- Switched the terminal renderer from xterm.js to restty (Ghostty WASM).
- Bundled self-hosted JetBrains Mono Nerd Font with Nerd Fonts symbol fallback — no CDN dependency.
- Fixed SSH sessions failing with EOF: the SSH channel multiplexer was not receiving server traffic.
- Fixed terminal resize sending swapped rows/cols, causing garbled output on window resize.
- Fixed
log.Fatal()calls in the WASM bridge killing the entire runtime on recoverable errors. - Fixed
Close()returningtrueon error andfalseon success. - Fixed stale closure bug in the NodeKey tracking callback.
- Removed unnecessary
LoginDefaultandLocalBackendStartKeyOSNeutralcontrol flags. - Added cancellation support for in-flight SSH connections on close.
- Fixed WebSSH dropping DERP port information on non-standard ports (e.g.
:8443), which caused connections to fail (closes #515). - Fixed WebSSH WASM prefix paths for correct asset loading (closes #386).
- Fixed Nix WASM build applying DERP patch to wrong vendor directory.
- Fixed Dockerfile WASM copy paths.
- Fixed CodeMirror version mismatch override in the ACL editor.
- Fixed cookie secret generation using incorrect byte length (via #501).
- Fixed OIDC configuration error troubleshooting link (via #518, closes #517).
- Fixed deprecated Nix package attributes (via #521).
- Detect unsupported Docker API versions early with a clear error message (via #497).
- Updated NixOS module options: removed deprecated agent fields, added
headscale.api_key_pathandintegration.agent.executable_path.
New Contributors
- @dixi83 made their first contribution in #488
- @mrangger made their first contribution in #497
- @dotWee made their first contribution in #500
- @AgathaSorceress made their first contribution in #501
- @lloydowen made their first contribution in #510
- @siemenvdn made their first contribution in #507
- @sinanmohd made their first contribution in #521
- @Kroppeb made their first contribution in #518
Full Changelog: v0.7.0-beta.1...v0.7.0-beta.2