26.05

Release 26.05

We're excited to announce the 26.05 stable release of Clan!

Since the 25.11 release in December, 41 contributors landed 2,849 commits across 1,086 merged pull requests in clan-core — roughly six merged pull requests every day for five months.

Please read the Upgrade Steps and Breaking Changes before bumping clan-core.

As described in our branching policy, each stable release gets its own branch that receives backports for important bug fixes and security updates, but no breaking changes. Because this is a new stable release, it is the point at which breaking changes are allowed — and they are documented below with a clear migration path.

As always, users are expected to track the matching stable nixpkgs input branch.

Highlights

Safer machine updates

clan machines update now registers the new generation in the bootloader before activating it live. This guarantees the update survives a reboot even when live activation fails.

Previously, a blocked activation failed twice with an opaque error. Now Clan reports a clear message and tells you to reboot to apply the already-registered configuration.

Pass --no-check to force past inhibitors when you know it is safe. See the nixos-rebuild guide.

Activate a specialisation on update

clan machines update --specialisation <name> activates a specific NixOS specialisation instead of the default system. Use it to switch a machine between hardware or service variants. See the specialisations guide.

Vars prompts reuse previous values

Interactive vars prompts now keep the previous value by default. Clan only asks you to enter a new value when you pass --regenerate. This prevents clearing a secret by pressing enter, and fixes several multiline input bugs.

ZeroTier IP detection

Clan now detects ZeroTier machine IPs automatically. You no longer configure targetHost to reach a machine over the mesh.

ZeroTier also supports running more than one network per clan. This is a breaking change with a required migration — see Breaking Changes.

p2p-ssh-iroh management transport (experimental)

The new p2p-ssh-iroh service provides NAT-traversing SSH over encrypted QUIC, so clan machines update reaches a machine behind NAT or a firewall without port forwarding or a VPN. It ships commented out in the default templates.

This is the infra-management layer, separate from your service mesh: iroh carries operator traffic (clan machines update), while a mesh VPN connects machines so services can talk to each other. Our goal is to try iroh as the default management transport.

SSH agent forwarding

The new forwardAgent option forwards your SSH agent to managed machines. It is available on clan.core.networking and on inventory deploy, and is disabled by default.

Upgrade Steps

Bump your flake input

- inputs.clan-core.url = "https://git.clan.lol/clan/clan-core/archive/25.11.tar.gz";
+ inputs.clan-core.url = "https://git.clan.lol/clan/clan-core/archive/26.05.tar.gz";
inputs.nixpkgs.follows = "clan-core/nixpkgs";

Upgrade Zerotier

If you use ZeroTier, follow the ZeroTier migration guide

After bumping the clan-core version

  • Upgrade one non-critical machine first, ideally one that has fallback SSH access that does not go through ZeroTier.
  • Do not make unnecessary edits. The setup worked before the upgrade; keep changes minimal so you can isolate any problem.

Breaking Changes

ZeroTier now supports multiple instances

ZeroTier has been reworked to support multiple-instance setups, and network IDs and machine IPs are now coupled to the instance name. As a result, clan.core.networking.zerotier.* has been removed and existing setups require migration.

The full step-by-step procedure is documented in the ZeroTier migration guide. Follow it before upgrading.

sshd now issues host certificates by default

The sshd service now enables CA-signed host certificates by default and always uses your clan's internal domain (meta.domain from clan.nix) as a certificate search domain. Previously, the CA was only set up when you explicitly configured certificate.searchDomains.

As a consequence, the openssh-ca generator now exists for every clan that uses sshd. On the first upgrade you will likely see:

File 'id_ed25519.pub' of generator 'openssh-ca' does not exist.

Fix: Run clan vars generate, then deploy as usual.

clan flakes create got replaced by clan init

You can now create a new clan with clan init:

- clan flakes create my-clan
+ clan init my-clan

The cli guides you interactively through the most important steps.

clan vms removed

clan vms run and clan vms inspect have been removed, and vm is no longer a valid value for clan machines build --format. The vm vars backend was removed as well (see Vars Backends).

Important upstream breakages to know about

Clan is based on NixOS, therefore we inherit breaking changes from upstream. We do our best to prevent breakages and provide automated migrations and improved error messages. In rare occasions, however, you need to deal with upstream breakages directly.

systemd stage 1 (initrd) is now the default

This is the highest-risk change for remote, headless machines: a mistake here can leave a machine that only fails after a reboot, when you can no longer reach it. NixOS 26.05 makes the systemd-based initrd the default and deprecates the scripted implementation (removed in 26.11).

