NixOS and Hyprland running on my old gaming PC
Figure 1. NixOS and Hyprland running on my old gaming PC. Left is Neovim used to write this, right are Firefox showing the draft and below the Thunar file manager.

Introduction

I have an older PC at home that I have been using for playing games. In the last couple of years, it’s been Fortnite, some 100 hours of Baldur’s Gate 3, and an obscure mod of Ultima Online that I have been obsessing over.

The machine is a six year old AMD Ryzen 5 3600 with a Geforce 2060 RTX card, so a relatively capable machine but Windows 11 has over the last couple of years become exceptionally slow, to the point where I couldn’t bother turning on the machine anymore.

Professionally, I use Mac and have been happily using Mac for over 20 years. Given the recent world events, I would like to explore what a computing experience without the strong ties to corporate America could offer. I’m not fully ready to abandon the Apple ecosystem just yet, but I want to try out alternatives and have a viable offramp.

I’m not completely new to Linux on the desktop, but I have not used it in a long time. My main linux experience has been with running various Ubuntu servers both professionally and for various self-hosted projects at home (including this page).

My first experience with Linux was in 1998. I read about it in the Danish newspaper Politiken’s Thursday computer section. I got excited and convinced my dad to mail order me a copy of Red Hat Linux 5.1, which I spent a few weeks installing and configuring on my Pentium 200mhz machine.

Red Hat Linux 5.1 installation disks
Figure 2. A picture of the contents of the RedHat 5.1 physical distribution. The picture above is borrowed from Linux Gazette, ©2009 Oscar Laycock. Published under Open Publication License v1.0. From the article GNOME and Red Hat Linux Eleven Years Ago.

At that time, I dual-booted with Windows 98 to be able to play games, but around the time when I started University in 2001, I switched to using Linux full time. Mac OS X came out shortly after and suddenly Mac was a viable alternative to Linux with its new UNIX-based operating system. So, for my first salary as a teaching assistant in 2003, I bought a G3 iBook, and in spring 2004 I bought an amazing used G4 Cube that replaced my aging Linux desktop.

Apple Power Mac G4 Cube seen from the top.
Figure 3. Apple Power Mac G4 Cube. Image by Steve Shaner, modified by Tyler9xp. Licensed under Creative Commons Attribution 2.0 Generic (CC BY 2.0). Source: Wikimedia Commons.

Now, having been a Mac user for over 20 years, I wanted to explore what a Linux desktop experience could be like in 2025. I didn’t want something that just imitated the Windows or Mac experience, but something that gave a different experience.

In my professional life, I do research on what’s called malleable software, and felt hypocritical that I was just using MacOS more or less as it came out of the box. Now, this introduction is already getting too long, so if you want to read more about malleable software, check out Ink & Switch’s excellent essay on the topic.

NixOS

In an effort to try something different, I investigated what was new in the Linux world and came across NixOS. For those who are not familiar with it, NixOS is a Linux distribution built around the Nix package manager. Nix itself is a programming language designed for package management, and it allows you to declaratively specify your system configuration. Basically, this means that your system setup including installed software and services is defined in a configuration file. There are many advantages to this approach, including reproducibility of your system setup, and the ability to roll back to a previous configuration if something goes wrong. What spoke to me, was that I could store my system configuration in a Git repository and, perhaps even more importantly, that I could easily get AI assistance with setting up my system as the whole configuration is just defined in configuration files. This meant that I didn’t have to spend excessive amounts of time understanding the Nix programming language in detail. AI is not infallible, so sometimes Copilot would break my system, but then I could roll back to a previous configuration and try again. Another appealing aspect of NixOS is that it is European in origin. The Nix programming language was developed by Eelco Dolstra at Utrecht University in the Netherlands, and NixOS was invented by Armijn Hemel, a master’s student at the time.

I don’t think NixOS is for everyone, as it has required quite a bit of tinkering to get to work, but for someone like me who likes to tinker with their system, it has been a great experience.

Hyprland

