Sudoscience

Going /home

Intro

Yesterday, after some deliberation, I migrated from Guix System as my daily Linux distro to Fedora. I have been using Guix System since October 2024, when I bought my current laptop, a Framework 16. I am by no means a seasoned Linux user: I only started with Ubuntu in 2022, after some previous experience using it through WSL.

I liked the idea of an immutable OS: in my previous day jobs as a programmer, I became acquainted with a variety of functional programming languages where immutable data structures are the norm. Too, much had been made by some colleagues of Nix and its associated tool, NixOS. I tried NixOS, but the language itself had long been unpalatable to me, so I did not get very far. Then, a colleague at my final coding job mentioned, in a rather off-hand way, the existence of Guix.

I am a Lisp enthusiast, so the prospect of a Lisp-driven OS intrigued me. It harks back to the days of the Lisp Machines, an era I was not alive to see, but which sounds, for all of its proprietary madness, a heck of a lot simpler than today's computing world. Plenty of writing exists about the "simplicity" of Lisp, so I won't go into any more detail about that.

It is enough to say that, well, an operating system, and especially a Linux distribution, is not so simple. Immutable OSes like NixOS and Guix System try to alleviate some of the aches and pains by extending the concept of reproducible builds to the level of the operating system. This comes at the price of learning a new way of configuring your operating system, though arguably a fully-fledged programming language like Guile Scheme is a more powerful and flexible tool than Bash scripts and editing configuration files that you have to dig through the guts of the filesystem to find.

My experience over these past ten months follows.

Installation

I installed the OS using the Live USB method documented on the Guix website. I had to make some slight modifications to the system.scm OS definition file produced by the installer, namely allowing it to use "non-free" Linux firmware.[1] Once these changes were made, the installation ran as expected. I elected, and later regretted, applying a LUKS encryption to the storage device in my computer, but more of that presently.

First impressions

Booting

I found the boot process to be rather slow, aggravated by the time necessary for the kernel to unlock the encrypted storage device. Worse yet, in order to get to a desktop, I had to enter the password three times: once to unlock the disk, again to enter userspace, and a third time to access my account. I am sure there is a workaround or a fix for this, but I never found it.

Desktop environment

I noodled around with various DEs and windowing managers before finally settling on MATE with i3wm as my window manager. This is a weird combination with a somewhat jarring and even unappealing UX, but I grew accustomed to it. i3 is excellent. It's fast and the keystrokes for managing windows are intuitive. Plus it has seamless integration with xrandr, which made using external monitors almost painless.

I got to a basically functional computing environment without writing almost any code. Most things I was able to do with the command line interface provided by Guix, and when I needed to modify a package definition here and there, consulting the Guix reference manual was usually enough to get me over the hump.

Wifi

Unlike many other niche Linux distros, Guix System had no problems loading the firmware for my network card, or any similar issues, so I had working WiFi from the jump.

Better yet, Guix provides a pre-built binary for Librewolf, my browser of choice, so I was able to have that out of the box, too.

Day-to-day usage

I used Guix System every day, for work and personal computing, from October 2024 to July 2025. I grew fond of some things, especially i3. Over time, I grew steadily more comfortable writing Guile Scheme, and even came to enjoy the language as a programming language, and not simply as a bespoke configuration tool. Probably, I'll write a separate post about Guile itself. Nearer to the end of my time as a Guix System user, I also started writing my own Guix packages and using them.

In the intervening months, however, I discovered that my intuitions as a Linux hacker and bricoleur were severely wanting and slow to develop. It was not obvious, for instance, how to get the OS to warn me when my battery was running out. On several occasions, I would be in Zoom meetings with colleagues, and then my computer would die, meaning that I would randomly leave them on the hook for five to ten minutes while I got things going again. This is what computer programmers more-or-less ironically call a "skill issue", but as a lifelong user of closed-source operating systems, it was never anything to which my attention had to be directed.

System (re)configuration

