Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Release 26.05

The 26.05 release branch became stable in May, 2026.

Highlights

This release has the following notable changes:

  • Home Manager now supports RFC 42-style SSH configuration through programs.ssh.settings. The legacy programs.ssh.matchBlocks format is deprecated and migrated automatically.

  • The new home-manager.startAsUserService option runs user activation on demand at login instead of doing all setup during system boot, which helps on systems where home directories are mounted later (for example, pam_mount).

  • New options were added for services.podman.useDefaultMachine and podman machine management on Darwin.

  • The programs.rclone.enable module now supports launchd-backed config, mount, and serve agents on Darwin. The new programs.rclone.remotes.<name>.serve option can manage rclone serve sidecar services on both Linux and Darwin. On non-systemd platforms, programs.rclone.requiresUnit is read-only and always null because there is no systemd ordering unit to depend on.

  • The Syncthing credentials flow now uses services.syncthing.guiCredentials instead of the removed services.syncthing.passwordFile option.

  • Firefox extensions are now managed per-profile through the programs.firefox.profiles.<name>.extensions.packages and programs.firefox.profiles.<name>.extensions.settings options. The top-level programs.firefox.extensions = [ ... ] list was removed; migrate it to programs.firefox.profiles.<name>.extensions.packages.

  • Thunderbird now supports accounts.email.accounts.<name>.ews, the outlook.office365.com-ews account flavor, declarative language packs, and enterprise policies. Thunderbird accounts using the outlook.office365.com flavor now default IMAP and SMTP authentication to OAuth2 when the account does not set an authentication method explicitly.

  • A new systemd.user.packages option provides a user-level equivalent of systemd.packages for installing unit files from packages.

  • WezTerm now supports declarative configuration via programs.wezterm.settings. Settings are expressed as a Nix attribute set and serialized to Lua using lib.generators.toLua. Raw Lua expressions such as wezterm.font and wezterm.action.* can be embedded using lib.generators.mkLuaInline. The existing programs.wezterm.extraConfig option remains fully supported and can be combined with programs.wezterm.settings.

  • The programs.anki.uiScale option now expects a value in the range 1.0–2.0, previously it erroneously expected values in the range 0.0–1.0. Anki sync options moved from programs.anki.sync.* to programs.anki.profiles."User 1".sync.*, and programs.anki.sync.passwordFile is migrated to programs.anki.profiles."User 1".sync.keyFile.

  • New home.services namespace for nixpkgs modular services. Service modules shipped with packages (e.g. pkgs.<name>.passthru.services.default) drop in unchanged and are lifted to user systemd units. See Modular Services for details.

  • Dedicated modules were added for several VSCode forks (programs.cursor, programs.vscodium, programs.windsurf, programs.kiro, and programs.antigravity), built from a shared mkVscodeModule factory. Each fork can now be configured independently and simultaneously. Users who previously selected a fork by setting programs.vscode.package should migrate to the matching module; the programs.vscode.pname option was removed.

  • The AI coding-assistant modules (programs.claude-code.enable, programs.codex.enable, and programs.opencode.enable) now share a unified context option for providing global instructions. The previous per-module options (claude-code.memory, codex.custom-instructions, and opencode.rules) are deprecated and migrated automatically. MCP server configuration via programs.mcp.servers was also extended to more assistant and editor modules through an enableMcpIntegration option.

  • The programs.man module was split so the man viewer can be selected through the programs.man.man-db.enable and programs.man.mandoc.enable submodules, which are mutually exclusive.

  • The programs.neovim.extraLuaConfig option was renamed to programs.neovim.initLua. Home Manager now writes generated Lua initialization to $XDG_CONFIG_HOME/nvim/init.lua by default. If you manage that file outside Home Manager, set programs.neovim.sideloadInitLua to true to load the generated Lua through the Neovim wrapper instead.

  • A new sshAuthSock module manages the SSH_AUTH_SOCK environment variable. It is implicitly configured by the SSH-agent-providing modules (e.g. services.ssh-agent, services.gpg-agent). The old services.ssh-agent.enable{Bash,Zsh,Fish,Nushell}Integration options were removed; shell initialization is now provided through sshAuthSock.

  • A new services.pipewire.enable module provides client-side configuration for PipeWire, WirePlumber, and the PulseAudio/JACK compatibility layers. It does not install or manage the PipeWire daemon itself.

  • The services.swww module was renamed to services.awww.enable following the upstream project rename. The enable, package, and extraArgs options are migrated automatically from services.swww.* to services.awww.*.

  • Several modules dropped their freeform extraConfig escape hatches in favor of RFC 42-style settings: programs.aerospace.extraConfig (and userSettings) and programs.aria2.extraConfig were removed. programs.mise.settings was renamed to programs.mise.globalConfig.settings. The programs.eww.configDir and programs.eww.enable{Bash,Zsh,Fish}Integration options were removed; use programs.eww.yuckConfig and programs.eww.scssConfig for declarative Eww config files. The programs.niriswitcher options were also removed.

  • Darwin integration received several behavior changes. Home Manager launchd agents now wait for /nix/store before starting and use launchctl bootout --wait when replacing agents. nix-darwin activations now propagate dry-run mode into Home Manager user activations. On Darwin, Home Manager also exports TERMINFO_DIRS so terminfo entries from Home Manager-installed packages are visible to shells.

  • The nix.assumeXdg option was added for installations where Nix is configured to use XDG base directories outside Home Manager. Home Manager also detects osConfig.nix.settings.use-xdg-base-directories when deciding where to place declarative channel entries.

State Version Changes

The state version in this release includes the changes below. These changes are only active if the home.stateVersion option is set to "26.05" or later.