I also wanted to try a different desktop environment than the traditional GNOME or KDE that in many ways mimics the conventional experience of Windows and Mac. I wanted something that was lightweight and could make my aging PC feel fast again. Having subscribed to /r/unixporn on Reddit for many years, I had seen an increase in screenshots of exotic looking desktops highly customized and without a lot of the traditional chrome seen in GNOME or KDE. So, I started looking into the Hyprland compositor, which is what’s called a dynamic tiling window manager. This means that instead of relying on manual window management with the mouse like in Windows or Mac, the windows are automatically arranged in a grid and you rely on the keyboard to navigate between windows and rearrange them. Windows can also be released from the grid and placed freely on the screen as in conventional window managers. Hyprland is designed to be super fast and is based on what’s called the Wayland protocol, which is a modern replacement of the X11 protocol for managing windows on Linux.

Installation

I bought a 512gb m2 SSD to install NixOS on, and after a bit of trial-and-error finding a USB stick that would boot the NixOS installer. I had to mess a bit with the BIOS configuration and disable secure boot, but after having uploaded some phone photos of the BIOS settings to ChatGPT (!), I got it to boot. I decided not to install any window manager to begin with and use the terminal to configure the system. The NixOS installation is nicely documented, so I just followed the official installation guide and sometimes resorted to a bit of AI help in interpreting what I had to do.

It took some tweaking to get everything running with NVIDIA drivers for my graphics card, and I ended up using the proprietary NVIDIA drivers. I followed the NVIDIA guide on the NixOS wiki. It has been running stable since, but I am using it with a single monitor. I have heard that multi-monitor setups with NVIDIA and Wayland can be tricky.

As this is a computer I use for leisure, I can use the NixOS unstable channel so I get the newest updates of all the software. They warn that it may lead to breaking changes, but I haven’t experienced any issues yet.

Software

When installing NixOS and Hyprland from scratch, there is no software installed. It is a bit like designing your own kitchen, where you have to decide on every little thing down to the handles on the drawers and the type of plumbing under the sink.

Kitty terminal emulator

To actually be able to do anything from within Hyprland, I needed a terminal emulator. I am not particularly picky about terminal emulators, but I ended up installing Kitty. Kitty is a modern GPU-accelerated terminal emulator with support for images, nice fonts etc., that, e.g., can make modern Neovim (text editor) look and perform really great.

Waybar status bar

The second piece of software I installed was a status bar called Waybar. Waybar is extremely customizable, and I have spent a great bit of time styling it to my liking. In essence, it shows what workspace I am in, the title of the window with focus, the time, a volume widget and a widget I can click to bring up the resource monitor. I also implemented a small sound visualizer using cava that shows up when media with sound is playing, and shows the title of the played media. In principle, a status bar like this is not strictly necessary for the operating system to function, it’s not like on MacOS where the status bar is also the menu bar of the focused application.

Waybar status bar
Figure 4. The right side of my Waybar showing the music visualizer, network status, volume, resource monitor and time.

Rofi application launcher

I am very accustomed to using Spotlight on my Mac to launch anything. Before Spotlight was a thing, I would use LaunchBar for launching apps. Rofi is a super customizable application launcher that I have adapted to work as an application launcher, a window switcher and a clipboard manager. Meta-D will bring up the application launcher, and Meta-Space will bring up a window switcher that will also let me switch between windows on different workspaces. I also configured it to work as a clipboard history manager with Ctrl-Alt-V, you can see the monstrosity of the script below.

$menu = rofi -show drun
$menu2 = rofi -show window
$menu3 = (echo "🗑️ Clear clipboard"; cliphist list) | rofi -dmenu -p "Clipboard" | { read selection; if [[ "$selection" == "🗑️ Clear clipboard" ]]; then cliphist wipe && notify-send "🗑️ Clipboard" "Clipboard cleared"; else echo "$selection" | cliphist decode | wl-copy; fi; }
Screeshot of the Rofi application launcher
Figure 5. The Rofi application launcher showing some of the applications I have installed. This menu is shown when pressing Meta-D.

Mako notifications

Nothing fancy here, but back to the point about picking every little detail, I had to have a notification service, and I picked Mako which is a lightweight notification daemon for Wayland.

