My Year Of The Linux Desktop

Strangely enough for a Mac/iOS user, I have spent a lot of time using Linux throughout the years, but mostly on servers. Since last year, however, I have started to hedge my bets on what desktop OS I will be using for the next twenty years or so.

By my completely unscientific reckoning, this year I have probably spent well over half my personal computing time using Linux instead of (and the rest was likely evenly split between my and an iPad).

The reasons for that are manifold:

  • I never really stopped using anything or went all-in on any platform except, perhaps, the iPad – and that, despite many wonderful third-party apps, still doesn’t have a proper development environment.
  • I wasn’t as optimistic about as I am now (Apple Silicon largely changed that, but I think the days of my having multiple Macs are over).
  • Electron trash has invaded both my Mac and Windows desktops in several guises, and Linux still has a lot of native applications (there used to be a joke about there being as many Linux desktop apps as widget toolkits, but that’s not quite true anymore).
  • A lot of my personal pursuits are deeply technical, and I can find excellent (and most often free) tools in the Open Source ecosystem – and many of them will likely never run on a Mac either due to their legacy or to Apple’s sandboxing requirements.

So I’ve now been running on three machines for an extended period of time:

  • The where I started testing Fedora 35, which I’ve upgraded all the way to 37 in the meantime and which I use daily as a personal sandbox (now with RDP GPU acceleration out of the box, so I don’t need to do any ).
  • My , which is where I end up doing a lot of my MCU and 3D design/printing stuff, which I also upgraded to 37.
  • My , which has only 2GB of RAM but is still useful as a thin client and glorified typewriter, and is still on 35 because it’s fine that way.

What I Like So Far

The experience has been pretty good for five main reasons:

  • I get the default, vanilla desktop (which I customize to feel just enough like that it is comfortable to use when I’m tired and really don’t want to deal with weird icons and UX conventions).
  • Hardware support has been excellent (as long as you are willing to ignore some quirks like failing to roam between Wi-Fi access points that share the same SSID, and paper over some cracks by forcing the occasional misbehaving USB device to disconnect).
  • There is no shortage of quasi-mainstream applications (and by that I mean , , , and all the development tools I use, especially VS Code).
  • I have made it a key priority to be able to seamlessly move between devices, and most of my environment is standardized (same set of tools across machines) and synced (largely through [SyncThing], but also via some configuration files in git for a few key things). This, of course, works great in a Linux environment.
  • I can use a touch screen on my laptop without offending the UX gods, because Linux doesn’t judge. So there.

There are some critical caveats here, of course.

The first is that I don’t care about office applications, or personal productivity as most people see it because for me, at least, 90% of that is in the cloud or accessible via a browser, and I also won’t be using those while working in Linux – that’s literally not what I want to be doing with it.

Also, as a matter of principle I don’t want to rely on browser-based applications for my personal pursuits–all I want to do is either too close to the hardware or too complex for the kind of web UI that personal and business computing has been dumbed down to.

If you’re an old-time Mac user, the Linux ecosystem is my current equivalent of the pre-App Store days, when you had dozens of amazing indie developers building stuff that was actually useful and filled the myriad of workflow niches you had.

And there are dozens of native apps for the taking, of often surprising quality and polish.

Applications

Obviously, there’s no App Store bottleneck. Well, there is the Software Center, but it conflates software updates with app discovery, so I don’t really consider it a store. It just looks like an app store because everyone decided to ape that model, and application discovery in the Linux ecosystem was a hugely fragmented experience.

It largely works these days, but it’s still clunky and slow and fallible (search, in particular, very seldom works for me). But it has achieved one key goal: it is now much easier to find up-to-date versions of things than a few years ago and application updates through it are painless, so it kinda works like the App Store.

On , when I can’t get the apps I want via OS packages or the GNOME Software Center, they are usually available in flatpak or AppImage formats that I don’t need any weird workarounds to install.

But I still prefer installing things like by converting them to an RPM package, since the flip side is that flatpak can also be a tremendous nuisance to deal with if your software needs any kind of hardware access (or, in my case, the ability to talk to wrappers for VSTs).

And (amazingly) I can run a fair sampling of Windows software pretty well, including music software and games1.

I also don’t have to deal with the madness of snap and ‘s insistence on using it for things like –which is why I decided to try in the first place.

But the main upshot is that, in many regards has made redundant for me, since I get a mainstream experience with minimal tweaking or any deviation from a mainline distribution.

What I Don’t Like

Full disk encryption works, but logging in with two passwords from a cold boot (one for the machine and another for your user) seems archaic in this day and age. Fortunately sleep/resume has been working perfectly for me on my for a while now.

