Software I use
Below are links to some of the software I'm using on my PC in 2024.
I prefer software that has a CLI or TUI, is highly configurable and extensible, is configured using a plain text file, stores data in plain text files, is open source, has relatively few dependencies, has low CPU and memory usage, and runs background processes only when needed.
This page excludes software I use solely for professional work.
Operating system
The operating system I use on my PC is Fedora. I like Fedora because its developers seem to prioritize security (e.g., SELinux by default) and its package repos have recent versions of nearly all of the software that interests me such that I don't need to install less trustworthy packages (AUR, PPAs, unverified Flatpaks, etc.) or install software from source to the extent I did in the past.
I perform minimal installations of Fedora (e.g., no desktop environment) using the Fedora Everything installer with the Fedora Custom Operating System option. Afterward, I configure my system using an idempotent Bash script I wrote named configure, which I run daily.
One thing I don't love about Fedora is that it seems to be aimed at casual users to a greater extent than Debian, the operating system I used on my PC previously. For example, to perform a desktop installation without a desktop environment (a common practice among Debian users), a Fedora user must use an alternative installer that is unintuitively named Fedora Everything, is not included with the dozens of installers shown when clicking the "Get Fedora" link on Fedora's home page, is relegated to a page for miscellaneous installers, and is not mentioned on the Getting Started or Downloads pages in Fedora's docs.
Display manager
I don't use a display manager (a.k.a. login manager) because I think they're unnecessary. Instead, after my system boots, I log in via the Linux console and run startx.
Window manager
I use a stacking window manager named Openbox. See my Openbox config.
I prefer stacking window managers to tiling window managers because I like to Alt+Tab between apps that are optimized for full-screen display (e.g., Firefox with tabs in a wide sidebar).
I haven't gotten around to trying a Wayland compositor that supports stacking window management (e.g., labwc, Wayfire and hikari) because I'm so satisfied with Openbox.
Desktop notifications
I use a desktop notification daemon named Dunst. See my Dunst config.
Taskbar
I don't use a taskbar because I think they're unnecessary and a poor use of screen real estate.
When I want to view a list of open windows, I do so by pressing Alt+Tab, which is bound to Openbox's window switcher via my Openbox config.
When I want to view other information typically displayed on taskbars, I use a key binding specified in my Openbox config to run my Bash script named status, which displays the time, date, CPU usage and memory usage as a desktop notification.
Application launcher
I don't use an application launcher because I think they're unnecessary. Instead, I start GUI apps via my Bash aliases, which use my Bash script named background to run the apps as background processes.
Terminal emulator
The terminal emulator I use is xterm. I like that xterm has much lower input latency than most terminal emulators (see benchmarks here and here). I configure xterm by loading my X resources using xrdb via my .xinitrc.
Other terminal emulators that are said to have low input latency include mlterm, Zutty and foot. I haven't tried mlterm or Zutty because they weren't in Fedora's package repos when I checked, and I haven't tried foot because it supports Wayland only and I still use X11.
Command shell
The command shell I use is Bash. The main reason I use Bash instead of an alternative like Zsh or Fish is that there is an excellent linter named ShellCheck that supports Bash scripts but not Zsh scripts or Fish scripts. I don't want to write my shell scripts without ShellCheck (see my ShellCheck config) or using a more verbose language like Python, and I dislike switching between one shell for interactive use and a different shell for scripting.
A second reason I don't use Zsh or Fish is that many people seem to prefer those shells for their history and completion functionality, and I don't need those features. I don't need advanced history features because I save useful commands to a collection of text files from which I select commands using my Bash function selectcmd, which I execute via a Readline key binding. I don't need advanced features for completing paths because I select long paths using a fuzzy finder named fzf. And I don't need advanced features for completing command options because I select option-heavy commands using selectcmd. While I don't make extensive use of completion, I improve Bash's completion using a collection of completions named bash-completion.
Another reason I use Bash is that it's adequately configurable (see my .bashrc). In comparison, Fish's docs state that configurability is the root of all evil, and Fish's autosuggestions couldn't be disabled until 2021, over nine years after they were introduced.
POSIX utilities
I use implementations of POSIX utilities that are installed by default on Fedora, including GNU coreutils, Bash builtins, etc.
When I run POSIX utilities interactively, there are certain options I always want to use and I specify them in my Bash aliases.
Sometimes I extend the functionality of POSIX utilities by writing Bash scripts (e.g., relocate and remove).
Occasionally I use alternatives to POSIX utilities (e.g., see next section). I don't use alternatives whose primary purpose seems to be adding more colors to output (e.g., bat and exa) because I prefer fewer colors (e.g., I think syntax highlighting is unimportant).
File search
I search for files using a find alternative named fd, a grep alternative named ripgrep, a PDF search tool named pdfgrep, a fuzzy finder named fzf and an fzf-powered Emacs package named fzf.el. See my fzf-related environment variables and my fzf.el config.
The main reason I use ripgrep and fd instead of grep and find is faster search results. See benchmarks in ripgrep's docs and fd's docs.
Another benefit is that ripgrep, fd, fd-powered fzf and fd-powered fzf.el all exclude files listed in .ignore files (see ripgrep's docs and fd's docs).
Find and replace
I find and replace text in files using my Bash script named replace, which searches for a pattern in files using ripgrep and replaces matches using a sed alternative named sd.
A benefit of using ripgrep and sd together is that they both use the same regular expression engine. Another benefit of sd is that its multiline replacements are less verbose than GNU sed's multiline replacements.
Backups
rsync with hard links for file deduplication
Process viewer
The process viewer I use is procps top (not to be confused with the original top by William LeFebvre or other implementations). See my top config.
A popular alternative to top is htop, which I used for several years mostly because it seemed that everyone was using it. I stopped using htop because top does everything I need it to do and it's installed by default on Fedora and Debian, which are the two operating systems I use the most.
Text editors
The text editor I use is Emacs. See my Emacs config (e.g., packages I use).
Not only is Emacs my favorite text editor; it's my all-time favorite app. I use Emacs for note-taking, spreadsheets, to-do lists, calendar, email, calculations, batch renaming, version control, static site generation, programming and more.
Note-taking
The note-taking software I use is an Emacs package named Org, which has a ton of cool features and is highly configurable. See my Org config.
Org files are written using a lightweight markup language that is much more powerful than Markdown. For example, as I mention in the next section, Org supports plain text spreadsheets, a feature I love.
My dissatisfaction with other note-taking solutions is what caused me to start using Emacs and Org years ago. I now have several thousand Org files containing my notes.
Spreadsheets
The spreadsheet software I use is Org. Org spreadsheets are plain text and lack many features of other spreadsheet formats, but my personal spreadsheets include small data sets on which I perform basic calculations, and Org is perfect for such spreadsheets.
I love that Org allows me to insert spreadsheets into my Org files that also include my notes. Before I started using Org, I had to keep my notes and tabular data in separate files, edit those files using different apps and include refererences to spreadsheet files in my notes.
Task management
Org is my favorite task management software (not to be confused with task managers). It's the most feature-rich software I've found that supports plain text to-do lists.
One feature I use a lot is the ".+" repeater, which repeats a task a specified amount of time after it was completed (not scheduled to be completed). Surprisingly, very few of the task management apps I've evaluated have this feature.
I use an Emacs package named org-wild-notifier to get task notifications. I prefer it to the package org-alert because the latter sent notifications nonstop for day-wide tasks until such tasks were marked as completed, which is crazy.
Calendar
The calendar software I use is Org. It collects the scheduled tasks from the to-do lists in a user's Org files and displays the scheduled tasks in an agenda view that is like a calendar. See the agenda-related settings in my Org config.
I love using Org for my calendar and to-do lists because it allows me to manage my scheduled and unscheduled tasks together in the same files using the same software.
Email client
The email client I use is an Emacs package named mu4e. It's easy to set up compared to other Emacs-based email clients (e.g., Gnus). See my mu4e config.
One of mu4e's many benefits is that it uses maildir, my favorite email storage format. Each message in a maildir directory is stored in its own file, and I prefer this because my favorite backup solution is rsync with hard links for file deduplication, which doesn't work well with large, frequently modified files (e.g., mbox files).
I send plain text emails, and most email clients insert newlines into plain text emails before sending them to prevent lines from being longer than 78 characters. Such newlines cause undesirable line wrapping on screens that are too narrow for 78-character lines. One solution is format=flowed (see RFC 3676). Unfortunately, format=flowed is supported by only a few email clients. The solution I use is to configure Emacs to allow lines in emails to be up to 998 characters, which is longer than any paragraph I would write.
Calculator
The calculator I use is an Emacs package named Calc (not to be confused with calc).
File manager
The file manager I use is an Emacs package named Dired. See my Dired config.
My favorite Dired feature is Wdired mode, which I use for batch renaming, and I prefer it to dedicated batch renamers.
Version control
I use Git via a Git client for Emacs named Magit. See my Magit config.
I'm a CLI enthusiast, but I prefer Magit to the Git CLI because it's much easier to stage and unstage hunks using Magit.
Web authoring
I author static web pages for personal sites using the best tools for each site, which might be Org files (e.g., uses/index.org), Bash scripts (e.g., SCRIPT1 and SCRIPT2), plain old HTML files or a non-Emacs-based static site generator (e.g., Astro).
I format my HTML, CSS and JavaScript using a Node.js package named Prettier via an Emacs package named format-all. I like that Prettier has zero dependencies, unlike most Node.js packages I've used.
When I'm not using a static site generator that includes a minifier, I minify my HTML and CSS using a Go package named Minify (not to be confused with Minify, Minify, etc.). Other minifiers I've evaluated have issues. For example, html-minifier and htmlmin are unmaintained, minify-html can produce invalid HTML, and html-minifier-terser has most of its options disabled by default (which required me to specify 19 options in every build script in which I used html-minifier-terser).
I validate my HTML and CSS using vnu, the only validator recommended by WHATWG when I last checked. vnu isn't packaged for Fedora, so I download it from upstream via my system configuration script.
Web browsers
I use Firefox for most of my web browsing because it's more configurable and extensible than other web browsers.
I configure Firefox using my user.js, userChrome.css and userContent.css. I use the settings panels only when necessary (e.g., cookie and site data exceptions).
Two examples of Firefox's extensibility are the extensions Tree Style Tab and Sidebery, which are similar to an extension for Chrome/Chromium, named Tabs Outliner but with features that Tabs Outliner is incapable of.
The Firefox extensions I use include Tree Style Tab, Tab Session Manager, Auto Tab Discard, Return YouTube Dislike and uBlock Origin. I prefer Tree Style Tab to Sidebery because when I tried the latter, I couldn't fully replicate the effect of these two Tree Style Tab settings: the option "When the current tab is closed as a last child" being set to "Focus to the previous tab in the tree" and the option "Move focus back to the opener tab if possible" being disabled.
I prefer to log into my accounts using a different profile than the one I use for web browsing, so I use Chromium for logging into accounts. The reason I don't use a second Firefox profile is that it's easier to Alt+Tab from a non-browser window to a specific browser profile when each profile is associated with a different app icon. Alternatively, I could use two Firefox profiles and run them on different virtual desktops (a.k.a. workspaces) that each have their own unique key binding, but since I almost always open multiple windows per browser profile, I would need to use those key bindings and also Alt+Tab, which is worse than just using Alt+Tab.
Password manager
I use a CLI password manager named pass. I run pass via my Bash scripts pass-generate, pass-show, pass-edit and pass-use.
Image editors
For professional work, I use whichever image editors my team uses, but for personal tasks, I mostly use GIMP and ImageMagick.
Most of my image editing involves prototyping modifications to photos and screenshots in GIMP and then reimplementing and finalizing my changes using ImageMagick commands in Bash scripts. Using scripts for image editing allows me to easily tweak an image later (e.g., years later) by quickly editing and rerunning the associated script.
One area where GIMP and ImageMagick are lacking is ICO files, which are image containers that are commonly used to store PNGs (e.g., favicons). ICOs created by GIMP are too large because the PNGs aren't compressed well, and ICOs created by ImageMagick are even larger because the PNGs are converted to BMPs. So I create ICOs using a dedicated ICO creator and one or more PNG optimizers. Of the 24 command-line ICO creators I've evaluated, the best are icoutil, go-png2ico, icopack and pngs-to-ico.py, which create equally small ICOs. And of the six PNG optimizers I've tried, the best are Oxipng (lossless) and pngquant (lossy).
Image viewer
The image viewer I use is gThumb, an app from the GNOME community. gThumb is adequately configurable (see my gThumb config) and this surprised me because none of the GNOME apps I've used are adequately configurable. I later read that gThumb is not an official GNOME app. That explains it!
I also like the image viewer XnView MP, which is the only closed-source software I've included on this page. XnView MP supports tabs, a nice feature that gThumb lacks. But XnView MP's support for AVIF was broken on Linux when I last checked, and AVIF support is more important to me than tabs.
Video player
I use a CLI video player named mpv. See my mpv config.
I like that mpv has a seekbar, unlike other CLI video players I've used (e.g., MPlayer and ffplay).
Audio player
I don't listen to music while using my computer because it hinders my concentration, but I do listen to my favorite white noise MP3 using a CLI audio player named mpg123. I start/stop mpg123 using my Bash script named toggle, which I run via a key binding specified in my Openbox config.
PDF viewers
I read PDFs using zathura. It renders text well (especially with the zathura-pdf-mupdf plugin), it remembers the last viewed page of each PDF (unlike many PDF viewers for Linux), it uses a plain text config file (see my zathura config), and it makes maximum use of screen real estate by not having a menu bar or toolbar.
I use a PDF viewer named Evince to search in PDFs because it provides a clickable list of search results, a feature that's missing in zathura and most PDF viewers. I don't use Evince for reading because it needs GVfs to remember the last viewed page of each PDF, and unfortunately, GVfs runs multiple background processes.
I wanted to use an Emacs-based PDF viewer named pdf-tools because I love using Emacs, but memory usage was far too high (e.g., 2GB).
Hypervisor
I use a CLI hypervisor named QEMU to evaluate new releases of Linux distributions and test my system configuration script. I run QEMU commands via my Bash function selectcmd.