Web apps

A lot of the 'apps' I use on a daily basis are web apps. I’ve used Chromium to wrap a bunch of web apps so they behave more like native apps in the window manager. In my home.nix I made a little macro that I could generate web apps from:

{ config, pkgs, ... }:
let
  webapp = name: url: icon: category: {
    name = name;
    comment = "${name} web application";
    exec = "chromium --app=${url} --ozone-platform=wayland --enable-features=UseOzonePlatform";
    icon = icon;
    terminal = false;
    categories = [ category ];
  };
in
{
  ...

I can now add a web app like this and it will show up in the Rofi launcher:

xdg.desktopEntries = {
   gmail = webapp "Gmail" "https://mail.google.com" "mail" "Network";
   mastodon = webapp "Mastodon" "https://social.multiverset.net" "social" "Network";
   ...

Thunar file manager

In principle, I could use the terminal for everything file related, but sometimes it is nice to have a graphical file manager. I picked Thunar from the XFCE desktop environment that’s written in the GTK toolkit. To get it themed, I had to theme all of GTK with the matching Catppuccin theme. That required a bit of trial and error to get right.

Steam

Steam is worth mentioning, as I have been positively surprised about how well it works on Linux these days. Steam uses a compatibility layer that allows otherwise Windows-only Steam games to run on Linux. This layer is called Proton, and it is based on Wine. The latest game I have been playing is Warhammer 40k: Rogue Trader, which runs great on my machine.

Mac keyboard compatibility with input-remapper

This little piece of software has been a life saver. Since I have used Mac for more than 20 years, I cannot rewire my muscle memory. I even use a Mac keyboard with my NixOS machine. To map Mac keys and shortcuts to their Linux equivalents, I use input-remapper. Since using a Mac keyboard is second nature, the way I went about it was that every time I tried to use a Mac shortcut and it failed, I would open up input-remapper and add the mapping.

What I struggled the most with was getting the input remap to load at startup. I ended up with this in my home.nix:

systemd.user.services."input-remapper-autoload" = {
   Unit = {
     Description = "Input Remapper autoload presets";
     After = [ "graphical-session.target" "input-remapper.service" ];
     Wants = [ "input-remapper.service" ];
     PartOf = [ "graphical-session.target" ];
   };
   Service = {
     Type = "oneshot";
     ExecStart = "${pkgs.input-remapper}/bin/input-remapper-control --command autoload";
   };
   Install = {
     WantedBy = [ "graphical-session.target" ];
   };
 };

Other apps

I use too much software to list all of them. Some of the more notable ones are:

  • Neovim text editor with the NVChad configuration.

  • Hyprpaper wallpaper manager.

  • Sioyek PDF viewer.

  • wlogout logout/shutdown menu (again, building your own kitchen…​).

  • Sunshine to stream the display from my NixOS machine to my Mac using the Moonlight client.

Theming

In modern Unix-terminology, theming is referred to as 'ricing' (a questionable word borrowed from car culture). Hyprland is extremely customizable with CSS-like styling of all aspects of the window manager. I’ve tried to create a relatively minimalistic dark theme based on the Catppuccin color palette. This has required some application-specific theming too, as not all applications can be themed globally. However, most apps have a Catppuccin theme available, here for instance for Neovim. The styling and animations of the windows in Hyprland in my configuration is around 50 lines of CSS-like code.

Reflections

It has been fun, exciting, and sometimes a bit frustrating to set up NixOS and Hyprland from scratch, but in the end it has been rewarding. I now have what feels like an extremely fast and responsive system on relatively old hardware. It is nice to feel completely in control of what is running on the system after having felt my Windows installation slowly deteriorating over time without exactly knowing why. I enjoy trying something different with the tiling window manager, but I don’t know if I am completely sold on the concept yet. I do, however, really enjoy how everything can be controlled from the keyboard. I’m still more productive when using MacOS, but I have more fun when I use the NixOS machine.

Download my configuration

If you want to have a look at my configuration you can download this zip with my setup. Be warned! It comes with zero documentation, it’s made entirely for myself, and it probably breaks numerous Nix idioms.