Stack

Machines

macOS

I run it because iOS and Mac builds need it, then spend the rest of my time making it behave like i3.

It gets close. My dotfiles are up if any of it is useful. If you know other Mac tooling like this, tell me about it. It is the rabbit hole I enjoy most.

Arch + i3

My main setup, and has been for years. i3 and a keyboard is most of what I want from a desktop. I like KDE with Krohnkite too, and keep it installed with a Windows 7 theme for nostalgia.

Omarchy

Trying it lately, honestly seems pretty good, but there’s a weird feeling I have about the fact that another man set up my config. I don’t like the Hyprland animations so it’s basically i3 for me.

Servers

Nearly all of them run Debian 13 LTS, server edition. Most of what runs on them is self-hosted:

Plus a pile of smaller things I keep meaning to write down.

Coding setup

Neovim

My editor. Vim motions are my religion and gender. Telescope is the main plugin, I keep it pretty minimal otherwise.

herdr

I used tmux for years. herdr does the same job but looks different, and the keys are the same so switching cost me nothing.

AI tools

pi

A minimal agent harness. Bring your own provider, add your own tools, and run it interactively or from a script rather than bending your workflow around someone else’s.

Claude Code

In the terminal, and a big part of how I work now.

Codex

The desktop app. I go back and forth between this and Claude Code, but I lean Codex slightly.

GLM 5.3 Flash

What I run inside pi most of the time. My go-to for small jobs: parsing docs, one-off bash scripts, quick reformatting. Fast and cheap enough that I do not think about running it.

Languages

C

My favourite language to write. Nothing sits between you and the machine, and it is small enough to keep the whole thing in your head.

Rust

Learning it properly at the moment, mostly to pull pieces of my Node monoliths out into microservices, and working through sockets for the chat apps. I am enjoying it a lot more than I expected to, and it might take over from C as my favourite before long.

C++

Nitro modules, mostly. Template metaprogramming across the native bridge, where the binding has to resolve at compile time.

TypeScript / Node

What I default to, because it is the quickest way for me to get something working. I move off it when the job is properly concurrent or CPU bound.

Go

Used it a lot. Not the most fun language to write, but it gets the job done and stays out of the way. (this static site is in hugo.)

Python

My pseudocode. Mostly scripting.

Mobile

Expo

Expo is awesome. It has been my default since expo-ui shipped, because real native views out of one codebase was the last thing I was missing. EAS handles builds and OTA updates.

Swift

Native iOS. SwiftUI first, UIKit when SwiftUI runs out.

Desktop

Tauri 2

Single-digit megabyte binaries, because it uses the system webview instead of bundling Chromium. My default for anything cross-platform.

SwiftUI

For apps that only ever need to run on a Mac. Tauri does not buy me anything there, and I drop into AppKit whenever SwiftUI does not cover something.

Data

SQLite

I love SQLite. I go local-first wherever I can, and it is the thing that makes that pleasant: the device holds the source of truth, so syncing happens in the background instead of behind a spinner.

Postgres

Server side. Drizzle or raw SQL these days.

Random stuff

AirPods

For anything where I am moving around.

Grado SR80e

For everything else. They look great and they sound amazing.

Coffee

Black Cat Classic Espresso from Intelligentsia, most weeks.

Guitars

I buy old ones off Facebook Marketplace and fix them up. Usually ES-335 copies from brands nobody has heard of.

Languages, tools, and the machine I work on.