Software I Use

Here’s a gratuitously detailed rundown of some of my software choices. Be warned that it’s not a particularly sexy collection since I tend to prioritize efficiency and flexibility over aesthetics and ease of use out of the box.


Mobile OS. Alternatives I’ve tried: iOS, Windows Phone, CyanogenMod

I prefer more control over my phone than iOS offers: I can freely customize Android’s home screen, sideload apps, pick and choose hardware specs, charge with any old USB-C cable instead of Apple’s not-even-included Lightning cable, easily develop and share my own apps, automate nearly anything with Tasker, and so on. I don’t mind appearing as a green texter in a chat app that I don’t use :)


Personal analytics, a.k.a. lifelogging, a.k.a. quantified self. Alternatives I’ve tried: spreadsheets

I’ve been continuously recording my daily activities by hand since I was 17, amounting to ~100,000 activities over the past 11 years. Most of it has taken place in an app that I built for myself. I described the process and data in a blog post that generated a lively discussion on Hacker News and got picked up by Taiwanese media (lol?)


Clipboard history.

Ctrl + V pastes the last thing you copied, while a clipboard manager can remember and provide easy access to hundreds of things you’ve recently copied. Life-changing.

Xfce’s clipman introduced me to the concept. I won’t recommend specific programs for Windows or Mac since I haven’t tried any, but a cursory search shows tons of choices.


Language learning. Alternatives I’ve tried: Anki, Memrise, LingoDeer, Drops, Tandem, HelloTalk, Cake, ELSA Speak, textbooks

Full disclosure: I work at Duolingo. But that’s because I was already a power user, not the other way around.

As a casual language learner, Duolingo’s gamification features had me hooked immediately. By now I’ve made significant progress through around a dozen courses, completing seven of them. Although language proficiency does fade quickly without ongoing practice, I was fairly decent at the time of finishing each course: not fully conversational and definitely not fluent, but equivalent after only a few dozen hours on Duolingo to having taken two or three years of high school instruction. The vocab that I do still remember comes in handy surprisingly often when I recognize the meanings of infrequent musical directives like pesante, brand names like Fjällräven, Spanish chatter at pickup volleyball, and even alien dialogue in science fiction.

To reach fluency, there’s no substitute for talking with humans. Tandem worked pretty well for me as a way to find someone with whom to practice conversational Thai offline, but within the app itself I’d say the best feature is its specialized UI for gracefully correcting any mistakes in your partner’s chat messages. Nowadays I mostly stick to Duolingo and use my phone keyboard’s voice typing feature to practice speaking. Google’s unforgivingly (and unintentionally?) strict speech recognizer serves as my pronunciation guide.


Web browser. Alternatives I’ve tried: Chrome, Chromium, Edge, Opera

After falling behind Chrome in performance and features for many years, Firefox finally caught up. It continues to support privacy and ad blocking features in a way that no browser created by an online advertising company will ever match. I still use Google products that blow away the competition, but this is one place where it’s easy to avoid putting more eggs than necessary in the Google basket.


Workout tracker. Alternatives I’ve tried: Fitocracy, Strong, MyFitnessPal, spreadsheets

Way back in 2013 when PhoneGap reached peak hype, I went about learning it by developing my own workout tracking app… until I found FitNotes, which was the exact app I planned to build. No frills, streamlined UI, and full ownership of the data.

I find it comforting that FitNotes is also developed independently by just a guy like me, which is about the scope that feels appropriate for something as simple as a workout tracker. No worries that big fitness will aggressively try to monetize and engage me.

Google Fi

Wireless carrier. Alternatives I’ve tried: T-Mobile, Verizon

My Fi family plan gets me unlimited calls, texts, and data for $24/mo after taxes and fees. I don’t travel enough internationally that it makes sense anymore, but previously I used their flexible plan for $20/mo plus $10/GB for mobile data that works practically anywhere in the world.

Although Fi was initially available by invitation only for a handful of phone models, they now support iPhones and many Android devices. If you decide to make the switch, you can save us both $20 by using this referral link or code: A2D70F

Google Keep

Notes. Alternatives I’ve tried: Evernote, OneNote, Notion, text files

As with FitNotes and Google Tasks, it’s a relief that Google Keep’s product decisions don’t suffer from the business pressure of being an entire company’s sole source of income. It’s just a dead simple note-taking app that syncs between my laptop and phone, which is all I want or need.