is still opinionated beyond reason, and remains hell-bent on attrition warfare against its users where it regards things like UX choices and desktop themes (which isn’t really to blame for). There’s more than enough for an entire section below.

More generally speaking, it’s harder to find RPMs or even tested package build scripts for some things, whereas .deb files for everything you could possibly want are pretty much everywhere.

Also, the release cycle is an annoyance. In short, upgrading every 6 months feels stupid when you’re used to LTS, and I’ve found that some package repositories I was using just stopped being updated with fixes for “old” releases as maintainers assumed everyone would move to the new release.

Plus I found there is some risk to the upgrade process itself.

The GUI updater, in particular, has a tendency to remove third-party package repositories for some reason, whereas the CLI one allows for more control and prompts you to confirm (some of) what it is about to do.

So I’m going to start upgrading between releases like this:

sudo dnf system-upgrade download --releasever=37
sudo dnf system-upgrade reboot

The only time this completely failed on me so far (yielding a broken machine) was an arm64 container, which is kind of understandable given how much of an edge case it is.

But the overall pressure to essentially risk breaking your desktop every six months reminded me of exactly why I chose to move away from many years ago.

Development Annoyances

Although there are quite a few niceties where it regards fresh versions of language run-times and tooling (I got 3.11 with 37, which is pretty good), the bottom line is that is still better if you’re a developer who needs their tools to “just work”.

A case in point: I needed to compile a small program to a native executable, and I have been using Gambit, which is available in .

But even though the interpreter worked, the compiler is not packaged correctly and failed with:

/usr/bin/ld: cannot open linker script file /builddir/build/BUILD/.package_note-gambit-c-4.9.3-7.fc36.x86_64.ld: No such file or directory

In 37, this is still an issue:

/bin/ld: cannot open linker script file /builddir/build/BUILD/gambit-v4_9_3-devel/.package_note-gambit-c-4.9.3-8.fc37.x86_64.ld: No such file or directory

The Chicken Scheme compiler works, though, and both worked flawlessly in .

This kind of thing (i.e., a poorly tested package) makes me wary of using for developing anything off the beaten path without using containers.

And my woes are not limited to weird language runtimes–I also couldn’t get development tools to work on 36. I lost patience and just installed them in an container with LXDE (which I also use remotely via [RDP]), and haven’t tried them on 37 yet–and likely never will.

For simpler stuff, I make ample use of and images while working in VS Code (which, thankfully, is available as an RPM).

GNOME Annoyances

Like I wrote above, GNOME continues to wage war upon its users by coming up with all sorts of weird UX limitations–it’s as if they wanted to emulate Apple in both simplicity and completely failing to understand what users actually want.

For instance, changing the desktop theme is now almost verboten, and both the icon “dash” and application search are hidden until you hit the Super key and zoom out into workspace management, which annoys the heck out of anyone more sensitive to visual motion and feels completely superfluous.

The UX is just weird sometimes–dialog boxes will pop up behind your applications, and in Fedora 37/GNOME 43 they’ve gimped the Nautilus file manager by taking out an icon size that was a great compromise between size and being able to recognize previews, plus they’ve baked in a “dynamic” grid that leaves enormous amounts of white space between icons.

And it’s buggy. I had a number of issues with toggling dark mode on and off–the Appearance pane in Settings simply refused to switch back to dark mode, including on a fresh test install I spun up just to try to understand what was going on.

Bringing this up in any kind of discussion effectively devolves into an “it works for me” argument (or, more amusingly, an “you shouldn’t customize things” argument, which is just hilarious considering this is Linux we’re talking about).

But the bad habit of hiding file pickers behind the current application and throwing up a notification saying a portal was open (perhaps to some far away land) nearly drove me insane before I fixed it with:

gsettings set org.gnome.desktop.wm.preferences focus-new-windows 'smart'

I guess the default was just… dumb. The rest, so far, I can’t do much about, which is annoying.

As to built-in apps, applications mostly work if you have basic needs, but fall flat on their face if you try to use, say, calendaring or e-mail with any real life online service. Fortunately I don’t really need any kind of conventional “productivity” applications, but it would have been nice to have them work reliably2.

For instance, it is still frustrating to use Geary to even read e-mail, let alone reply to it. I do use it (and really want to like it), but it is still buggy and fiddly and I just cant’t trust it to do more than keeping tabs on a couple of personal inboxes while I’m away from my Mac or iPad.

Desktop Scaling

This is something that is literally in your face whenever you plug in a monitor (and most of mine are HIDPI ones) or open a remote session. There is experimental fractional scaling support on 42+ that you can activate by using:

gsettings set org.gnome.mutter experimental-features "['scale-monitor-framebuffer']"

…but in my experience it just completely broke a number of things, including (for some reason) my mouse pointer, which vanishes after a while.

So I just use this when I have to switch displays:

#!/bin/bash

# Get Current Scaling factor
SCALE=$(gsettings get org.gnome.desktop.interface text-scaling-factor)

# Set what to toggle to
if [[ ${SCALE:0:4} == "1.10" ]]; then
    SCALE_SWITCH=1.25
elif [[ ${SCALE:0:4} == "1.25" ]]; then
    SCALE_SWITCH=1.5
else [[ ${SCALE:0:3} == "1.5" ]]
    SCALE_SWITCH=1.10
fi

# (Optional) Message intentions to CLI and GNOME Notifications
echo -e "Previous Font Scale: $SCALE, Switched to $SCALE_SWITCH"
notify-send "Previous Font Scale: $SCALE, Switched to $SCALE_SWITCH"

# Run switch command
gsettings set org.gnome.desktop.interface text-scaling-factor $SCALE_SWITCH

Putting Lipstick on a GNOME

Despite trying to force libadwaita on everyone, I can still theme enough of the desktop to use it without visual annoyances, and use extensions like Dash to Dock extension to have a proper dock and provide .

The WhiteSur theme I use can, at least for the moment, hide away most of the imperfections and even fix the insane Nautilus icon spacing (and that is exactly why I keep using it):

Yes, it looks very much like macOS Ventura. Or the other way around, you decide.

So my desktop looks (and to some extent, feels) very much like a Mac, except for the lack of global menus (which also killed off ages ago).

This may seem whimsical, but it saves me a lot of hassle when your brain is wired to look for specific UI elements (and even icons) in certain places.

Believe me when I tell you that after a very long working day, when it’s suddenly 10PM and you want to resurrect the brain cells you lost in the corporate struggle by unwinding and perhaps coding a bit, you don’t want to be figuring out where window widgets are or which icon does what.

Aesthetics and polish go a long way towards satisfaction here, and vanilla just doesn’t work for me.

I can also use Kvantum to apply the same theme to apps (which can feel notoriously alien on any platform), although I keep forgetting to do this:

echo "export QT_STYLE_OVERRIDE=kvantum" >> ~/.profile

But there’s a bit of a risk here: Like anyone who’s been using a certain kind of computing environment, I rely a lot on visual cues and desktop polish.

So if keeps pushing the (pretty ugly to my eyes) libadwaita look and making it hard to theme the desktop in a way that makes sense to me it just might force me to look elsewhere–and that is perhaps ‘s Achilles heel as far as I’m concerned.

After all, development environment issues are things I can work around, and they’re part of what I expect to happen in a computer given what I use it for.

But UX issues get personal, and my use of was driven largely by its design and end-to-end UX polish. But I do have alternatives–even simpler mainstream ones.

I’m not really interested in using LXDE at this point, but I am keeping an container with an LXDE desktop on hand, just in case…

Extensibility

The nice thing about using Linux is that (even in ) it is so much easier to do little tweaks to your desktop experience than in . There are just enough GNOME extensions , and even though they are sometimes poorly maintained, at least the barrier to entry is non-existent.

For instance, since most of what I do in these days is around development and 3D printing, I ended up hacking together my own set of file thumbnail generators for .blend, .3mf, .stl and .scad files, which I will eventually extend for some common kinds of assets.

Doing that kind of thing on the Mac would have been… interesting these days.

Going Forward

I have been thinking about buying or building a desktop PC, and have been noodling in the crazy (and perhaps non-existent) intersection of high thread count CPUs (a Ryzen 9 would be nice), exorbitantly priced GPUs (a topic that’s been beaten to death, but one I want to tackle because I really want to be able to do some modern ML stuff), quiet fans, and efficient power consumption.

I really don’t know what I will be getting since I have been looking at various Ryzen 6900HX mini PCs as well as “normal” desktops. Form factor is just a minor thing here, since I am happy enough with to just stick the thing into a closet.

But I am 99% sure that if I get it anytime soon, it will run , and I guess that is about as good an endorsement for Linux on the desktop as I’ll ever write.


  1. I am occasionally surprised by how well some low-level stuff works under WINE and still pop into Steam now and then, but those are outliers in daily usage. ↩︎

  2. I blame evolution-data-server for most of this, but then again I’m biased since I spent far too long fighting it during my years as postmaster. ↩︎

This page is referenced in: