An(other) attempt to move to Wayland on my nVidia desktop
I recently found myself with a few days off and some time to spare to upgrade (or rather downsize) my desktop PC. The last few months it gathered a bit of dust, as I mostly worked on some lightweight projects or on my servers from my Macbook Air. While I do love its hardware, I resent window management on MacOS. AeroSpace makes it bearable, but it ultimately can only be a bolt-on solution due to the limited MacOS API surface. To see if the grass on the other side of the window management fence is actually greener and to scratch the itch of toying around with some hardware, I layed down the following plan.
Hardware
I wanted to make a bit of room in my office and downsize my PC from an ATX case (Corsair 4000D Airflow) to a smaller case. As I’ve already gone for a mATX-board within that case, I went looking around for a small mATX option to not break the bank by changing out all of my components. The most compelling (for me, as it was the smallest) option came from Jonsbo. I’m already using one of their cases for my self-built home server and am generally pretty satisfied with it, so I went with the C6. I’ve heard of some issues with the airflow - especially when using it with an ATX power supply - but ultimately pulled the trigger because of its size. If there are issues with it I might buy a SFX power supply to mitigate those problems.
The only non-compatible hardware component I owned turned out to be my CPU cooler, a huge Noctua NH-D15 air cooler that I switched out for a smaller Noctua NH-L9x65 as the case only allows for about 8-9 centimeters of clearance when using an ATX power supply.
The C6 can’t accomodate full size graphics cards, which did not present an issue, as I am currently owning a small form-factor nVidia RTX 3060Ti (which I want to change out for an AMD card down the line). This card - and its predecessor, my GTX 1070 - proved to be the showstoppers last time I’ve tried to switch to Linux and more specifically Wayland.
Software
Which brings me to the software I use. I’ve always liked working with Tiling Window Managers since my first experiment with them on my Dell XPS 13 a few years back, where I mainly used i3. At that time I routinely travelled 5-6 hours by train, often without the option to charge a device during the ride. The Dell was not up to the task, so I went for an ARM-based Macbook. To still taste the sweet nectar of tiling window management, I first used yabai and not long after switched to AeroSpace.
Over time I grew frustrated with some aspects of MacOS, though and yearned for change. It is currently not economically viable for me to switch my notebook back to an x86 device running Linux even though my battery life requirements have loosened. The next best device to experiment on - besides the aforementioned servers, with serve a wildly different use case than my personal computing devivces - was my desktop PC.
I was a bit hesitant to begin working on that, because of some failed attempts in the past. Not to go too much into detail, there were a few things that made me switch back to Linux everytime:
- My nVidia-based graphics card together with the desire to not run X11
- Playing League of Legends with some of my old friends, especially with the introduction of Vanguard, killing any hope of running it on Linux
- Using Lightroom to edit the photos I am taking
Over time some of that changed:
- Greatly improved nVidia support for Wayland
- Playing fewer games in general and if so, mostly those that are also available on my Steam Deck
- Moving to Photomator on MacOS to edit my photos
Lastly, I’ve always closely followed some Linux communities and took note of niri. The idea of a scrolling window manager seemed interesting, so I yearned to try it out. The project included some nVidia-specific documentation which gave me the confidence to try it out with my setup.
In addition to that, I had great success with using NixOS on my servers (and nix-darwin on my Mac) and wanted to use it on my desktop, too. Ultimately I’ve settled on these tools:
- NixOS as the base OS, for declarative package and device management
- niri as the window manager
- ironbar, due to its accessible but extensive configuration options
- fuzzel, due to its simplicity and dmenu mode
- swaync, due to having a configurable control center
- awww, due to its runtime-based wallpaper management
The only issues I’ve found so far were with Wezterm. It started lagging a lot after being open a few minutes, probably because I am using nVidia. I did not want to disable Wayland in its configuration due to other issues, so I went with Ghostty instead. So far I cannot report any problems with it. The only thing I’ve lost is some of my custom Lua config that is not replicable in Ghostty, especially concerning session/project management. As I do not want to go back to using tmux for that, I approximated my previous setup with a fuzzel script (more on that in this blog post). So far I did not run into any non-solvable problems and am pretty happy with niri as well. Steam games run well with Proton and I switched to using GIMP and Krita for some creative endeavours, which eased the transition as well.
Even the dreaded nVidia support was as simple as enabling (my nix-config is currently private, but I am going to update this article as soon as I made the repository public for reference):
hardware = {
graphics.enable = true;
nvidia = {
modesetting.enable = true;
powerManagement.enable = false;
powerManagement.finegrained = false;
open = true;
nvidiaSettings = true;
package = config.boot.kernelPackages.nvidiaPackages.stable;
};
};
};
Overall I feel more in control of my computing environment again and less bound to the decisions of some multi-national corporations. If this experiment proves to be a success, I am planning to move all of my computing devices back to Linux in the coming year.
An escape hatch
To be truthful, I still have two escape hatches at the moment. Should the need arise to run some software (or a software alternative) that is not available on Linux, I can fall back to my Macbook. Also, for the occasional game that does not run on Linux due to kernel-level anti-cheat, I’ve purchased a small, inexpensive 256GB M.2 SSD. I’ll track how often I am booting into it over the next few months. If that number is low enough, I might repurpose it as a boot drive for my home server and look for a larger drive to extend the space for the OS I actually want to work and play in.