I had experience with GNU/Linux before 2019, but this year is really when I’ve gone balls deep into learning as much about the Unix-like experience. And that’s both in terms of the time-tested, battle-forged tools like sed, grep, awk, and vi(m) as well as the accoutrements of the modern Unix ricer. I thought it would be fun to outline some of what I’m using right now. The links are mostly to the github repo or the archlinux wiki of said program or system. If you are a noob I advise using your distro’s package manager to install most programs. For suckless programs you should clone the git repo because the links on suckless.org are usually out of date.
When it comes to software I look at five factors, in decreasing scrutiny:
- A productivity ceiling as high as possible
- This becomes most important for the most important things - tools I’m using a lot such as text editors, file managers, and web browsers.
- Growing up I was big into Halo (though I’m not much into gaming anymore). Whenever a new Halo game came out I would always play on Legendary. I don’t mind a steep learning curve as long as the payoff is worth it.
- Free and open source
- Free and open source is generally higher quality and easier to trust.
- Useful FOSS projects tend to survive or get forked and surive in spirit - time investment to learn a popular FOSS tool is rarely wasted.
- Follows UNIX philosophy
- Modularity and extensibility are the two important points in my book.
- Fast and light on system resources
- I like programs that do less work faster while getting the same result.
- Ease of Configurability
- I prefer file or environment variable configuration to code-as-configuration. The former two are less chaotic and easier to version control.
- With Suckless programs I often create config files to be ingested by the program. This limits the degrees of freedom of the configuration to something sensible and makes the system less chaotic.
System
Shells / Scripting
- bash: Bourne Again Shell. My login shell, I use it because it is ubiuitous, easy to use, and I don’t need most of the features of later shells. I wouldn’t mind looking into a C-Shell-like shell such as tcsh though.
- dash: Debian Almquist Shell. My default shell (/bin/sh) - good for speed because it strives to be narrowly POSIX compliant.
- xonsh: A cool Pythonic shell. I don’t use this as my main login shell, but it’s useful to remap it to a floating window and use it for short one off things (calculations and whatnot). Better than a Python interpreter because of easy access to the filesystem and ability to use bashisms along with Python syntax.
- coreutils: Not much to say about these bad boys that we don’t already know (RTFM). I’m using the GNU coreutils on my primary Arch Linux system. Occasionally I use an Alpine Linux system which uses busybox as its coreutils implementation; 9base is another great coreutils implementation that is based on Plan 9 Unix. I use Musl Void Linux (not-GNU) and Debian (GNU) systems occasionally. It doesn’t really matter what coreutils or default shell any system I am on uses because I always attempt to conform my shellscripts to POSIX spec for speed+portability.
- shellcheck: A great shell script linter.
- jq: Commandline json parser, I love JSON as a data interchange format so I use this often.
System Admin
Resource Monitors
- htop: Terminal system resource monitor, this is what I use primarily for basic process management. I just wish there was a way to open it in tree view with all the leaves under the root process collapsed. In the future I may try getting into nmon more.
Files / Disks
- rsync: Remote sync utility. One of the most useful unix tools out there. I use this often to in basic directory backup scripts, I’m thinking about using udev to automate my backups even more.
- parted: What I use to repartition drives.
- git: I use Git for version control. I am proficient in it and yet have much to learn about its nuances. I generally keep things simple to avoid problems. The Oreilly Git Pocket Guide isn’t a bad reference.
Networking
- NetworkManager: What I use to manager my network, with wpa_supplicant under the hood. On small systems that won’t move often (eg rpi) I just use plain old wpa_supplicant for wireless networking. I have used connman a bit on my void linux rpi system, it is nice but it doesn’t use significantly more resources than NetworkManager and the NetworkManager’s ncurses UI worked better than the connman ncurses package. In the future I wouldn’t mind switching to connman entirely. For now NetworkManager is comfy.
- arp-scan: I only use this to scan my local network (
sudo arp-scan -l
), pretty useful for that purpose. - openssh: What I use for enabling SSH support (sshd) on my servers and embedded systems.
Graphics
- optimus-manager: A good switchable graphics solution. Very easy / straightforward to use in shellscripts. I did have a major problem with it once after an update where I had to chroot back into my system to fix it (even tty didn’t work), but I figured out why it happened: make sure conda is deactivated if/when you update this AUR package, otherwise optimus-manager’s python modules may end up where conda packages are located instead of where system utilities are (where they should be).
- nvidia-dkms: Proprietary nvidia graphics driver. DKMS (kernel module) versions of packages work well with kernel upgrades, I prefer them when available. The only bad thing about the nvidia driver I experience is horrific screen-tearing. I have found Xorg options that fix them (namely switching
ForceCompositionPipeline
,Tearfree
, andTripleBuffer
on), but they break my multi-monitor setup so I’m looking into other solutions on the low.
Graphical / UI
- st: The suckless terminal emulator; a nice minimal terminal emulator.
- i3-gaps: I’m currently using i3-gaps as a WM - it is a slight fork of i3 with a few additional features, most notable being the gaps between panels. I’d like to move to something a little more ordered and less-adhoc than i3* in the future. XMonad seems cool and I’ve been playing around with DWM, but for the short-term future i3-gaps works well enough as a tiling WM for my purposes.
- lightdm: Light display manager, gives a nice graphical login to X11 (instead of having to startx from a tty). Additionally restarting the lightdm service gives me a way to create the logout function because lightdm is underneath the graphical environment.
- compton: A fork of xcompmgr (which I used before compton), this is what I use for window transparency and eliminating screen tearing.
- sxhkd: Simple X hotkey mapper daemon. Works well and is easy to reconfigure.
- polybar: A recent addition to my rice - I switched from i3blocks/i3status to a polybar statusbar. It looks great and is very responsive. One of the easiest and most extensible X11 ricing programs I’ve used. Stay tuned for my Polybar config on github.
- dmenu: A highly extensible menu program for getting user input. Great for often-used actions/programs that don’t require a terminal. I use it in too many ways to list here.
Package Managers
- conda: The best python package manager out there. Manages dependencies safely and is better than pip in all ways except for speed (especially in terms of building wheels and binary packages). Also includes virtual environment management (conda envs) and it manages non-Python packages as well, it’s just most known for Python. Visit my help-house for more info on conda. I install conda via miniconda and install what I want rather than anaconda because I don’t want the bloat of a bunch of pacakges I won’t use.
- cargo: The Rustlang package manager. I’m not a big Rust guy yet, but I’m getting into it.
Arch / Systemd Specific
- systemd-boot: My boot menu system. I’m not a huge fan of systemd in general (particularly service management in comparison to something like runit), but systemd-boot is great. Simple, easy to modify, and easy to add boot entries - just add a .conf file to /boot/loader/entries/, and the images are at /boot/ so it’s very transparent.
- yay: The AUR helper there is in arch for my purposes, a drop-in replacement for pacman. Similar to pacaur (now unmaintained) but better. Plus points for being written in Go (install
yay-bin
for the precompiled version if you don’t want the Go dependency). It behaves exactly like pacman and has a number of other cool/useful features likeyay -Ps
for printing system info. Visit my help-house for more info on yay.
User
File Manager
- ranger: A featurefull python-based terminal filemanager (what I currently use). A bit slow for my taste but it looks nice and gets the job done.
- nnn: A lightweight minimalist terminal filemanager. I use this for embedded systems. I’d like to use it exclusively because it’s lightweight and snappy, but I like ranger’s three panel display too much. I’m thinking about forking nnn to patch this in as a future project.
Text Editor
- neovim: A modern extensible vim clone text editor. Looks awesome. I’m a vim beginner but even the low hanging fruit makes the juice worth the squeeze. Learning The Vi and Vim Editors is a good book for learning the ropes.
- pathogen: What I use to manage vim packages, a lightweight straightforward solution.
- neovim-latex-previewer: A great tool to preview LaTeX documents from vim. I don’t use a lot of plugins for vim, but this one one of the main ones.
Internet / Web
- qutebrowser: A nice easy to reconfigure vimlike browser. It runs pretty efficiently despite being glued together with Python. A good example of a project where Python is utilized well. The ability to add custom format string urls (ie for ebay or youtube searching) is very nice.
- buku: A crossplatform bookmark manager solution, a recent addition becuase qutebrowser’s bookmarking is a little basic.
- transmission: the premier linux torrent daemon.
- tremc: A good terminal ncurses client for transmission, it’s a fork/port of transmission-remote-cli. It feels like an exact clone of transmission-remote-cli, which I am fine with.
- wget: An easy-to-use downloader with no dependencies. I use this to download things from urls.
- cURL: A good tool to hit JSON API endpoints from the shell, I use cURL in a number of my Polybar scripts to hit api endpoints for things like ethereum prices and airquality reports that are printed on my status bar.
Media
- imagemagick: Terminal image editor. I’ve used it for cropping images. It’s a lightweight and suprisingly not bad user experience. It’s nice to be able to do quick things and I can see a usecase for automating processing of image corpora. I’d like to find a simple gui that runs imagemagick as the backend, I’m sure one exists somewhere.
- mpd+ncmpcpp: A music server (mpd) and terminal music player client setup. I like ncmpcpp for the vimlike bindings and ease of changing settings. Kind of wish I didn’t have to run a music server though. I want to look into cmus in the future.
- mpv: What I use to watch video files. I don’t need this very often.
- mupdf: What I use to view pdfs most of the time. Nice and lightweight, reminds me a litle of SumatraPDF (the best pdf viewer on Windows).
- pavucontrol: Pulse Audio volume controller; terminal based pulse audio client.
Other(6)
- figlet: A cool little program I like a lot, the
-f slant
and-f block
options look cool. Useshowfigfonts
to see all the figlet fonts you have.