summaryrefslogtreecommitdiff
path: root/src/assets/blog/2025-02-24.md
blob: 4946faacfef8a5a6221daaacb2904d1e32c268c9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
---
name: From Guix to NixOS
date: 025-02-25T14:57:00-05:00
desc: I love GNU, but im tired of managing everything myself.
---

I love GNU and all of the work they do, but If i have to work a full time job to
use your software the way I want, its not feasible for me to use...

### GNU/Guix

[Guix](https://guix.gnu.org) is a declarative linux distrobution developed by
the GNU project. If you ever herd of glibc, coreutils, or GNU/Hurd, its that
crowd. Guix's goal is to build declarative system that is fully libre: the
primary goal of the GNU project and the free software foundation. This means
running zero free software, no drm, no binary blobs, no strictly licensed
code, and not even providing the option to the user to run proprietary software
if they want. This is the GNU way.

#### Declarative systems

A declarative system is built and can be fully reproduced from a single
configuration. On my old guix system, I had a set of multiple guile scheme files,
guix's configuration language of choice, that specified the entire system. What
packages were installed, the users of the system with what groups they have, the
bootloader, init system and the services it runs, and everything else is all
contaiend in those scheme files.

For example, the following scheme defined the users that were on my systems.
```scheme
(define freya-user-accounts
  (lambda (groups)
    (cons* (user-account
             (name "freya")
             (comment "Freya Murphy")
             (uid 1000)
             (group "users")
             (shell (file-append zsh "/bin/zsh"))
             (home-directory "/home/freya")
             (create-home-directory? #t)
             (supplementary-groups groups))
           %base-user-accounts)))
```

Packages can be defined...
```scheme
(define-public %freya-packages
  (append
    (specifications->packages (list ; video audio
                                    "mesa"
                                    "mesa-utils"
                                    ; terminal
                                    "alsa-utils"
                                    "vim"
                                    "neovim"
                                    ; .... and so on
                                    ))))
```

Guix also uses an inhouse init system called shepherd that defines services using
guix configuration scheme files. Declarative systems are really cool. If I break
something, I can easially fix it by rolling-back my system. I dont have to figure
out what stuff in the system changed, and manually repair it. Since everything is
defined by configuration, it be overwritten when I rebuild the system state.
Another thing specific to guix I liked is that it uses guile as its
configuration language. For these reasons and many more, I switched to guix over
two years ago and stayed on it until recently. Recently I left guix, and this is
why.

### The problems

1. The Guix package manager is really slow

    I have no gosh darn idea what the heck GNU was doing when they built guix, but
their package manage is slooooow. Really slow. Snail slow. If I wanted to
instantiate my configuration on a new system It could easially take one to two
hours. HOURS.

    Also, the guix package manager doesnt do TLS correctly. I don't
know what why, but it every so often, especially when installing an entire system,
it will crash and loose any builds or downloads it was in the middle of processing.
Since the guix package manager is slow, it then takes a moment to start back up.
In conclusion, when instantiating a new system, I have to start the installer
multiple times, which adds to the hassle and install time.

2. Very few packages

    The main issue with using software that is used by a very small community is
you will run into things just not being supported. With guix, this is packages.
Since guix does not expose binaries and shared libraries globally (this is
just how declarative systems work) you cannot just download software and built it.
With guix and other declarative systems, you have to package the software to
get it to run at all.

    Due to this, I had to spend hours packaging software I wanted to use
including, but not limited to, UEFI firmware for QEMU, Hyprland, my lock screen,
clipboard, gtk themes, and modern versions of pipewire.

    Since I was packaging all this software myself, there were no official binary
substitutes avaliable such that I didnt have to build all the software all the
time. Instead I had to manage my own [build server](https://cuirass.freya.cat/).

3. No non-free software

    Do you need to use Discord because all your friends use it? Do you want
drivers to run a functional computer? Well if you asked those to questions GNU,
GNU would tell you to get better friends and get a better computer.
I'm sorry but im just not going to do that. Unlike other distrobutions that
hide non-free software behind a flag, GNU just doesnt support it. At all. Nada.

    There are people in the community that add support themselves in their own
third-party repositories, but they can break. And even with those third-party
repositories the software may still not be packaged. Even more If you want to
package it yourself, guix's build system doesnt make it easy to package non free
software. Guix does not provide the utilities to do it. There are third-party
extensions to the build system that make it easier to package proprietary
software, but its not official and provided by guix.

4. Documentation and Support

    The biggest issue I had with guix was their documentation and support, or
the lack there of. In the standard GNU fassion, the support they offer is
"read the fucking documentation" (RTFM). This is fine if the documentation is good.
With guix its not.

    You would be lucky to find something in guix documented. You would be even
luckier if the documentation was any good. With guix, the best place to figure
how to use the system is IRC chat logs, mailing list archives, reading other
peoples dotfiles, and reading the guix source code.

### NixOS (the solution)

NixOS is another declarative system that is much older, more widly used, and
better supported then GNU/Guix. Guix was even a hard-fork of Nix. The major
two differences is that NixOS is configured using their inhouse nix language,
which isnt great, and that NixOS uses systemd for their init system.

Besides not being able to use lisp, and being forced to use systemd, there are
many benifits to NixOS over Guix. Nix supports non-free software if you choose
to use it. Nix has good documentation. Nix has packages for almost everything.
And compared to guix, nix is really fast.

So I switched.

#### My experience

Ive been on NixOS for a little over a month now, and I'm loving it much better.
The nix language is kind weird, but I can live with it. I dont have to use
third-party repositories just to get packages to get my system to boot. It
takes minutes not hours to setup a system. Everything just works™.

You can see my guix configuration [here](https://g.freya.cat/freya/dotfiles-guix)
and my nix configuration [here](https://g.freya.cat/freya/dotfiles-nix). If you
are trying to learn or switch to either system, you can use them as a good
resource. You can also view the guix repository I created called [sakura](https://g.freya.cat/freya/sakura)
when I had to package things. But if you need a recommendation to use either GUIX
or NixOS, from someone who used Guix for two years, use Nix.