Gnu-linux minimalistic logo (CC-BY-SA-4.0), Cocktail Orange Drink (Public Domain)

Since I've been using Linux as my daily driver for a while, I thought it might be useful to write a small handbook to help demistify how to live your Linux desktop journey without sacrificing a good UX. Especially on Reddit, there's so much silly noise that makes it hard to focus on what really matters when using computers to "get stuff done".

This article is dedicated mostly to new Linux users, but who knows, maybe you'll learn a trick or two nonetheless. Note that this post will keep being updated as I keep discovering stuff!

NOTE: My shift towards using Linux more and more has been motivated by having worked at Apple and coming changed after that experience. See Reflections on 20 years of computing.

Choosing the distro

For newcomers

If you don't know what a distribution (aka distro) is, think of it as a collection of opinionated programs that drive the philosophy of how the OS handles updates, etc. That's because Linux is the Kernel, which is just one piece of the modular computing experience you have on a Desktop PC. Without getting too technical: Kernel (Linux) + distro (e.g. Fedora) + Desktop Environment (e.g. Gnome) = A modern OS experience.

If you didn't know what a distro was before this small definition, then just pick Fedora, Linux Mint or Ubuntu. Simply choose it based on how much you like their websites and forums, since that's the place where you'll spend most of your time anyway.

For intermediate users

If you care about picking "the right distro", then you probably already known what to pick since you spent a good chunk of time on tech blogs and subreddits to find out the perfect computing environment for you. In my experience, it boils down to:

  • Do you want a DIY install-only-what-I-want distro with great docs? -> Arch Linux
  • Do you want to have a perfectly reproducible setup that will cost you countless nights and is not really that practical? -> NixOS
  • Do you want something tailored for gaming? -> CachyOS or Bazzite
  • Do you care about Software Freedom and want something stable? -> Debian or Fedora Workstation
  • Do you care about having highly optimized binaries? -> Gentoo
  • Do you have a System76 machine? -> Pop!_OS
  • If you got here.. how about OpenSUSE ?

Choosing the Desktop Environment

Linux folks like to offer as much choice as possible. This means that unlike Windows and macOS, generally on Linux you can customize your Desktop Environment based on your needs. Without going needlessly technical, a DE defines the UX and look of the OS that you actually interact with every day. Think of a DE as the native look and feel of the graphical user interface (GUI) of the OS (windows, decorations, dock, etc.). Note that some distros might choose to support one DE only, like Ubuntu and GNOME.

My extreme summary is as follows:

  • Do you want to heavily customize the looks of your desktop? -> KDE Plasma
  • Do you want good, but opinionated defaults? -> GNOME
  • Do you want to try something fresh and new but still in beta? -> Cosmic DE

On the technical side, it's worth mentioning the UI toolkits that back up each DE.

I personally tried all of them, and with time I've grown to like both KDE and GNOME for different reasons. GNOME looks really nice and polished out of the box, so for folks coming from macOS it might be a good alternative. What I don't like is that to even lightly tweak themes, wallpapers or icons I need to install an extra app (Tweaks). And even then, GNOME isn't really that customizable.

KDE, on the other side, can look a bit "ugly" out of the box, but with a little bit of effort can get quite pretty (and less "generic-looking"). That's because it has customization built-in (from extra widgets and toolbars to custom icons, themes, etc).

Regarding Cosmic DE, I loved it when it was in Alpha, and I think it's still a nice choice (I still have it as an option on my Arch machine). However, I don't know how ready it is for more casual everyday usage. I'm happy it exists because it will push forward the boundaries of the Rust GUI ecosystem, but it's not quite there yet, imho. Its customization options are also somewhat limited, a bit like GNOME.

If you want to hear more opinions, here's another interesting take on the difference between KDE and GNOME: A highly personal take on KDE vs. Gnome over two decades (René Mayrhofer)

An example of how Dolphin (file explorer) looks like in KDE

An example of how Files (file explorer) looks like in Gnome

A few of the many icon themes available on KDE:

Tweaks, the main app to customize appeareances on GNOME

(KDE) An example of how the top toolbar can look like:

(KDE) Same toolbar, but using Tela Dracula Dark icons:

Tiling window managers

I also played with tiling window managers like Sway (see Setting up Sway on a new machine) but I would never recommend them to folks that don't spend most of their time programming or tinkering. You're definitely gonna impress your friends, but I'm not convinced of their usability for more casual users.

Installing apps

For newcomers

To install new apps I'd recommend to use Flatpak, which is neat way to package apps in a way that is agnostic from the distro. It also improves security by providing a sandboxed environment for your app, allowing you to understand on a more granular level what permissions are required by an app.

