How Guix Compare to Nix and Vice Versa
This started as a question from Mr. X on System Crafters general room on matrix:
maybe I was offtopic here, but nobody who can compare Guix and NixOS?
This is my opinion, based on me running nix and Guix (and RDE) as my primary OS for the past 3-4
People who know me on the System Crafters community know I’ve switched between both almost as often as @acdw
has re-started his Emacs configuration 🤣.
Take this with a grain of salt with regards to current state of Guix, I’m about to jump in the Guix
wagon again but I don’t know what happened in the last 6-12 months.
Note that I use interchangeably the Guix and Nix package manager and OS, in this post, it does not matter.
Below, is re-worded version of the messages I posted at that time.
What do they have in common
Guix and Nix share a lot in common
- They are functional package managers and OS. you can reproduce their build (some caveat), and roll
back when you need to.
- The concepts are the same, with derivations, a build daemon, packages that user can
install, and where multiple versions can coexist. From what I know, Guix build daemon started as a
fork of nix build daemon
- Installation are typically descriptive with a file, instead of ad-hoc commands
- They are both addictive
- They both have opinionated, technically savvy communities
What is different in Nix
In any order:
- pragmatic approach, especially around the kernel and non-free software. they share the same non-free
philosophy as Debian, it’s there, not by default, but it is useful for some.
- the default kernel makes it possible to install CPU ucode to fix important CPU issues. You don’t
have to mess around to get all features of an old >2012 laptop
- Nix flakes are great, they move and make the repositories own the channels, making sure each flake
setup it’s official input (it must) and everything has to be in git otherwise the flake is not
loadable. This has the advantage of having off the shelf pinned channels not only for your configuration,
but also for the inputs of your inputs. For example I have my own fork of DWM, which is a flake,
and it’s pinned channels/dependencies. If I input and install my DWM flake as an input in my
system configuration, it will know how to reproduce the “build” of my DWM without telling what inputs
(channels) it needs
- For my use case, I get a better qutebrowser in Nix, it has both brave adblocking, and support
widevine for netflix and other sites
- It has all the software I need to get paid at work
- It’s governance seems weird, the current “discussion” is to allow 3000 people to be able to merge
automatically to main, change the security promise with not much discussions.
- Nix has an awful language. It’s unreadable, and it is totally different than what most know. You
may disagree, but no-one can change my mind on it. I tried at least 5 times, read the full
documentation (yeah I read doc), I code regularly in roughly 5-10 languages and I code since I’m 8
years old (many decades ago).
- The language is functional, but not general purpose, so it’s full of special syntax that is hard to
learn, and only useful for Nix package development. What a waste.
- Nix is easier to install
- The community is larger
- It has more software (or variety of software), but some are broken
- It has lots of home services
- Nix has a REPL, but the development experience is immature and pretty much a set of disconnected tools.
- People who shows Nix, are typically running the REPL in a term, vim in another term. Different
workflow to what I use now.
- The contribution to Nix is using GitHub PR, which looks overly complex at that scale.
What is different in Guix
In any order:
- The language is great, I love the simplicity of LISP / Guile Scheme. Syntax is similar to many
LISPs and is general purpose, it’s reusable knowledge.
- I can develop my configuration using the same tools as Guix, Emacs, the REPL, eval last sexp, etc… It’s
a similar experience to code in Clojure, or Emacs Lisp
- Guix has a smaller but vibrant community
- Guix is missing flakes, you end up reproducing some of it with Guix describe and Guix
time-machine. There are no ways to do this from your configuration and handling inputs of your inputs.
- Guix is insecure by default on modern CPU: just look at the Intel list of security fixes in
the ucode patches. It’s insane not to package that by default. You can get these by using NonGuix
and a regular kernel, but no-one can mention this on official Guix rooms.
- The attitude of: if it’s not free, we cant talk about it, the elitism. Their objective might be
freedom, but the approach sounds like “you’ve got to think like us” which is quite the opposite of
- On the freedom front, I think one of David Wilson’s talk at Guix configuration was actually in the right
direction. I’m not sure if that was well received by the Guix leadership, I think it was well
received by Guix users
- I prefer the contribution flow of Guix (git email patches with web front ends)
- I’m missing many software I need to get paid
- I can get my missing software with nix-service-type and nix. So the software situation is not too
bad. I can also use nix-shell for some of my coding project that requires software not in Guix
- Guix home has barely any services, while nix home-manager has all that I need
- When running Guix, I need to run Guix and Nix, so it’s harder to maintain as I have two configuration,
two languages to keeps skills on, and sometimes they conflict with each others
Both Guix and Nix share and differ quite a lot. I like to use each for a while every year to see
what has improved, what I’d want in the other OS. I would prefer to stay with Guix with it’s great
language, great community, workflows that are better suited for me. I keep going back to Nix due to
it’s pragmatism, has everything I need (but a language) and their concept of freedom is closer
That’s it for today :)