Just recently started using the desktop machine (under my desk, as opposed to my laptop which sits on my desktop) and put NixOS on it, and found myself pleasantly surprised. There's certainly still some parts of NixOS that require some expertise and getting your head around its package model, but overall I was surprised at how idiotproof it was to install and use. I mostly play games on it with Steam, which also Just Works.
NixOS is really a profound experience, once you embrace it. I used Arch for ~3 years and ended up reinstalling it maybe 15 times on my desktop alone. Switched to NixOS and I've used the same installation for 3 years, synced with my laptop and server, switching from x11 to Wayland to KDE to GNOME then back again with no problem.
It doesn't feel real sometimes. My dotfiles are modularized, backed up in Github and versioned with UEFI rollback when I update. I might be using this for the rest of my life, now.
I also have the same Arch install from 2014 on my main hardware. Each replacement computer is nothing more then taking the old drive out, placing it into an USB enclosure, booting a USB live, setting up the partitions on the new drive, and _rsync_ the content from the old to the new, finalizing with registering the UEFI boot loader.
One just need to make sure that you use the proper _rsync_ command options to preserve hard links or files will be duplicated.
I personally remember being inspired by Erase your Darlings and Paranoid NixOS Setup back in the day, less for the hardening measures and more because of how great the Nix syntax looked. Huge, monumental ass-pain setups could be scripted away in one or two lines like it was nothing. You could create wildly optimized configurations for your specific use-case, and then divide them into modules so they're portable.
It's not advisable to switch to one of these paranoid configurations outright, but they're a great introduction to the flexibility provided by the NixOS configuration system. I'd also recommend Xe's documentation of Nix Flakes, which can be used on any UNIX-like system including macOS: https://xeiaso.net/blog/nix-flakes-1-2022-02-21/
For what it's worth: I no longer suggest the use of NixOS for any purpose. I only have one NixOS system in my house because it's my NAS and I am a coward.
There's one sentence in there I wanted to call out:
> Everything had to be done the “Nix Way”
Funny thing, what eventually drew me into using NixOS was a comment on some random forum (long since lost the reference) from what appeared to be an experienced NixOS veteran that said pretty much the opposite: that NixOS is as pure or impure as you want it to be. Want purely declarative everything? Do everything with Nix expressions, be it classic derivations or flakes. Want stateful package management? Install stuff to your profile. Or even install devbox and run homebrew in it. I've come to see the benefits in doing things "the Nix Way", but it's pragmatic enough that you're not entirely locked in. You just can't make any assumptions about what PATH looks like.
So while the rest of my system is defined as a flake, the one thing I haven't fully embraced on NixOS is home-manager, and I've only just started adopting that in a piecewise fashion. Meanwhile I'm defining a flake per project on my mac to replace all the other version-manager thingies I'd been using, but I still find nix-darwin a step too far.
A lot of scripts and binaries don't work properly if not installed through Nix. This can really affect your workflow if you depend on random niche software not packaged by Nix.
When I started my first job I couldn't build their TypeScript project because it depended on GRPC on NPM. That NPM package is literally just a binary...
This isn't really the fault of NixOS, but it's wildly impractical as long as the world is stuck where it is. I've recently considered going back into NixOS and spinning up Podman Ubuntu containers for stateful dev environments (with my home-manager programs included, of course). It's sort of the reverse approach, instead of Nix being a second-class citizen on Ubuntu, I want Ubuntu to be a second-class Citizen on Nix.
Yah I suppose I should have said "you just can't make any assumptions about the filesystem layout" instead. You can always assume shells have a symlink in /bin, and there's another for /usr/bin/env, and that's about it. Programs that assume the system follows the FHS tend to break on other distributions too, but certainly will on Nix. That's where we end up using containers and VMs, or whatever smoke and mirrors act NixOS does for Steam.