Software I use

22 May 2020

A catalogue of software I use, and my ideas for changing things 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, 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 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 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 so you can keep all the useful features your IDE provides you.

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 itself so there's 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, else use 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 .

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:

Firefox Sync Server

Allows you to store your synced Firefox data on your own server instead of Mozilla's.

Raspberry Pi

Pi-Hole

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

Things to improve:

Android smartphone

LineageOS

An open-source community-run modified distribution of the Android Open Source Project. Supports a wide range of Android devices, including ones that aren't being updated by the manufacturer. Even if the manufacturer doesn't support it, they'll often support the latest versions of Android for your device.
Their changes from AOSP are rather minor, and add nice new features rather than adding bloat like many custom versions of Android tend to do.

LineageOS still relies on proprietary drivers and such, so it's not entirely open-source, but probably the closest you're going to get for your device.
Installing Google's proprietary apps and services is optional, but expect some apps (particularly proprietary ones) to misbehave with regards to push notifications. The microG project provides an open-source re-implementation of Google's things, but requires modified LineageOS builds in order to pretend to be those apps. microG hasn't released builds for the latest version of Android yet, and I'd rather not rely on Google services at all, so I've not yet tried it.

I'm content to have a mostly functional mobile device that is as open-source as possible rather than rely on proprietary software and services, thus, the only option from the iOS/Android duopoly is the latter.
In the future I may take a look at postmarketOS for a true open-source operating system for my phone.

AdAway

Provides system-wide adblocking through hosts files. Sadly it does require root access.

AntennaPod

For listening to podcasts, and has about all the features you could need.

AnySoftKeyBoard

Highly customisable and feature-rich, including the wonderful swipe-typing.
A bit temperamental with suggestions and swiping, but mostly works. Sadly the settings UI is a bit of a mess and it's difficult to find what you're looking for.

Aurora Store

An open-source client for using Google's Play Store. Handy when you really need a proprietary app, or when a FOSS app is only distributed through the Play Store (looking at you, Signal).

Simple Calendar

A simple calendar application. Looks and works better than the stock LineageOS app.

DAVx⁵

A CalDAV/CardDAV/WebCal client, useful for hooking up your phone's calendar and contacts to Nextcloud.

F-Droid

The FOSS app repository for Android. You can download and update the vast majority of what you need from it.

Firefox Preview

A new preview version of Firefox for Android. The UI and performance is a bit better than the current version, and it's being actively worked on. I'll admit the UX still doesn't touch Google Chrome's, but I hope that'll soon change.

Magisk

Grants you root access to your device.

NewPipe

An open-source client for YouTube, SoundCloud, and some FOSS media services. Provides features for free that these platforms charge for, including being able to download videos, listen or view them in the background, and remove adverts.

Nextcloud

I use the official Nextcloud and Nextcloud news apps. The unofficial notes app provides a better experience when editing notes, so I prefer it over the normal Nextcloud app.

OsmAnd

An OpenStreetMap client complete with offline maps, offline route calculation and navigation, and customisation. Public transport routing is almost working, but in London, it often takes a long time a route or doesn't load at all.

In the rare case where I need public transport routing, I just the service provided by the public transportation organisation.

Password Store

An Android client for pass, which I use as my password manager. Requires OpenKeychain for PGP key functionality.

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