This is where things got a little painful. In order to modify your system, you can edit the configuration file that is located at /home/<you>/.config/guix/system.scm. Then you run guix system reconfigure. It's pretty straightforward, but it's painfully slow. If it's necessary to rebuild the Linux kernel, be prepared to wait several hours.

Package management

The guix command line tool made package management easy. Installing a package made it available for use right away, like on any more common Linux distribution. However, I often found that resolving substitutes (the term Guix uses for the components of a package) could be time-consuming, as it appears the server is in Bordeaux, France. Nonetheless, things worked, and I was happy with this part of the experience.

Creating isolated environments is also simple with the guix shell command. I didn't use this too much but it was nice now and again. I was also able to simply integrate it with direnv thanks to a thorough example provided in the Guix Cookbook.

Programming tasks

I worked mostly with Clojure professionally, as well as personally. Guix has up-to-date JDKs, but I didn't like how it packaged Clojure—as an executable JAR you had to pass to java,— so I downloaded that directly from clojure.org.

One tension with distributions like Guix System is with the "ecosystem creep" of increasingly comprehensive packaging and build tools provided by certain programming languages. An example of this done well is OCaml's opam. Less fun is to be had with Haskell's cabal, and certainly with my absolute least favorite package manager of all time, pip.[2]

Unfortunately, I discovered some papercuts related to things with a native compilation model. This included OCaml[3], and, more recently, certain Scheme implementations like Chicken. The absolute worst offender, though this should probably not come as a surprise, were Electron apps. Again, this turned out to be something of a skill issue, and in the process of learning to diagnose and address it, I learned quite a bit. Still, linker errors were common, sometimes due to silly problems like an unconfigured environment variable, and other times to an upstream configuration issue like the opaque build of GCC provided by Guix.

Overall, though, the issues were infrequent and minor.

Personal computing tasks

Like most people, I also use web browsers and word processing software. These worked without issue, except for needing to manually add a dictionary to LibreOffice.

More recently, I started using Tor, in an effort to be more conscious about my online privacy. Guix has good integration with Tor, providing it as an OS service configurable in Guile.

Making the jump to Fedora

Last week, I bought an expansion SSD for my laptop. I had long wanted to dual-boot my computer, and have one OS for daily driving, and another for more exploratory and experimental usage. I determined, after several months of dedicated usage, that Guix System would play the latter role.

The relevant details regarding this change: having encrypted my disk at the outset, I had to try to decrypt it in order to modify the partitions and install a new OS. After some jumping around to various Live USB OSes, I settled on Fedora, and used it to run cryptsetup. This was slow: the decryption took almost 90 minutes. Worse still, when I restarted the computer, it failed to boot.

I was faced with the choice of ignorantly battling GRUB or making a clean breast of it, so I took my backed-up files and ran the Fedora installer on the main storage device. Bye-bye Guix System 👋

Fortunately, due to Guix System's immutable design, all the important configuration was in my home directory anyway. Moreover, the best part of the whole experience was the package management, not the system configuration, and you can run guix as a package management tool alongside dnf or whatever your OS provides you with.

As I understand it, if I reinstall a fresh Guix System, which I may yet do on my expansion SSD, it will be able to transparently reconstruct the OS from the definitions I have backed up. So, on the whole, I have not lost much ground at all.

In review

Overall, my experience using Guix System was a solid one. I learned a lot about how Linux operates, most of all its elaborate and labyrinthine filesystem architecture. I liked using Guile, so much so that I started writing it for fun. And the generally wide availability of common packages and tooling made it easy to get going on a wide variety of tasks.

Footnotes

[1] I have some misgivings and misunderstandings regarding the "free/non-free" distinction of the Free Software Foundation, and I am not a dogmatist about this or much of anything. I use the terms only by way of convention.

[2] I would sooner use npm. Yea, you read that right.

[3] The opam developers kindly warn you if your OS is not supported. Here there be dragons, I guess.