Most incompatibilities surface as evaluation-time assertions, but the following cannot be detected automatically:

  • LUKS-encrypted root: fileSystems."/".device must be /dev/mapper/<name>, where <name> matches your boot.initrd.luks.devices.<name> definition, or systemd times out waiting for the passphrase and the machine never boots. For LVM-on-LUKS and similar setups, add "x-systemd.device-timeout=infinity" to fileSystems."/".options instead.
  • Remote unlock over SSH: cryptsetup-askpass no longer exists. Use systemctl default, which prompts for passphrases as needed. If you pipe the passphrase over SSH, use ssh -o RequestTTY=force so systemctl default gets a TTY.
  • /dev/root is gone: the scripted initrd created it from the root= kernel parameter; the systemd initrd does not. Replace any /dev/root reference in fileSystems with a stable path such as /dev/disk/by-uuid/..., /dev/disk/by-label/..., or the matching /dev/mapper/....
  • Several kernel command-line parameters were renamed to their native systemd equivalents.

You can temporarily revert with boot.initrd.systemd.enable = false, but this is discouraged and the scripted implementation is removed in 26.11.

Default D-Bus implementation switched to dbus-broker

NixOS switched the default D-Bus implementation from dbus to dbus-broker. Because restarting D-Bus mid-session is unsafe, this is a switch inhibitor — the same upstream mechanism behind Safer machine updates. The first clan machines update after upgrading is expected to fail during live activation. This is not a failed deployment: the new generation is already registered in the bootloader, so reboot the machine to apply it. If you want to keep the old daemon set: services.dbus.implementation = "dbus";.

Default kernel updated from 6.12 to 6.18

Expect possible hardware, driver, and out-of-tree module regressions. reiserfs (removed in Linux 6.13) and ecryptfs are no longer available. ZFS users should note that Clan's installer already tracks the latest ZFS-compatible kernel.

fileSystems.<name>.fsType is now mandatory

The option no longer has a default value. Disko-managed disks and Clan's templates already set it, so most setups are unaffected — but hand-written fileSystems entries must now specify fsType explicitly.

networking.resolvconf.enable now defaults to true

It previously defaulted based on whether environment.etc."resolv.conf" was set. If you define environment.etc."resolv.conf" yourself, you must now also set networking.resolvconf.enable = false.

x86_64-darwin support dropped

Support for Intel-based macOS (x86_64-darwin) has been removed; its lifecycle ends after 26.05 in nixpkgs. Apple-silicon macOS (aarch64-darwin) remains supported. If you manage Intel Macs with Clan, pin to the 25.11 branch or migrate those hosts before upgrading.

CLI Changes

Beyond the command removals in Breaking Changes, several commands gained new flags and behavior

Most notably:

  • clan machines build gained --no-secrets, --no-sandbox, and --system
  • clan vars check and clan vars fix now accept zero or more machines. With no machine argument they operate on every machine in the clan.

Clan Community

Clan's architecture lets you write your own services, and the community services collection continues to grow.

Moved out of clan-core into clan-community:

  • coredns

New in clan-core:

  • dm-dns: Data-mesher based name resolution (dns)
  • ncps: Nix binary cache proxy service
  • pki: static certificates for clan services
  • p2p-ssh-iroh: Experimental iroh based ssh access
  • installer: Experimental turns a machine into an installation image

New in clan-community:

  • authelia: authentication and authorization server
  • desktop: desktop environment/wayland compositor setup
  • dm-pull-deploy: pull-based deployment via data-mesher
  • dm-wireguard-star: data-mesher WireGuard star topology
  • localsend: share files on the local network
  • mosquito: MQTT broker
  • punchcard: time tracking service
  • webapps: web application hosting service
  • wireguard-star: WireGuard VPN in star topology

Vars Backends

The set of vars backends has changed:

  • Added: age (experimental)
  • Removed: fs, vm

Note: All clan.core.vars changes in this release — including the new recipients settings and age.secretLocation — are experimental and subject to change without a guaranteed migration.

Configurable secret recipients (experimental)

The new vars.settings.recipients options (available on both clan.core and the flake) let you declare who is able to decrypt your generated secrets, giving you direct control over secret access across the clan. Like the rest of the clan.core.vars changes above, this is experimental and very likely to be refactored in the next release — expect the interface to change, with no guaranteed migration.

Exports

Exports have been refactored. Services now declare what they export under manifest.out. Exports remain experimental — we're still collecting real-world feedback before stabilizing them. The available modules are:

ModuleStatus
peerRefactored (since 25.11)
networkingRefactored (since 25.11)
dataMesherNew
endpointsNew
generatorsNew
authNew

Services

The table below lists every service shipped in clan-core for 26.05: its stability, whether it changed since 25.11, and a summary of the change. Services marked Experimental may change without a guaranteed migration. See the Clan Community section for services that moved out of clan-core.

ServiceStatusChangedWhat changed
adminDeprecatedNo
borgbackupStableNo
certificatesExperimentalNo
data-mesherExperimentalYesNew roles bootstrap, default
dm-dnsExperimentalNewNew service: data-mesher based DNS zone propagation
dyndnsStableYesextraSettings now accepts string, integer, or boolean
emergency-accessStableNo
garageStableNo
hello-worldExperimentalNo
importerStableNo
installerExperimentalNewNew service: turns a machine into an installation image
internetExperimentalYesAdded port, user settings; exports networking, peer
kdeStableNo
localbackupStableNo
matrix-synapseStableNo
monitoringExperimentalYesAdded roles client, server; removed role telegraf
myceliumStableYesExports networking, peer
ncpsStableNewNew service: Nix binary cache proxy
p2p-ssh-irohExperimentalNewNew service: iroh-based NAT-traversing SSH
packagesStableNo
pkiStableNewNew service: static certificates for clan endpoints
sshdStableYesAdded authorizedKeys, certificate.enable, generateRootKey (server role)
syncthingStableNo
torExperimentalYesExports networking, peer
trusted-nix-cachesStableNo
usersStableYesAdded identity, openssh.authorizedKeys.*, systemUser; exports auth
wifiStableNo
wireguardStableYesAdded mtu (controller and peer); exports networking, peer
yggdrasilExperimentalYesAdded ports.*, multicastInterfaces, extraYggdrasilIPs; removed extraMulticastInterfaces; exports networking, peer
zerotierStableYesReworked for multiple instances (breaking); added allowedIds, public; exports networking, peer
corednsMovedYesMoved to clan-community

Option Changes

clan.core options

Added (7):

  • clan.core.image.iso.addFilesScript
  • clan.core.networking.forwardAgent
  • clan.core.networking.internalListenAddresses
  • clan.core.vars.age.secretLocation
  • clan.core.vars.settings.recipients
  • clan.core.vars.settings.recipients.default
  • clan.core.vars.settings.recipients.hosts

Removed (17):

  • clan.core.networking.zerotier.*
  • clan.core.vars.globalSettings.*

clan (flake) options

Added (6):

  • deprecatedModules
  • inventory.machines.<name>.deploy.forwardAgent
  • vars.settings.recipients
  • vars.settings.recipients.default
  • vars.settings.recipients.hosts
  • varsDirectory

Removed (14):

  • outputs.moduleForMachine

Templates

The bundled flake templates (clan templates) changed as follows.

Disk templates

disko/single-disk was renamed to disko/ext4-single-disk, and three Btrfs-based schemas were added.

Added (4):

  • disko/btrfs-single-disk-subvolumes: single disk schema with Btrfs subvolumes and automated btrbk snapshots
  • disko/btrfs-single-disk-subvolumes-impermanance-rollback: Btrfs subvolumes with a Btrfs-based ephemeral root (rollback) and automated btrbk snapshots
  • disko/btrfs-single-disk-subvolumes-impermanance-tmpfs: Btrfs subvolumes with an ephemeral tmpfs root and automated btrbk snapshots
  • disko/ext4-single-disk: classic GPT layout with an ext4 root filesystem (renamed from disko/single-disk)

Removed (1):

  • disko/single-disk: renamed to disko/ext4-single-disk

Machine templates

Removed (2):

  • machine/demo-template
  • machine/test-morph-template

Clan templates

All clan templates were modernized and better integrated into the quick-start and clan-cli:

  • The starter inventory now ships sshd, users, p2p-ssh-iroh, and an installer service.
  • admin, zerotier, and tor dropped.
  • Introduced magic placeholders {{name}}/{{domain}}.
  • x86_64-darwin was dropped from the default systems.

Chores

clan.core.clanPkgs

Most packages have been removed from clan.core.clanPkgs — they were never intended for downstream usage. What remains:

  • zerotier-members
  • zerotierone

clanPkgs itself will be removed in the next release.

Thanks

This release is the work of everyone who reported issues, reviewed pull requests, wrote documentation, and shipped code. Thank you to all who made 26.05 happen — from the people who landed hundreds of commits to those who fixed a single typo. Every contribution counts.

Release managers: @hsjobeki, @enzime