Uses

What I use every day

An annotated inventory of the hardware, software and services behind my work. Kept roughly current, and deliberately opinionated — a list like this is only useful if it says what got dropped and why.

I have kept a file like this since 2017, mostly so I stop re-researching the same purchases. Publishing it has one other benefit: people tell me what I am missing, which is how I found half of the tools below.

Two principles run through the whole list. First, anything I touch for more than an hour a day is worth paying for and worth configuring properly. Second, the tool has to be replaceable — if I cannot export my data or read the file format, it does not go in.

Hardware

One laptop and one desktop. I resisted the second machine for years and was wrong: the separation between "work that needs a big screen and 64GB of RAM" and "work I can do on a train" is worth the synchronisation overhead.

Machines as of April 2025
MachineSpecWhat it is for
MacBook Pro 14"M3 Pro · 36GB · 1TBEverything portable. Runs Docker, Postgres and two browsers without complaining.
WorkstationRyzen 9 7900 · 64GB · 2TB NVMeLoad tests, large imports, long-running Postgres experiments, video calls.
MonitorDell U2723QE · 27" 4KOne screen, no second. A 4K panel at 200% scaling gives me more usable rows than two 1080p panels ever did.
KeyboardKeychron Q1 ProBoba U4T switches, ISO layout, no RGB. Quiet enough for a shared studio.
MouseLogitech MX Master 3SMostly for the horizontal scroll wheel, which I use constantly in diff views.
HeadphonesSony WH-1000XM5Noise cancelling, mostly for open-plan days rather than music.

The monitor choice contradicts advice I used to give. I spent six years on dual 1080p screens and moved to a single 4K panel in 2023; the reduction in neck movement mattered more than the reduction in total pixels. Your desk may differ.

Editor and terminal

Neovim for almost everything, VS Code for pairing and for the occasional remote session where installing my configuration would take longer than the task.

  • Neovim with a config I have carried between four machines since 2019. Not a distribution, but it owes a lot to LazyVim's opinions on LSP setup.
  • VS Code for Live Share sessions and for reviewing large pull requests, where I want the sidebar diff.
  • Alacritty with tmux. I have tried the fancier terminals and always come back to the one that opens in 40ms.
  • zsh plus starship for a prompt that shows the git branch and the last command's duration, and nothing else.
  • ripgrep, fd, fzf, jq, bat. These five save me more time than any editor plugin.

On configuration

My dotfiles repository has 41 commits in the last three years, most of them deletions. Every hour spent tuning a prompt is an hour not spent reading a query plan, and I have spent plenty of both.

Languages and runtimes

  • TypeScript for anything a browser touches and a good deal of backend work. Strict mode always, noUncheckedIndexedAccess on, and I will argue about any.
  • Go for services where deployment simplicity matters more than expressiveness. The standard library does most of what I need and the build output is one file.
  • Rust for the two things where tail latency and memory use are the whole problem. I am competent, not expert, and I say so when quoting.
  • SQL properly, which I count as a language. Most of the leverage in the systems I work on is in the queries, not the application code.
  • Python for data analysis, report generation and one-off scripts. Not for anything with a pager.

Runtimes are pinned per project with fnm or mise, and pnpm handles the JavaScript side. I have no strong opinion about package managers and a very strong opinion about lockfiles being committed.

Data

StoreStateNotes
PostgreSQL 17DefaultEvery project starts here. Managed by pgBackRest, restored from backup at least twice a year to prove it works.
SQLiteFrequentLocal development, single-user tools, and anything where a database server is unjustified.
RedisSometimesCaches and rate limiters. Never as a primary store, no matter how tempting the benchmark.
ClickHouseAnalyticsEvent pipelines and reporting where Postgres would need aggregates nobody wants to maintain.

For day-to-day work it is psql with a hand-written .psqlrc that turns on timing and a useful prompt. I have tried three GUI clients and keep returning to the terminal, which is less about purity than about copy-pasting query plans into tickets.

Web and design

  • Hand-written CSS with cascade layers. This site is one 1,300-line stylesheet and it has never needed a refactor.
  • Vite when a project genuinely needs a build step. Not for sites like this one.
  • Playwright for end-to-end tests, and for the screenshots in client reports.
  • Storybook for design systems, mostly because it is the fastest way to show a non-engineer what changed.
  • Figma for reading, not for drawing. I design in the browser because that is where the constraints are.

Services

ServiceUsed forPaying since
HetznerServers in Falkenstein and Helsinki. Predictable pricing, no surprises on the invoice.2019
CloudflareDNS and nothing else. I keep the proxy off to avoid debugging two networks at once.2020
FastmailEmail, calendar and the domains I manage for clients.2018
GitHubCode, issues and Actions. Boring, and that is a compliment.2014
1PasswordCredentials and the shared vaults I keep with clients.2017
Grafana CloudMetrics and dashboards for client systems, on the free tier more often than not.2022
UmamiSelf-hosted, cookieless analytics for client sites. This site runs none at all.2023

This site

Worth stating plainly, because people ask: there is no framework here. One stylesheet, one small script, hand-written HTML, and nginx serving static files from a single machine. No build step, no dependencies, nothing to update on a Tuesday because a transitive package changed its mind.

  • Typography uses the reader's operating system fonts. No webfont requests, no layout shift, nothing loaded from a third party.
  • The theme toggle stores one preference in localStorage and otherwise there is no client-side state.
  • JavaScript is progressive: navigation, filtering and the reading progress bar all degrade to a readable page without it.
  • RSS is a static XML file. There is no CMS behind any of this — I edit HTML.

What I dropped

A list like this is more honest with the rejections included.

  • Docker Desktop. Replaced by the native engine on Linux and OrbStack on macOS. Half the memory, none of the licensing questions.
  • An ORM. Six years of use, then a year of removing it. I write SQL, and I have not missed the abstraction.
  • A second monitor. See above.
  • Jira. Not my decision on most projects, but I have never once opened it voluntarily.
  • Google Analytics. Replaced by nothing on this site and by Umami on client work. If I cannot explain what the number means, I should not be collecting it.

Found something better?

If you have replaced one of these with something that survived two years in production, tell me. Recommendations from people who have run the thing are worth more than any review.