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.
| Machine | Spec | What it is for |
|---|---|---|
| MacBook Pro 14" | M3 Pro · 36GB · 1TB | Everything portable. Runs Docker, Postgres and two browsers without complaining. |
| Workstation | Ryzen 9 7900 · 64GB · 2TB NVMe | Load tests, large imports, long-running Postgres experiments, video calls. |
| Monitor | Dell U2723QE · 27" 4K | One screen, no second. A 4K panel at 200% scaling gives me more usable rows than two 1080p panels ever did. |
| Keyboard | Keychron Q1 Pro | Boba U4T switches, ISO layout, no RGB. Quiet enough for a shared studio. |
| Mouse | Logitech MX Master 3S | Mostly for the horizontal scroll wheel, which I use constantly in diff views. |
| Headphones | Sony WH-1000XM5 | Noise 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,
noUncheckedIndexedAccesson, and I will argue aboutany. - 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
| Store | State | Notes |
|---|---|---|
| PostgreSQL 17 | Default | Every project starts here. Managed by pgBackRest, restored from backup at least twice a year to prove it works. |
| SQLite | Frequent | Local development, single-user tools, and anything where a database server is unjustified. |
| Redis | Sometimes | Caches and rate limiters. Never as a primary store, no matter how tempting the benchmark. |
| ClickHouse | Analytics | Event 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
| Service | Used for | Paying since |
|---|---|---|
| Hetzner | Servers in Falkenstein and Helsinki. Predictable pricing, no surprises on the invoice. | 2019 |
| Cloudflare | DNS and nothing else. I keep the proxy off to avoid debugging two networks at once. | 2020 |
| Fastmail | Email, calendar and the domains I manage for clients. | 2018 |
| GitHub | Code, issues and Actions. Boring, and that is a compliment. | 2014 |
| 1Password | Credentials and the shared vaults I keep with clients. | 2017 |
| Grafana Cloud | Metrics and dashboards for client systems, on the free tier more often than not. | 2022 |
| Umami | Self-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
localStorageand 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.