Google Tasks

Todo list. Alternatives I’ve tried: Remember the Milk, text files, physical planner

After languishing for years in a state of limbo and dubious recommendability, Google Tasks finally implemented the last feature on my wishlist: an Android widget to show upcoming tasks. Or maybe I should say second feature because the only other feature that I want out of a todo app is seamless integration with Google Calendar. The use cases for todo lists and calendars are so intertwined that I can’t imagine managing them nearly as effectively in two separate places.


RSS reader. Alternatives I’ve tried: Google Reader, Feedly, Tiny Tiny RSS, NewsBlur

Like many people, I migrated to Feedly upon Google Reader’s untimely demise. Feedly’s extravagant use of screen space and lack of customizability bothered me, so I then ran my own TTRSS server for several years until I got tired of having to regularly upgrade and troubleshoot it myself.

Inoreader feels closest to the spirit of Google Reader. After trying their free version with an ad blocker for a while, I happily upgraded to their $20/yr ad free plan.


Password manager. Alternatives I’ve tried: LastPass, 1Password, KeePass, KeePassX

A security incident with some cloud-based password manager or another seems to make the news every other month. The most popular totally offline, totally FOSS option is KeePass and its forks. KeePassXC is a modern fork recommended by the EFF. All passwords live in a single file that I sync across my devices via Syncthing.


Desktop OS. Alternatives I’ve tried: Windows 95 - Windows 10, macOS Mavericks - Catalina

Compared to Windows and/or Mac, Linux’s strengths include hassle-free package management, the ability to customize or switch out any part of the OS (e.g. to avoid shenanigans like start menu ads), being a smaller target for consumer malware, generally better performance and reliability on the same hardware, native support for industry standard programming tools like Docker, no data harvesting, and of course the $0 price tag. After years of troubleshooting my mom’s Windows machines, I set up Linux Mint for her and have gotten zero complaints in the decade since.

Linux’s weaknesses include the typical need to install it yourself and less support for proprietary software such as AAA games and professional creative tools. Depending on which Linux distro (variant) you choose, support for peripherals such as printers and cameras may also take some legwork.


Weather app. Alternatives I’ve tried: Aix Weather Widget, Google Weather

In a vast ocean of Android weather apps, Aix Weather Widget was the perfect one for me until Android 11 finally broke it in 2020. Some time later, I asked my friend about the staggeringly detailed weather widget that I couldn’t help but notice taking up half their home screen. I was pleasantly surprised to discover that not only does Meteogram give you full control over every last aspect of its display, but it even comes with a minimalist “Aix lookalike” preset!


Personal finance tracking. Alternatives I’ve tried: spreadsheets

Every RPG out there has some kind of dashboard for checking your character’s stats. Mint provides a similar overview of your financial life. Its Android widgets let me easily monitor all of my accounts’ current balances and recent transactions. I’d prefer an equally convenient alternative that isn’t now owned by Intuit though, so maybe I’ll give Personal Capital a spin sometime.


Sheet music display. Alternatives I’ve tried: PDF viewers, paper

PDF viewers work okay for sheet music but come with a bunch of annoyances, chief among them the problem of page turning. I once hacked up my own solution using face recognition via my Linux laptop’s webcam, but that’s hardly a normal setting for musical performance.

Dedicated apps like MobileSheets provide helpful features like half-page turns, Bluetooth integration with page turning devices, custom setlists, and automatic whitespace cropping. MobileSheets is available for both Android and iOS, although forScore seems more popular on iOS.


Media player. Alternatives I’ve tried: VLC, RealPlayer

VLC is the best-known media player that can handle any audio or video file you throw at it. mpv is a similar (both are based on FFmpeg) CLI program that supposedly offers slightly better defaults, performance, and file support. If I hadn’t already been looking for a CLI media player, I’d probably just stick to VLC.



I’m not really the most privacy-conscious person in the world, and I don’t go around evangelizing VPNs. I just happen to spend more time than most people on public WiFi networks that mess with traffic, e.g. breaking my RSS reader for some reason. Mullvad doesn’t spend as much on marketing as NordVPN or ExpressVPN, but it’s the only commercial option that I’ve personally heard security engineers recommend. Mozilla’s own VPN offering is basically just rebranded Mullvad.


Music notation. Alternatives I’ve tried: Sibelius, Frescobaldi, LilyPond, TuxGuitar, Guitar Pro

I wrote a few scores in Sibelius as a teenager and it blew MuseScore out of the water back then. Now that the original Sibelius development team has moved to Steinberg, I’d guess that Dorico SE is an excellent free option for getting started today.

That said, MuseScore has improved a ton and I’ve seen some of my music teachers using it. It’s more than sufficient for my guitar tabbing and occasional piano scoring purposes. I’ve only ever tried my hand at a multi-instrument score once, but well… that’s one more time than trialware like Dorico SE would allow.


Typesetting. Alternatives I’ve tried: TeX Live, Microsoft Word

I learned LaTeX to make my high school resume prettier, wrote all of my college assignments in LaTeX for fun, and recently chose to use dockerized LaTeX for a project at my day job. Clearly I don’t hate LaTeX, but just getting it to run has always been a pain. Installations take up gigabytes of disk space, the tooling ecosystem is extremely fragmented, and good luck with basic tasks like changing the font. For the occasional resume tweak or formula render, an online editor like Overleaf will spit out a PDF with minimal hassle.


File backup. Alternatives I’ve tried: Carbonite, SugarSync, external HDD, crossed fingers

I use Syncthing to sync files across my devices and a public GitHub repo to house my program settings. By “backup”, I’m referring to the act of shipping my old photos and documents off to some remote datacenter where they’ll survive any disaster that may befall my laptop.

Rclone lets you easily sync your local files to pretty much any cloud storage provider. As easily as rsync, that is - both are CLIs after all. Rclone’s encryption at rest means that I don’t have to worry about the cloud provider snooping on my files or losing them in a data breach.


Digital audio workstation (DAW)

Yes, this one is mostly about the money. Reaper is effectively donationware for which I happily shelled out $60 after a few mixing projects. Logic Pro and every other DAW worth mentioning all cost hundreds of dollars, which is more than I’d like to spend on a chore that’s only tangentially related to my actual hobby of playing music. Reaper’s blenderesque UI takes some getting used to but ends up feeling reasonably efficient once you’re comfortable with it.


Instant messaging. Alternatives I’ve tried: Messenger, WhatsApp, LINE, etc. etc. etc.

I’m not enough of an ideologue to forgo Messenger, WhatsApp, or whatever else my friends and family already use, but if we both happen to have Signal then that’s the chat app of choice. Signal’s security measures survive subpoenas while other apps get in PR trouble for unexpectedly sharing your data. As a bonus of being open source, Signal is also the only popular chat app that would ever let me dive into its code and fix a bug myself!


File sync across devices. Alternatives I’ve tried: Dropbox, SugarSync, OneDrive

Syncthing is self-hosted Dropbox. Five years after my blog post about why and how I made the switch, Syncthing still works well for me and gets recommended often in Hacker News comments.


Terminal emulator. Alternatives I’ve tried: xterm, xfce4-terminal, urxvt, Tilda, Terminal, iTerm2

Alacritty made a splashy entrance a few years ago with bold claims of trouncing every other terminal’s performance now and forever. I haven’t used any alternatives recently enough to remember how much slower their rendering felt, but I appreciate Alacritty’s philosophy at least as much as its results. I already use tmux for features like panels and scrolling, which leaves text rendering as the one thing for my terminal to do well.

DejaVu Sans Mono

Programming font. Alternatives I’ve tried: Consolas, Inconsolata, Source Code Pro

I want my editor and terminal font to be monospaced, unambiguous when it comes to similar characters like 1 / l / I, legible at small sizes, available everywhere, and as plain or “normal” looking as possible - in that order. DejaVu Sans Mono does a pretty good job ticking those boxes. For many years, it was the default monospaced font on both MacOS and Fedora Linux.

Maybe I just haven’t spent enough time with them to reach enlightment, but I find ligature-heavy fonts like Fira Code impractically cute. Whenever I see something like in my editor, I’d rather not need to also remember that !~ is the “source code” for the source code itself.


Web host. Alternatives I’ve tried: AWS, Heroku, GitHub Pages, x10hosting, Raspberry Pi

