The whole thing made a lot more sense to me once I started treating my system as code, not a pile of Ubuntu-style tweaks.
I spent a long time approaching NixOS as just another Linux distro that needed a slightly different installer and a new package manager. I looked for the equivalent of apt install, tried to tweak things live, and expected my changes to “stick” the way they do on Ubuntu. That mindset made every small task feel harder than it needed to be. Once I accepted that NixOS wants me to describe my system rather than babysit it, the whole thing started to make sense.
The turning point was realizing I was fighting the model, not the tooling. NixOS is happiest when you treat configuration like a source of truth, not a trail of one-off fixes. You “change the system” by changing the config, then rebuilding it into a new generation. It is less like maintaining a pet machine and more like managing an environment you can reproduce on demand.
The mindset shift that matters most
Stop thinking in one-off package installs
If you approach NixOS the way you would Ubuntu, you will keep hunting for the one command that fixes the problem right now. That works well on distros built around imperative changes, where you patch the current state until it behaves as expected. NixOS pushes you toward a different habit: declare what should be true, then let the system converge on that state. The friction you feel early on is often just the cost of switching mental models.
Once you lean into that model, NixOS becomes predictable in a way Ubuntu rarely is after months of tweaks. You can store users, services, packages, and system settings in one place and rebuild with confidence, knowing exactly what changed. Those rebuilds create discrete generations, so you can roll back if an update breaks something. That alone changes how brave you can be about experimenting.
This is also why “fixing” NixOS by treating it like a regular distro tends to backfire. Quick edits outside your configuration might work for a moment, but they are easy to forget and hard to reproduce. When the next rebuild occurs, those changes may be lost or conflict with the declarative state. The payoff comes when you stop trying to sneak around the config and instead make the config do the work.
Why NixOS behaves so differently
Your system is a built artifact
NixOS is built around the idea that software and configuration can be described as inputs that produce an output. That output is a system closure built from the Nix store, where packages live in content-addressed paths rather than a shared filesystem soup.