Sell me on Guix / NixOS. I'm a current Arch Linux nerd and I want to become even more insufferable expand my horizons.
I would highly suggest Guix over NixOS mainly because Guix has better documentation and thus is actually accessible to people who aren't trans, but to give a good overview of guix (and why I use it + the pain points):
Guix is like gentoo in that its source-based, but doesn't come with all the baggage of a source based distro. Guix packages are defined in scheme code, it sounds intimidating but most package definitions follow a pretty formulaic format. I don't even fully know scheme and I can usually get it to work for packages with simpler build systems. It's kind of like having the AUR as an operating system for packages.
most of the reason I love guix is that it's obsessed with reproducibility. Every build definition is designed to output the same output every time, and as such that means you can just download the exact outputs from a
Substitue server instead of compiling it yourself and get the exact same results. There's also some options for LAN sharing of packages too that, if enabled, will let you send guix packages to other computers so your less powerful devices don't have to compile if you have a custom package on your system that you want every one to use.
Another great thing about the reproducability is that the system is automatically version controlled through it. All guix operating systems are configured by a scheme script definition, which means you can roll back your operating system as each time you reconfigure it the previous "generations" of the file are kept. This means that if you make some god awful change, you can very easily roll your entire system back. Just run
guix system roll-back and you're likely on something stable again. I also use
guix home, which lets me manage my dot files and general user environment this way too.
This doesn't mean that you have to reconfigure to install any new software though, if you see or write a package, you can just run
guix shell with its name and the system will create a temporary environment so you can test the application in. You'll still have access to your normal system, but you can run the package without having to worry about dependencies conflicting. If you don't like the app, you can just never add it to your system file an the system will clean itself up after you close the terminal and run
guix gc.
Unfortunately, a lot of this comes at the cost of doing 99% of file system and POSIX compliance stuff completely different than most distros. Like, out of the box appimages don't even work after you install fuse because certain normal linux file systems are just not there. This is because basically everything about the OS's packages, configs, and other installable stuff is stored in an immutable /gnu folder at your root dir. In there is just a massive blob of files that gets symlinked to the various spots on your system to config stuff (i.e, the correct config files going into /etc). From here, it connects everything up into your $PATH to give you the environment. This makes the environments gigastable, but it also means that you have a lot of weird conflicts with normal linux stuff. Sometimes random .bin files need to have their ELF stuff patched to recognize your weird ass file system it has hard coded in it, or randomly your path doesn't have zlib in it for appimages because its looking in the wrong place. The best way to install stuff is through the package manager because of that, but sometimes a nigga just wants to run some wack ass software in a weird packaging format and that's when things get shitty. The best copes are docker and flatpak, but random unpackaged software can be a pain. Basically kiss goodbye to anything NodeJS related (unless through docker or flatpak) because of that (if you run that cancer). Random exceptions to exist for things like discord though.
Becuase of this, it's sometimes better to think of guix less as a "Linux Distro", but more as an OS in its own right build on top of a lot of usual linux utilities (except systemd). When using guix the "guix way", the system is very malluable and you can get it to do pretty much anything you want with enough effort. I'm even trying to build a small game console for an old mini PC right now using it and I can only reasonably do that because
guix gives you the ability to export custom ISOs because it can easily and perfectly replicate itself. That said, when you stop working "its way", you're going to have to suffer through hacks, jank, and all around cancer because guix
generally does not like when things don't work its way (except docker and flatpak for some reason). It's slowly getting better with this, they even recently added support for
defining certain docker containers in your operating system definition files so people can more easily run non-guix software.
In its current state, it's got enough polish to make it function at what its good at, but not really cover well for what its bad it. I'd say its definitely still in an "early adopters"-ready stage of development, but I love it for what it is right now and its only getting better.
As a slight random aside about it,
recently they moved their git development off a mailing list and onto a git forge and the development has sped way up. I got used to doing the email patches but the shit actually just sucked ass to work with, im so glad they're doing this now. I'm hoping that means that more people will contribute more and make it better faster. The only shitty thing now is that the commit format is ass tier, but maybe
@grok can be useful for once and fix that.
Sent from my Fairphone