I have no complaints about DigitalOcean and find their documentation in particular to be excellent, but my preference here is less about DigitalOcean specifically and more about VPS vs. cloud vs. PaaS vs. static HTML vs. shared hosting vs. home server. For me, the VPS route strikes the best balance between flexibility and maintainability. I can roll my own features like self-hosted blog comments and custom URL redirects without spending too much time on the ops side.


CLI autocomplete for common programs

fzf (“fuzzy finder”) is a general-purpose CLI tool that automatically converts long lists into searchable menus, similar to how a web browser suggests URLs as you type into its location bar. It takes over your shell’s Ctrl + R to present your command history in that browser-style UI, as opposed to readline’s functional but tedious behavior of paging chronologically through one entry at a time. Hitting Ctrl + T shows similar UI for recursively searching the current directory for any given file name.

My third main use case for fzf is typing kill **<TAB> to get a searchable menu of killable processes without needing to worry at all about PIDs, which handily beats the old ps aux + grep + kill ritual:


Blog comments. Alternatives I’ve tried: Disqus

I previously ran Disqus on this blog but eventually got tired of the ads and slowness. Isso is a self-hosted commenting system and admin panel that, like FitNotes, does exactly what I want in a simple way that closely matches what I’d otherwise just build from scratch for myself.


Blog CMS. Alternatives I’ve tried: Pelican, WordPress, Ghost, Drupal, Joomla, MODX

Jekyll popularized the idea of generating static HTML from Markdown files. I’m comfortable rsyncing the HTML to my VPS, so I don’t want or need anything more “engineered” than Jekyll. Despite murmurs of its deprecation, Jekyll seems unlikely to go away or even lose its status as the most popular SSG as long as it remains GitHub’s default method for publishing to GitHub Pages.

My Jekyll workflow: start the local development server, open a Firefox window next to a Sublime Text window, see the output refresh itself whenever I save in Sublime Text, and publish by rsyncing the entire build folder to DigitalOcean.


CLI text editor. Alternatives I’ve tried: vi/vim/neovim, emacs

If you’re not all in on terminal editors like vim, nano comes preinstalled in most Linux distros and provides a much more user-friendly TUI for stuff like amending Git commits. Just set it as your $EDITOR and you’ll never need to worry again about forgetting rarely used keyboard shortcuts.

MacOS once came with nano but now preinstalls pico instead, which I can only assume was due to a licensing situation similar to Bash vs. Zsh.


Local code search. Alternatives I’ve tried: grep, ag

Ripgrep is a faster drop-in replacement for grep. Like other grep alternatives, it respects .gitignore by default. Microsoft now uses ripgrep to power VS Code’s search feature.

Sublime Text

GUI code editor. Alternatives I’ve tried: Visual Studio Code, Notepad++, various JetBrains IDEs, Eclipse, Visual Studio, etc. etc.

I use Android Studio for Android development because Google more or less forces you to. Whenever I have more of a choice, I avoid IDEs since they’re so slow and complex, crammed with tons of features that are unreliable and/or unnecessary for me. Even VS Code is too bloated out of the box for my taste despite my championing of GitHub Codespaces at my job.

I’ve spent at least 100 hours using each of the alternatives listed above, and Sublime Text remains my favorite for its speed and simplicity. The only action that causes any perceivable lag is opening a file that weighs several megabytes or even gigabytes, a task that other editors handle worse (if at all). Instead of trying to pare beefier IDEs down to just what I want, I install a few Sublime plugins that add helpful IDE features like symbol renaming and type inference hints.


Terminal multiplexer (tab and pane manager). Alternatives I’ve tried: screen, GUI tabs

Most people who want to open multiple terminal windows use their terminal’s GUI tab feature, a familiar approach that matches web browsers’ UI. Some terminal apps get even fancier and let you split tabs horizontally or vertically into multiple panes. This all works fine until you land in an environment that doesn’t support your favored GUI terminal: a remote server you’re SSHed into, a headless local machine, or your IDE’s built-in terminal panel.

tmux uses Unicode art to implement those windowing features all inside a single terminal itself, removing the need for GUI tabs. Other than portability, tmux’s main draw is persistence across SSH sessions. I can log into a remote server, kick off some jobs inside tmux there, log out without killing those jobs, and come back later to view those jobs running inside the same tmux session exactly as I had left it.