The website (https://flatpak.org) will guide you on the correct installation for you distro of choice. To browse the available apps using a web GUI, go to https://flathub.org.

On Fedora, you can browse Flatpak applications via the Software app.

For intermediate users

Once you're a bit more familiar with the terminal, Id' recommend using the flatpak CLI directly:

  • You can search for apps via flatpak search $name-of-the-app.
  • You can list your currently installed apps via flatpak list.
  • You can launch existing apps via flatpak run $id-of-the-app.
  • You can see where an app is installed via flatpak info --show-location $id-of-the-app

Tips and recommended apps

What follows below is a collection of tips and applications that you might find useful for you day to day needs. I tried to add as many keywords as possible so that you can just search the page for what you need instead of reading everything top to bottom.

Gnome tip #1: Fix white window title bars even if you have a dark theme

For this tip I actually need to thank leandrokemp from Reddit.

I had this problem on Emacs and Localsend. Even if I had the dark theme selected, the window titles were still displayed in white, which looks pretty darn ugly:

To fix this:

  • Install the Tweaks app
  • In Tweaks, go to Appereance -> Styles
  • In 'Legacy Applications', choose 'HighContrastInverse' instead of Adwaita (default)

Now your titlebars will look like this:

Not perfect, but now at least they don't stick out as much.

Tested on: Fedora 43.

Gnome tip #2: Run a binary from the application launcher

This can be useful if you want to quickly run binaries from the Launcher. For example, say you want to just type CMD + Unreal then hit enter to run Unreal Engine in a terminal.

The first thing to do, would be to create a .desktop entry in ~/.local/share/applications, like this: touch ~/.local/share/applications/UnrealEngine.desktop

Then you'd update it with the Binary to execute and an icon. For example:

[Desktop Entry]
Name=UnrealEngine
Exec=/home/some-user/Documents/unreal/Engine/Binaries/Linux/UnrealEditor
StartupNotify=true
Terminal=true
Type=Application
Icon=/home/some-user/Documents/unreal/Engine/Plugins/VirtualProduction/Switchboard/Source/Switchboard/switchboard/ui/images/unreal_logo.png

To validate that the desktop file is formatted correctly, run desktop-file-validate against your file. For example:

desktop-file-validate ~/.local/share/applications/UnrealEngine.desktop

For further debugging, you can use gio launch ~/.local/share/applications/my-app.desktop or gtk-launch my-app to see if the app can run fine.

If you want to use a GUI app to create these .desktop entries, you can use App Editor

More on this: https://wiki.archlinux.org/title/Desktop_entries

Photos

Annotations, crops, etc.

To quickly crop or annotate a photo (just like I would do using the "Preview.app" on macOS), Gwenviewer works great for me. On KDE it comes preinstalled.

Install it via Flatpak:

Live annotations

If you're doing a demo and you would like to quickly annotate your screen, Gromit-MPX is terribly useful. You can also start it manually from the terminal, which is great (also, on Gnome it doesn't seem to be able to attach itself to the system tray).

So for example, in terminal 1 I'd start the main process: gromit-mpx.

Then in terminal 2 I'll toggle the annotations on: gromit-mpx --toggle (-t for short). Then I can press left click on my mouse to draws annotations anywhere on the screen, while right click acts as an eraser.

To clear the whole screen quickly, you can run gromit-mpx --clear (-c for short).

Install it via Flatpak:

Screengrabs

On macOS I loved just quickly using CMD+Shift+4 and CMD+Shift+5 to quickly make screengrabs and screenrecs.

Turns out that in KDE it's also veeery simple to setup a similar integration!

For example, using KDE and Spectacle as the screen recording app, I can just add custom shortcuts by going into System Settings > Shortcuts and selecting Spectacle as the app to customize.

See also: https://userbase.kde.org/Spectacle/Tutorials/Invoking_Spectacle_with_custom_shortcuts

For GNOME instead go to Settings -> Keyboard -> View and Customize Shortcuts, then search for 'Screenshot' and customize as needed. For example:

Sharing files

Localsend

This is a great alternative to Airdrop, assuming you can connect to the same WiFi.

Install it via Flatpak!

If you have ugly window decorations and you're on KDE, run this: flatpak --user override --env=GTK_CSD=0 org.localsend.localsend_app. For context, see: https://github.com/localsend/localsend/issues/1922

Privacy

Encrypting files locally

If you just want to quickly encrypt a file with a password, just use gpg (if it's not preinstalled on your machine, install it via the package manager of your distro).

For example: gpg -c myfile.pdf.
Then, type in the password when prompted to. An encrypted myfile.pdf.gpg will be created.

To decrypt the file, use gpg -d myfile.pdf.gpg > myfile.pdf.

Masking Emails

The Apple ecosystem has a neat feature to keep you from constantly sharing your main email: private relay. Luckily, Mozilla offers a similar (and imho, superior) experience via Firefox Relay.

Basically, not only you can use one-off autogenerated emails to sign up for random online services that you don't trust, but you can also have a few custom aliases. The entry level tier is free, but for 2 bucks a month you get a few very useful options, like being able to reply to emails you received via the relay. Their Firefox browser extension is also pretty useful.

Overall I've been using it for a while and I absolutely love it! https://relay.firefox.com

Writing

Markdown viewer: Apostrophe

A simple way to preview rendered Markdown.

Install it via Flatpak:

Terminal tips

Copy/Paste

If you used macOS, you're probably used to pbcopy and pbpaste in order to copy/paste things from the clipboard. On Wayland you can use wl-copy and wl-paste.

For example:

$ echo -n 'hello, world' | wl-copy
$ wl-paste
hello, world

Strip exif metadata

Sometimes you want to share online a photo that you took, but don't want to disclose too much information. For example, the exact GPS coordinates of where you took the photo!

I generally use exiftool for that, and I have this small bash function in my ~/.bashrc:

strip-non-color-metadata(){
    exiftool -all= -tagsFromFile @ -color= "$1"
}

So then I can just do strip-non-color-metadata my-file.png and share it online.

Happy hacking! :)