Software I Use

Published 22 May 2020

A catalogue of software I use and how. I also go in to things I'd like to try or improve in the future.

Personal computers

You can find most of my configuration files here.

Linux

My computers run a distribution of GNU/Linux, specifically Arch Linux. It's the first distribution I installed and it's served me well, so I haven't had any reason to try another.

Here's some things I like about it:

Sway

A tiling window manager that uses the new Wayland protocol. It's mostly compatible with the more well-known i3 window manager. I started using tiling window managers about a year after I switched to GNU/Linux, and it's tough to go back to a traditional one.

Here's some things I like about them:

While I was on macOS at work, I tried using chunkwm to recreate the tiling window manager experience. However, macOS being what it is, getting the window manager set up was a frustrating task, and I never got it working reliably and how I wanted it. Minor inconveniences like compulsory desktop transition animations and key-binding limitations quickly add up to make a miserable experience.
chunkwm's author has more recently released a new window manager: yabai. Hopefully that provides a better experience, but for now, I just try to avoid macOS as much as possible.

Firefox

I've been using Firefox since a bit before the 'Quantum' update. I'm happy to say it's now a snappy and stable experience. Most settings can be controlled in the human-readable user.js, and the browser can be themed using the userChrome CSS files.

Some extensions I recommend:

Things to improve:

Neovim

Vim's yet another piece of software that's difficult to give up once you've gotten into it. I picked it up when I was stuck in a university computer lab with nothing else to do and typed $ vimtutor. The learning curve is infamously harsh, but keep at it and you'll learn to use a text editing model that you can keep using for the rest of your life, and writing on computers will never be as mundane again.
I chose to use the Neovim fork because of its refactoring efforts and its ability to allow plugins to work asynchronously (though original Vim now also supports this).

With a few plugins and tools Vim can also become a simple IDE, thanks to the Language Server Protocol. Enabling code completion, refactoring, and searching is now trivial exists for programming languages that have an existing tool that implements the protocol.
If all else fails, most popular IDEs have an add-on that provide a Vim-lite editing experience while maintaining all the useful features your IDE provides you.

Things to improve:

Newsboat

A terminal RSS reader which can synchronise with my Nextcloud service. Heavily customisable, just how I like it.

aerc

A simple terminal mail client. I swapped to aerc from NeoMutt as I preferred the simpler interface aerc goes for. aerc handles IMAP and SMTP meaning so less configuration involved to get it set up. It's got a fair number of features that make it easy to handle Git patch requests and the like within the client. While I haven't yet used these features it sounds useful for anyone involved in open source software development.
I pair it with OfflineIMAP so I can keep a copy of my emails locally on my computers.

Things to improve:

Bash

It's the standard GNU/Linux shell, so I prefer to use it whenever possible. With a few configuration adjustments I think it stands up well to the competition (I've also tried zsh and fish). Using it as a scripting language is a different story. Lots of subtle behaviour and its limited feature set make it a hassle to create simple and correct scripts. I'd recommend using another scripting language for more complex scripts, or at least the very least using ShellCheck religiously.
I use an adjusted Agnoster theme for a cleaner and more detailed command prompt.

Things to improve:

tmux

A window manager for your terminal. I use tmux in much the same way as I do sway, with sessions started automatically and programs launched in them. Ideally I'd just use my actual window manager, but being able to connect remotely and still have all my terminal sessions open is a killer feature I can't easily recreate with sway.
I've set up a few two-key bindings that are similar to the ones I use in sway; I use the Super key modifier in sway, and Alt in tmux.

Things to improve:

Self-hosting

This website

Being a lightweight static website, it's no hassle to set up and host it from my own server.

I originally created it with Vue.js, as I wanted a dynamic résumé I could adjust over time and tailor for particular job applications.
While I pushed this Vue.js version to my live server, I later realised the same could be achieved with a static site generator. I eventually settled on Zola as it seems relatively lightweight, has a good selection of features, and doesn't use JavaScript.
It can easily be maintained in a Git repository, which allows me to push changes both to the origin repository (wherever that may be) and my server easily. With a Git hook I can have my server regenerate the site whenever I push changes, automating the deployment process.

You can find the source for my website here.

Things to improve:

Nextcloud

A great "cloud" suite that provides file and calendar syncing. Once I had this set up I was kicking myself for not having done so sooner. Having all my files automatically available on all my devices is a wonderful experience and Nextcloud proves you don't need commercial solutions to do it. The automatic syncing has been so hassle-free I've caught myself relying on it in scenarios where I should be using a Git repository. Note to self: stop that.

Things to improve:

Taskwarrior server

Taskwarrior is a powerful task tracking and time-keeping tool which I severely underutilise. Its appeal is how it can automatically prioritise tasks for me: I can input tasks and have a prioritised list always telling me the next thing I should be doing. Used properly, I see it being a great force for productivity and applying order when necessary.
I've set up a synchronisation server so my tasks can be shared between all my devices and I can keep up with them wherever I am.

Things to improve:

Raspberry Pi

Pi-Hole

Blocks advertising for all devices in your LAN. What else do you need to know?

Things to improve:

Things I want to do

Chromecast

Google's Chromecast is a nifty little device that lets you stream media to a device. After cutting Google out of my Android device, my Chromecast device is now practically useless: support for it seems to be provided by the Google Play Framework, and none of the Android apps that I use implement support for the Cast API themselves.

While projects like pychromecast provide an API for controlling Chromecast devices from a desktop, it's hardly the best experience. I created a Python program for queuing YouTube videos with pychromecast which serves my basic needs, but things like manipulating the play queue isn't possible.
On Android, it seems like there's a similar effort for an open-source implementation of the Cast client API in chromecast-java-api-v2. I hope this project finds itself being used by other open-source Android applications, as I'd like to have Cast protocol support again.

Ideally we'd have an open-source implementation of the Cast server so one could create their own Chromecast devices, e.g. using micro-computers like the Raspberry Pi. Something like Mopidy combined with Snapcast and/or Home Assistant could provide an alternative.

Home Assistant

Home Assistant is a widely lauded home automation suite, which I found myself setting up on a Raspberry Pi. That part was simple enough. Once I had it running I quickly realised I didn't have anything to do with it. I found myself disappointed with its Chromecast support, as the interface only shows the currently playing media and a play/pause button.

Perhaps if I get some "smart" home devices I'll find a better use for it. Some ideas:

Combined with a voice interface or one of those magic mirrors, I can see Home Assistant being a great tool for automation and personal management.

Media server with Kodi

Ideally I'd have a small computer with mass storage that could act as a server within my LAN, and could store media that I want to keep at hand but not necessarily on my PC. Combined with Kodi, such a computer could provide a great home-entertainment system.

Automate personal computer setup

My user configuration files ("dotfiles") are stored in a Git repository, which includes an installation script. This isn't ideal for the purposes of quickly reproducing my setup on a new computer.
A configuration management tool like Chef or Ansible would be better suited for this task.

A better terminal client for Signal

I use Signal for my instant messaging. Sadly, the desktop application is an Electron application and hence regularly gobbles up a gigabyte of my system's memory for no good reason.
signal-cli and scli are almost good enough for using Signal in the terminal. Support for stickers is however missing, and signal-cli is a Java daemon which uses up more memory than it should. Not as much as the Electron client, but it could still be better.
Ideally, a new client would be built on the C implementation of Signal's protocol. It'd probably have to reimplement a fair amount of the Electron client's features.

Resources