Interactive Unix shell. Alternatives I’ve tried: Bash

For all its hype, Zsh is actually almost identical to Bash (and just one year younger!). While Zsh does offer a few advantages like spellcheck and automatic cd, it owes much of its relatively recent popularity to a plugin manager called Oh My Zsh.

I don’t use Oh My Zsh anymore. Bundling the kitchen sink might be the fastest way to get a decent setup, but eventually I wanted better performance and control. Now I just declare my own Git aliases and install Zsh syntax highlighting directly.

To be clear, I only use Zsh as an interactive shell. Unless you’re specifically writing a Zsh plugin, Bash and Bourne shell remain the only sane choices for non-interactive scripting due to their ubiquity.

There’s also Fish, the only other Unix shell today with any voluntary adoption to speak of. While Zsh is essentially just Bash with a few extra features, the whole Fish shtick (sorry) is its thorough departure from POSIX standards. Some of Fish’s interactive features do sound tempting, but to me they don’t feel worth the mental burden of always having to remember what shell features are safe to use inside Bash scripts.

Arch Linux

Desktop Linux distro. Alternatives I’ve tried: Fedora, Ubuntu, Mint, ChromeOS

Everything I said above about Linux is even truer of the minimalist Arch Linux than of other common distros. I began with Fedora in college and stuck with it through my first few years of full-time work. Eventually I became comfortable enough with Linux to try out Arch, whose principles align more with what I want out of software: simplicity, modernity, pragmatism, user centrality, and versatility.

Simple doesn’t necessarily mean easy - it’s much easier to churn out a long and rambling blog post *cough* than a clear and concise one. In contrast to Arch, distros like Ubuntu are easy but complex. Here are my notes on how I’ve arrived at my current Arch setup.


GUI navigation via mouse gestures

Easystroke translates mouse gestures into keyboard shortcuts, which programs then translate into commands like undo, refresh, next tab, etc. For example, I can draw an L-shape while holding down my mouse’s right button to send a Ctrl + W command that closes the active tab in programs like Firefox and Sublime Text. The only time I ever think about mouse gestures anymore is whenever I use someone else’s computer and realize how much I miss them!


Window manager. Alternatives I’ve tried: GNOME, KDE Plasma, Xfce, Unity, Cinnamon

i3 is like tmux for desktop apps. If you hate wasting screen space and love keyboard shortcuts, i3 will let you manage your app windows as efficiently as possible.

Here’s a screenshot from my Arch laptop that shows Sublime Text and Alacritty equally sharing the third of six desktops, which I can jump to via CapsLock + 3. I can open a new app by hitting CapsLock + E and typing part of its name.

The half-screen window snapping features introduced in Windows Vista and MacOS Catalina don’t hold a candle to i3. Yabai for Mac appears to get some of the way there.


AUR helper. Alternatives I’ve tried: yaourt, trizen

Yay is the AUR helper du jour and pacaur has been something of a zombie since its original author left in 2018, but the latter still works fine for me. I’m sure yay is slightly nicer and it’s what I’d recommend to new Arch users - it just doesn’t seem worth switching over my existing machines and scripts.


GUI automation. Alternatives I’ve tried: AutoHotkey

On Linux I use xbindkeys to create system-wide keyboard shortcuts for common actions like typing out my email address.

That comes in handy several times a day but pales in comparison to the absurdly powerful AutoHotkey, a programming language whose name barely scratches the surface of what it makes trivially easy even for non-programmers: keyboard automation, mouse automation, GUI automation, GUI creation, audio playback, etc. Before getting into more mainstream programming languages like Python, I first learned TI-BASIC to develop calculator games and AutoHotkey to create my own productivity tools and RuneScape bots. Tragically, AutoHotkey is only available for Windows.

Xfce4 goodies

GUI-based OS utilities. Alternatives I’ve tried: Nautilus, Ranger, Flameshot, etc. etc.

Although I haven’t run Xfce itself in many years, I still use several of its components alongside i3 since they consistently follow Xfce’s philosophy of speed and simplicity: clipboard manager clipman, image viewer ristretto, file manager thunar with thunar-archive-plugin, system tray applets xfce4-battery-plugin and xfce4-clipman-plugin, and xfce4-screenshooter.