I went through the NixOS 25.11 release notes and picked some of the changes that I found particularly interesting. 🧵

#NixOS #nixpkgs

Some very useful options have been added to nixpkgs config:

nixpkgs.config.rewriteURL: Allows rewriting URLS downloaded by fetchurl, to configure company-internal mirrors, or work around company firewalls and similar networking restrictions.

nixpkgs.config.hashedMirrors: Allows setting content-addressed mirrors that fetchurl can fallback to if the primary URL is unavailable.

nixpkgs.config.{gitConfig, gitConfigFile}: Configures the default git config used by fetchgit. Can be used to point to local mirrors.

nixpkgs.config.npmRegistryOverrides: Configures NPM registry overrides for fetchNpmDeps.

fetchgit gained two new arguments: gitConfigFile to set a git config for an individual derivation, and rootDir to limit the resulting source to a subdirectory of the Git repository.

#NixOS #nixpkgs

This breaking change took me by surprise: Previously, there was a clear contract in nixpkgs that changes to the meta attribute of a packages wouldn't trigger a rebuild of the package itself. Changing meta.mainProgram could trigger rebuilds in downstream packages that used lib.getExe, but that was it.

With this version of NixOS, meta.mainProgram is exposed as environment variable NIX_MAIN_PROGRAM to the build environment. You should check downstream and remove existing overrides of meta.mainProgram, as these will trigger a rebuild of the package (and all its dependents) now.

#NixOS #nixpkgs

The format attribute on buildPythonPackage/buildPythonApplication is now mandatory.
Previously the default format used setuptools and called setup.py from the source tree. The modern alternative is to configure pyproject = true with build-system = [ setuptools ].

#NixOS #nixpkgs

Looking at the NixOS changelog for 25.11, here are some notable changes:

The ongoing work on interpreter-less NixOS has made some great progress:

nixos-init was added, a Rust-based bashless initialization system for systemd initrd. It can be enable via system.nixos-init.enable = true;.

The Perl implementation of the switch-to-configuration program was removed, all switchable systems now use the Rust rewrite. If you used system.switch.enableNg before, you must remove it from your configuration.

#NixOS #nixpkgs

Speaking about rewrites: nixos-rebuild-ng, a full rewrite of nixos-rebuild in Python, is enabled by default from this release. For 25.11, you can still opt out by setting system.rebuild.enableNg = false;. For the next major version of NixOS (26.05), that opt-out toggle will be removed.

#NixOS #nixpkgs

NixOS display manager modules now strictly use tty1, where many of them previously used tty7. Options to configure display managers' VT have been dropped. A configuration with a display manager enabled will not start [email protected], even if the system is forced to boot into multi-user.target instead of graphical.target.

This cause some issues for me using greetd with tuigreet where the systemd logs would clutter the tuigreet screen. Luckily, an option services.greetd.useTextGreeter was added to fix this.

#NixOS #nixpkgs

And finally, two new boot options:

boot.kernel.sysfs: Allows setting of Kernels sysfs attributes.

boot.initrd.nix-store-veritysetup: Enables nix-store-veritysetup, a systemd generator to unlock the Nix Store as a dm-verity protected block device.

I'm really interested to hear from you! What are your favorite new features in NixOS 25.11? Anything happened in the last release cycle that you are particularly excited about? Let me know!

🧵/end

#NixOS #nixpkgs

@katexochen I wonder if nixpkgs.config.rewriteURL can be used systemwide. I can put it in my flakes but only my fetchurl calls are affected.
@katexochen nobody noticed firewalld module was added 
@aleksana sorry, I actually had that on my list, but didn't know how to fit it in.