- Great modules for programs/services in NixOS and home manager. So I typically do not have to figure out what configuration format something uses. Most common options are exposed as module options and for options that are not exposed, it's often possible to write the configuration in Nix (or worst case a string that gets added to the configuration). I can access the documentation of all modules with a simple _man configuration.nix_ or `man home-configuration.nix`.
- I can override arbitrary packages with custom build options, etc. I don't have to maintain separate .spec/rules files or anything. I can just put a somePackage.override/overrideAttrs somewhere in my system configuration and the package customizations are there with my system configuration and always get built with the system.
- Packaging something to hook it up in my system is low-effort. nixpkgs is the largest distribution package set (according to repology). But sometimes something is missing or I want to add some of my own projects as packages, unless it's some insanely bad proprietary application, I can do it in a few minutes.
- Atomic updates/rollbacks.
- Ad-hoc or project-specific development shells (though that is more Nix than NixOS).
I know that the learning curve can be steep, but once you really get Nix and NixOS, it's kinda like being the master of the universe, erm, I mean your systems.