Switching from NixOS to CachyOS
I’m off NixOS. I know, I know. I said I drank the cool aid, and I did. But sometimes, the cool aid is a little too cool, you know?
Let me explain.
The promise of NixOS is amazing. You describe your entire system in config files and it becomes exactly that, every time, on any machine.
In theory.
In practice, you spend a non-trivial portion of your time just… maintaining the config.
Not because your system needs changing, but because something upstream changed. The nix CLI has been in a slow-motion identity crisis for years. The “new” experimental commands (nix develop, nix build, etc.) are officially experimental but everyone uses them, the old commands work differently, and the documentation always seems to be describing whichever version you’re NOT running. Flakes have been “experimental” for years now and the fact that you still need to explicitly opt into them via a flag that goes in… several different places depending on who you ask… that is a good representation of the situation as a whole.
A side effect of this is, that my config never felt just right. I started with channels, like the docs told me to. Then I read that I should be using flakes. Then I found home-manager and started modularizing my config for different machines. But nothing felt right. It’s hard to explain. I was never really satisfied with my config. There was always stuff to do. It was exhausting.
And then there’s the language itself. Nix is a purely functional, lazy-evaluated language that you will need to understand at a non-trivial level if you want to do anything beyond the happy path. Pinning an old package version because wireplumber was misbehaving took me an embarrassing amount of time and resulted in a blog post. For a wireplumber downgrade. On a normal distro that’s pacman -U wireplumber-0.5.5-1-x86_64.pkg.tar.zst and you move on with your life.
The final straw was KDE just exploding for no reason after I tried, and failed, to get a nice, modular config working that I could use between my desktop and my laptop.
Well, it’s been a roller coaster ride of emotions, and I’m still running NixOS on my server, but for my GUI machines, I’m now running Arch, btw. CachyOS to be specific.
CachyOS is Arch under the hood but with a serious focus on performance. They ship their own kernel (and several alternative kernels) compiled with profile-guided optimization (PGO), BORE scheduler patches, and a bunch of other tweaks that squeeze extra performance out of the hardware. They also maintain their own repo of popular packages recompiled with these optimizations and with -O3 and x86-64-v3 (or v4 if your CPU supports it) march flags. On paper this should mean faster everything: better compile times, snappier desktop, lower game frame times.
Does it actually make a noticeable difference in day to day use? Honestly, hard to say definitively. But I’ve been running it for a couple months now and the system does feel snappy. Games feel good. I’m not going to pretend I ran benchmarks.
Since I keep all my documents and files synced to my nextcloud and/or in repos on github, actually pulling the trigger was super easy. What was not so easy was de-nix-ifying my dotfiles! They told me I will never go back, but now I did and it sucks. I had to manually set everything up again, like a caveman. But once the deed was done, it was a very pleasant experience. Honestly, just installing stuff on a whim was a breath of fresh air. I kind of felt like I was in a walled garden using Nix. It’s really nice on the inside, but once something is off, it’s a major pain to fix. Now on arch I have the full power of the arch wiki on my side, which makes everything a breeze.
The one thing I genuinely miss is the rollback story. NixOS’s atomic upgrades and the ability to boot into any previous generation from the bootloader is legitimately great and there’s nothing quite like it on a traditional distro. On CachyOS I’m using BTRFS with Snapper for automatic snapshots which gets me most of the way there. I can at least roll back a bad update, but it’s not quite as clean. And it doesn’t feel the same. If you ever ran NixOS, it feels fucking great to know that a working system is just one reboot away.
NixOS is a great idea and I think for certain use cases, servers, reproducible dev environments, teams that need identical machines, it’s genuinely the right tool. For a personal desktop where I just want to use my computer without filing a support ticket against my own config every other week, it wasn’t the right fit for me anymore.
I’m still running NixOS on my server and I’m still using devenv for my dev-envs (lol), but for now I’m done being atomically reproducible. CachyOS is fast, it’s stable enough, everything works, and I haven’t thought about config files in at least 2 weeks. That’s exactly what I want.
Thanks for reading 🏹