Release Notes for v0.78.0
Highlights
- Rosenpass now works through the embedded reverse proxy (#6763). Until now the proxy ran no
Rosenpass at all, so peers with Rosenpass enabled failed to establish through it on a PSK
mismatch — an incompatibility that was never documented. The proxy now runs Rosenpass in
permissive mode, so it connects both to Rosenpass-enabled peers and, exactly as before, to
peers without it.NB_PROXY_ROSENPASS=falseturns it off. - Lazy connections reworked: per-peer lazy state, proxy peers lazy by default, and the lazy
exclusion list removed (#6762, #6763). - Agent Network / LLM gateway: agentgateway integration, access roles and self-service
endpoints, Bedrock model discovery served from the control plane, guardrail allowlists for
declared model ids, and the endpoint conformed to the LLM gateway protocol
(#7274, #7221, #7250, #7239, #7154, #7389, #7246). - DNS on Windows: a catch-all NRPT rule when NetBird is the primary resolver (#7071), closing
the leak/poisoning window towards the system resolvers. - Local Prometheus metrics endpoint on the client (#6689).
- Go 1.26 and
go-quicv0.62.0 across client, relay and management (#7359). - Unified ACL filtering for peers and routes, with multi-source rules (#6322). An internal
refactor: no change is expected for standard deployments. - Ukrainian localization for the desktop client (#7035).
Behaviour changes
- Remote jobs (remote debug bundle and friends) are now behind an admin opt-in, with MDM
support (#7153). Anyone using them without the opt-in has to enable it. - Remote debug bundle jobs accept an anonymization level and an upload URL (#7147).
- The client stays connected during the
logincommand (#7384). - Logging out of the active profile is allowed even when profiles are disabled (#7360).
- Profiles resolve for the invoking
sudouser rather than forroot(#7238). - NetBird traffic stays out of third-party fwmark rules (#7314).
- GUI windows are created on demand and destroyed on close (#7096).
- Android split tunnelling: the mode is typed rather than stored as a string, and settings are
kept per profile (#7387, #7349).
Security / hardening
- The cached SSH JWT is bound to the local caller that obtained it (#7378).
- The WireGuard key is no longer logged on a parse failure (#7379).
- The client asks the OS for privileges when a guarded SSH setting is changed (#7066).
- The proxy validates header auth (#7263).
- Management checks a provider's URL and credential before saving them (#7301).
- Clarified that
X-Peer-IDon metrics ingest is not a credential (#7363). - The old
math/randlibrary is gone from management (#6836).
Client — fixes
- Fixed the ICEBind races that wedge interface creation (#7377).
agentConnectingis dropped whenever the ICE session state clears (#7327).- A peer offer or answer arriving before the handshaker starts listening is held rather than lost
(#7255). - Connections are swept on network loss through a shared netevents manager (#7254).
- Route selection survives an invalid request and is applied on a partial one (#7292).
- The session-expiration dialog closes only on renewal (#7337).
- A still-locked updater binary is tolerated when cleaning up after an update (#7286).
- Fixed context cancellation during restart on iOS (#7329).
- iOS SSO logins reuse the profile's account (#7193).
- The iOS profile manager was migrated from Swift to Go (#6528).
- The PCP implementation moved to the go-nat fork (#7282).
- Reverted multi-buffer support declared for the loopback XDP program (#7303).
- The Android TUN is renewed only when the routes it carries actually change (#7396).
- Overlay listeners are rebuilt when the TUN is renewed (#7397).
- The remote jobs opt-in is exposed in the Android and iOS SDK preferences (#7406).
Management — fixes
- Fixed geolocation panics (#7382).
- Fixed private services calculation on the new db path (#7383).
- Fixed posture check evaluation for direct peers in policy definitions (#7348) and the affected
peers calculation on a posture check flip (#7347). - Handled the nil pointer in
sendInitialSync()when the peer has been deleted (#7315). - Network map from the nmap data type (#6919).
Self-hosted / infrastructure
- Better domain, Docker Compose and license validation in the self-hosted scripts (#7339).
- The dashboard wasm client bump is triggered by release tags (#7277).
- Protobuf breaking-change checks in CI (#7305).
- Pinned the toolchain
gomobile initneeds for gobind (#7291). - Removed the mobile build validation workflow (#7302).
Upgrade notes
- Remote debug bundles now require an explicit opt-in (#7153). Bundles requested by the
management server no longer run on a peer unless remote jobs are enabled there, with
--allow-remote-jobson the client or theallowRemoteJobsmanaged setting. Deployments
relying on management-triggered debug bundles must opt in before they work again. The upload
destination can now be pinned by the operator, with MDM taking precedence over the
management-supplied value (#7147). - The embedded proxy now runs Rosenpass in permissive mode (#6763). Peers with Rosenpass enabled
can now use the reverse proxy, which previously failed on a PSK mismatch; peers without
Rosenpass keep connecting exactly as before.NB_PROXY_ROSENPASS=falsedisables it. - Proxy peers now default to lazy connections (#6762).
Nothing else requires action.
Full Changelog: v0.77.1...v0.78.0