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.matchBlocksformat is deprecated and migrated automatically. -
The new
home-manager.startAsUserServiceoption 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.useDefaultMachineand 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>.serveoption can managerclone servesidecar services on both Linux and Darwin. On non-systemd platforms,programs.rclone.requiresUnitis read-only and alwaysnullbecause there is no systemd ordering unit to depend on. -
The Syncthing credentials flow now uses
services.syncthing.guiCredentialsinstead of the removedservices.syncthing.passwordFileoption. -
Firefox extensions are now managed per-profile through the
programs.firefox.profiles.<name>.extensions.packagesandprograms.firefox.profiles.<name>.extensions.settingsoptions. The top-levelprograms.firefox.extensions = [ ... ]list was removed; migrate it toprograms.firefox.profiles.<name>.extensions.packages. -
Thunderbird now supports
accounts.email.accounts.<name>.ews, theoutlook.office365.com-ewsaccount flavor, declarative language packs, and enterprise policies. Thunderbird accounts using theoutlook.office365.comflavor now default IMAP and SMTP authentication to OAuth2 when the account does not set an authentication method explicitly. -
A new
systemd.user.packagesoption provides a user-level equivalent ofsystemd.packagesfor 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 aswezterm.fontandwezterm.action.*can be embedded usinglib.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 fromprograms.anki.sync.*toprograms.anki.profiles."User 1".sync.*, andprograms.anki.sync.passwordFileis migrated toprograms.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, andprograms.antigravity), built from a sharedmkVscodeModulefactory. Each fork can now be configured independently and simultaneously. Users who previously selected a fork by settingprograms.vscode.packageshould migrate to the matching module; theprograms.vscode.pnameoption was removed. -
The AI coding-assistant modules (programs.claude-code.enable, programs.codex.enable, and programs.opencode.enable) now share a unified
contextoption for providing global instructions. The previous per-module options (claude-code.memory,codex.custom-instructions, andopencode.rules) are deprecated and migrated automatically. MCP server configuration viaprograms.mcp.serverswas also extended to more assistant and editor modules through anenableMcpIntegrationoption. -
The
programs.manmodule 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.extraLuaConfigoption was renamed to programs.neovim.initLua. Home Manager now writes generated Lua initialization to$XDG_CONFIG_HOME/nvim/init.luaby default. If you manage that file outside Home Manager, set programs.neovim.sideloadInitLua totrueto load the generated Lua through the Neovim wrapper instead. -
A new
sshAuthSockmodule manages theSSH_AUTH_SOCKenvironment variable. It is implicitly configured by the SSH-agent-providing modules (e.g.services.ssh-agent,services.gpg-agent). The oldservices.ssh-agent.enable{Bash,Zsh,Fish,Nushell}Integrationoptions were removed; shell initialization is now provided throughsshAuthSock. -
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.swwwmodule was renamed to services.awww.enable following the upstream project rename. Theenable,package, andextraArgsoptions are migrated automatically fromservices.swww.*toservices.awww.*. -
Several modules dropped their freeform
extraConfigescape hatches in favor of RFC 42-stylesettings:programs.aerospace.extraConfig(anduserSettings) andprograms.aria2.extraConfigwere removed.programs.mise.settingswas renamed toprograms.mise.globalConfig.settings. Theprograms.eww.configDirandprograms.eww.enable{Bash,Zsh,Fish}Integrationoptions were removed; use programs.eww.yuckConfig and programs.eww.scssConfig for declarative Eww config files. Theprograms.niriswitcheroptions were also removed. -
Darwin integration received several behavior changes. Home Manager launchd agents now wait for
/nix/storebefore starting and uselaunchctl bootout --waitwhen replacing agents. nix-darwin activations now propagate dry-run mode into Home Manager user activations. On Darwin, Home Manager also exportsTERMINFO_DIRSso 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-directorieswhen 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.
-
The gtk.gtk4.theme option does not mirror gtk.theme by default anymore.
-
The programs.zsh.dotDir option now defaults to the XDG configuration directory (usually
~/.config/zsh) when xdg.enable is true. -
The programs.yazi.shellWrapperName option now defaults to
yinstead ofyy. -
The xdg.userDirs.setSessionVariables option now defaults to
falseinstead oftrue. -
The xdg.userDirs.extraConfig option no longer accepts keys of the form
XDG_<name>_DIR, they should be now be just the name. For example, if you had the keyXDG_DESKTOP_DIRbefore, you should now use the keyDESKTOP. Home Manager 26.05 introduced a warning when theXDG_<name>_DIRform is used. -
The programs.man.package option now defaults to
nullon Darwin because the GNUmanfrom nixpkgs shipsapropos/man -kandwhatis/man -fbinaries that don’t work on Darwin. Nix-installed manual pages still work with macOS’s built-inmanvia home.extraOutputsToInstall. -
The options programs.neovim.withPython3 and programs.neovim.withRuby now default to
falsefollowing nixpkgs. -
Neovim plugin
configfragments are assumed to be Lua by default throughprograms.neovim.plugins.<name>.type = "lua", instead of the previousvimldefault. -
On Linux,
programs.firefox.configPathnow defaults to"${config.xdg.configHome}/mozilla/firefox", instead of the legacy".mozilla/firefox". -
The wayland.windowManager.hyprland.configType option now defaults to
"lua", instead of the legacy"hyprlang". Setwayland.windowManager.hyprland.configType = "hyprlang"to keep generating$XDG_CONFIG_HOME/hypr/hyprland.conf. -
The programs.docker-cli.configDir option now defaults to
"${config.xdg.configHome}/docker"when xdg.enable is true, instead of~/.docker. Similarly, services.colima.profiles now sets$DOCKER_HOSTfor the default context. -
The services.home-manager.autoUpgrade.preSwitchCommands option now defaults to an empty list. Previously, when services.home-manager.autoUpgrade.useFlake was
true, it defaulted to[ "nix flake update" ]. SetpreSwitchCommands = [ "nix flake update" ]to keep updating flake inputs before each automatic switch. -
The programs.mergiraf.enableGitIntegration and programs.mergiraf.enableJujutsuIntegration options now default to
false, so the integrations must be enabled explicitly.