Apps I Use
Here’s a gratuitously detailed rundown of some of my software choices. I tend to prioritize efficiency and flexibility over aesthetics and ease of use out of the box. My dotfiles repo contains text-based config files for these apps.
General: Android, Chronofile, Duolingo, Firefox, FitNotes, FreeTaxUSA, Google Fi, Google Keep, Google Tasks, Inoreader, KeePassXC, Linux, Meteogram, MobileSheets, Monarch, mpv, Mullvad, MuseScore, Overleaf, rclone, Reaper, Signal, Syncthing
Coding: Alacritty, DejaVu Sans Mono, DigitalOcean, fzf, Isso, Jekyll, nano, ripgrep, Sublime Text, tmux, zsh
Linux: Arch Linux, clipman, Easystroke, i3, xbindkeys, XFCE4 goodies, Yay
macOS: AeroSpace, AutoRaise, Hammerspoon, Maccy
Android
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 :)
Chronofile
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?)
Duolingo
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.
Firefox
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.
Browser extensions that I use include Dark Reader, Disconnect, I still don’t care about cookies, KeePassXC-Browser, Privacy Badger, Refined GitHub, Stylus, and uBlock Origin.
FitNotes
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.
FreeTaxUSA
Tax preparer. Alternatives I’ve tried: TurboTax, TaxAct, Credit Karma, a human CPA
Despite the extremely scammy-sounding name (which they’ve apparently tried to address by offering exactly the same product under the alternate name TaxHawk), FreeTaxUSA is easily the most wholesome tax software that I’ve ever used—no surprise fees, shady upselling, or parasitic lobbying. You know they’re legit because the IRS website lists them as a trusted partner.
FreeTaxUSA does come with a small fee for filing state taxes, but I find it totally worth the lack of sleaze. It almost feels like a charitable donation in comparison to feeding the TurboTax monster.
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.
Inoreader
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.
KeePassXC
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.
Linux
Desktop OS. Alternatives I’ve tried: Windows 95 - Windows 10, macOS Mavericks - Sequoia
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.
Update I’m currently using macOS again at work since Apple requires it for iOS development. I’ve managed to recreate my Linux setup well enough on macOS that it’s no longer super jarring to switch between the two.
Meteogram
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!
MobileSheets
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.
Monarch
Personal finance tracking. Alternatives I’ve tried: Mint, Credit Karma, Empower / Personal Capital, Firefly III, 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.
Update Now that Intuit has shut down Mint, I’ve switched to Monarch. It comes from the original developers of Mint and feels much the same.
mpv
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.
Mullvad
VPN
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.
MuseScore
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.
Overleaf
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.
rclone
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.
Reaper
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.
Signal
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!
Syncthing
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.
Alacritty
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.
DigitalOcean
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.
fzf
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:
Isso
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.
Jekyll
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.
nano
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.
ripgrep
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.
tmux
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.
Zsh
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.
clipman
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. On macOS, I use Maccy.
Easystroke
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!
i3
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. AeroSpace for Mac is a solid i3 clone.
xbindkeys
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
.
Yay
AUR helper. Alternatives I’ve tried: pacaur, 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.
Update Welp, pacaur finally died on me. Now I use Yay.
AeroSpace
Window tiling. Alternatives I’ve tried: yabai, Rectangle
At long last, sane window management. AeroSpace solves my biggest macOS gripe by faithfully copying the design decisions of Linux’s i3. Now my apps always make full use of all available screen space as soon as they open, and I can navigate between them instantaneously via keyboard shortcuts without having to wait for any annoying animations.
AutoRaise
Autofocus windows on hover.
AeroSpace quite reasonably forgoes reimplementation of one useful i3 feature that’s somewhat controversial on macOS: automatically focusing (raising) windows when you hover your mouse over them.
Why is that controversial? Unlike Windows and Linux apps that each contain their own menu bars, all macOS apps share a single menu bar at the top of the screen. If macOS were to have the same autofocus behavior that i3 provides, then you could accidentally end up switching apps while dragging your mouse up to click on the menu bar.
Personally, I don’t find that a problem at all. I rely a lot on keyboard shortcuts and don’t need to click on the menu bar too often anyway. Some apps like Alacritty don’t even have a menu bar. I use AutoRaise to get i3-style autofocusing on macOS.
Hammerspoon
GUI automation. Alternatives I’ve tried: AutoHotkey
Hammerspoon lets you programmatically automate GUI actions such as moving windows around and simulating keyboard events. It’s like AutoHotkey on Windows and Tasker on Android.
Its Lua-based APIs are powerful enough that I was able to build my own custom implementation of i3 in Hammerspoon (until I switched to AeroSpace for that). Nowadays I mainly use Hammerspoon to create global keyboard shortcuts for automatically typing out my various email addresses.
Maccy
Clipboard history.
This is a no-nonsense, open-source macOS clipboard manager similar to clipman.