/

Moving to Greener Pastures: Debian to NixOS

skaj-os is currently private due to API keys but will be open-sourced soon!

 

First and foremost, I should say that I absolutely adore Debian -- it's the Linux distribution that I'm most comfortable with, especially given its package release model. Having a guarantee of package stability is something that should not be taken for granted, considering I've dabbled with Arch and absolutely despise their release model. As much as I love software engineering, I don't want to debug most of my OS core packages. Reading the Arch Wiki every time I want to update a package is tedious and annoying, and having to deal with the fear of totally botching your system every time you update is frustrating. You could boil this down to "skill issue", but I'd prefer to not be constantly working on fixing some bullshit bug because the packages are pretty much untested.

Now, it's kind of ironic that I make these statements since I decided a few weeks ago to try getting Hyprland, a bleeding-edge desktop environment, to work on Debian 12 Bookworm. Frankly, the results have been incredibly good, with a majority of packages/applications running exactly as expected. Electron-based apps need to have Ozone platform flags enabled in their .desktop files, which achieves proper rendering without blurriness.

So why am I switching?

Updating any Hyprland package requires me to build everything from source, which is honestly worse than Arch's update UX. Ensuring that the Hyprland dependencies are up-to-date is very difficult on Debian, since most Hyprland deps are bleeding-edge AUR packages not yet published to apt. Even trixie and experimental package sources may not have the correct version, which is the main reason I'm switching to NixOS. I'd like to have Debian-like stability with the ability to lean into the bleeding-edge without having to compile most dependencies/packages from source.

I'm not someone who writes a ton of C++ for either my dayjob or as a hobby since I absolutely hate the language (a topic for another day perhaps), and if I wanted to spend time debugging system packages, I would write them from scratch using Zig or Rust (probably Zig though).

To handle the switch, I've started working a project I've decided to call skaj-os, which is a repository of shell scripts that install my desired environment. Originally, I thought that this article was going to be titled "Debian to OpenSUSE", so I had created skaj-os to be OpenSUSE-compatible, but that horribly failed due to incompatibility with my system (or something like that, NVIDIA drivers failed to install properly even though documentation was followed). Rather than struggle with OpenSUSE, I figured NixOS was worth a shot.

And it definitely was.

Some of the documentation for NixOS has been lacking, wrong, or incomplete, but overall, it's been a joy to edit a total of 2 configuration files:

I've managed to get all of my core applications installed and working, including fixing linkages for fnm and node using nix-ld. This is a huge win, and honestly reduces the need for skaj-os in the first place.

I'm genuinely so pleased with this setup, it's absolutely beautiful and I love the fact that I can develop and play games on the same machine again. I don't have to struggle with WSL nor do I have to wonder if my games can run on a Mac Studio. Here are my specs:

  ▗▄   ▗▄ ▄▖      jackson@nixos
 ▄▄🬸█▄▄▄🬸█▛ ▃     -------------
   ▟▛    ▜▃▟🬕     OS: NixOS 23.11.3409.d7f206b723e4 (Tapir) x86_64
🬋🬋🬫█      █🬛🬋🬋    Host: MS-7B46 (2.0)
 🬷▛🮃▙    ▟▛       Kernel: 6.1.74
 🮃 ▟█🬴▀▀▀█🬴▀▀     Uptime: 2 hours, 28 mins
  ▝▀ ▀▘   ▀▘      Packages: 1880 (nix-system), 784 (nix-user), 8 (flatpak)
                  Shell: zsh 5.9
                  Display (Dell S2417DG): 2560x1440 @ 144Hz
                  WM: Hyprland (Wayland)
                  Cursor: WhiteSur (12px)
                  Terminal: tmux 3.3a
                  CPU: Intel(R) Core(TM) i7-8700K (12) @ 4.70 GHz
                  GPU: NVIDIA GeForce RTX 3070 Lite Hash Rate
                  Memory: 19.66 GiB / 31.30 GiB (63%)
                  Swap: Disabled
                  Disk (/): 123.30 GiB / 915.32 GiB (13%) - ext4
                  Local IP (eno1): 192.168.4.25/22 *
                  Locale: en_US.UTF-8>)

I've gotten a lot of core features entirely working, which makes me super stoked. It's been awhile since I've had this much fun customizing a system, it reminds me of my days with an HTC One M7 and xda-developers.

I hope if you're considering a Linux desktop install that you give NixOS some thought, it's been a pleasure to work with stability + customizability.

Thanks for reading!

-- Jackson