I started using NixOS a while ago. For the longest time, I would boot into it occasionally to try out its features, but I still used Windows as my primary OS. A few months ago, I pitched a couple of ideas here at XDA, and they said yes. That encouraged me to explore NixOS more and use it more frequently. I have tried other Linux distributions in the past, but the features that come with NixOS are unmatched. Its declarative approach, atomic updates, and extensive customization make it one of the best distros I have ever used.

👁 Hyprland Arch Linux on Framework laptop
5 useful Linux tools that would never make sense on Windows

The Linux ecosystem is home to a host of neat services, many of which are impractical on a Windows machine

5 Declarative Configuration

OS as code

NixOS uses a different way of configuring systems than traditional Linux distributions. Instead of making changes manually (like editing config files or installing software piece by piece), you describe your entire system setup in a single configuration file. This is called declarative configuration. You write down everything you want, including installed software, user accounts, services, system settings, and NixOS builds the system to match that description.

Because these configuration files are just plain text, you can manage them with Git. That means you can track every change, go back to any previous version of your setup, or copy it to another machine. NixOS also includes a newer feature called Nix Flakes, which takes this further. Flakes provide a way to lock in the exact versions and sources of every dependency your system uses. This information is stored in a file called flake.lock, which records where to fetch each package and a hash to verify it hasn’t changed.

This system makes Nix builds more predictable and reliable. Your system will always be built the same way, whether you rebuild it a year later or on a different machine. It works similarly to how tools like Cargo for Rust or npm for JavaScript lock dependencies for software projects.

4 Convenient system customization

You can easily swap out different parts of the system

With just a few configuration changes, you can easily swap out different parts of the system. Nix abstracts away the underlying complexity by packaging everything into concise, declarative parameters. Switching between desktop environments like GNOME, KDE, i3, or Sway is straightforward and low risk.

The OS gives you unmatched control. You can run kernel 5.15 for stability while testing kernel 6.1 on the same machine. Just declare both in your configuration and pick the one you want at boot. Mixing software versions, adjusting services, or even replacing your bootloader becomes seamless.

For developers, NixOS shines with clean, isolated environments tailored for each project. For system administrators, it’s a powerful tool for scaling. Using a single configuration file, you can deploy identical systems across multiple machines.

3 Rollback Capability

Also, updates are applied all at once or not at all

NixOS supports atomic system upgrades, which means updates are applied all at once or not at all. This prevents partial upgrades that could leave your system unstable or broken. You can easily roll back to a previous configuration if something goes wrong.

You can revert to any earlier system state, and NixOS even lists all old versions in the boot menu by default. This makes switching back quick and simple. NixOS also uses symbolic links extensively and in a smart way.

In most other Linux distributions, upgrading a package usually replaces the old version with the new one. NixOS works differently. Each package version is stored separately in its own unique directory. When you upgrade a package, NixOS updates the symbolic links to point to the new version but keeps the old version intact.

If you encounter problems with the new package, you can switch back to an earlier generation of your system, and the symbolic links will automatically direct you to the older package version. This approach makes managing package versions flexible and safe.

2 No dependency conflict issues

Every package is built with its dependencies

In traditional systems like Ubuntu or Arch, installed software typically relies on shared libraries such as libssl or glibc that are located in global directories. If two programs require different versions of the same library, a dependency conflict can occur. One application might stop working because it cannot access the specific version it needs.

Nix handles this differently. Every package in Nix is built with its dependencies and configuration encoded into a unique hash. This hash becomes part of the package's installation path. As a result, you can install multiple versions of the same software, like Firefox 120 and Firefox 115, without any conflicts. Each version is isolated in its own environment, ensuring they do not interfere with one another.

1 Nix package manager

Probably the best feature

The Nix package manager on NixOS gives you access to over 80,000 packages. It’s not just limited to Linux distributions. You can also use it across different platforms, but on NixOS it’s especially powerful. The range of available packages is comparable to, or even better than, the Arch User Repository (AUR). You’ll find almost everything you need in the Nix package collection.

For example, I wanted to install the htop tool with some custom patches that aren’t included in most default Linux repos. Thanks to NixOS, I could easily create a custom package expression to build exactly what I needed, without waiting for official repo updates. This shows you can depend on NixOS for flexibility and access to almost any software.

NixOS is fun

Using NixOS can be quite enjoyable, but it’s not for everyone. The learning curve is steep, and you often have to go down the rabbit hole to figure things out. However, it's worth a try if you value features like a declarative setup, rollback capabilities, and the Nix package manager. I’ve been dual-booting it with Windows, and the experience has been great. If dual-booting isn’t an option, you can always try running it in a virtual machine.