One file, one capability: how I stopped maintaining an import list
How the config is laid out. import-tree reads every file in modules/, so there is no import list to keep current, and one convention holds the rest together.
Field notes
Notes from the lab and from my own machines. If a lesson cost me an hour of debugging, it should not cost you a day.
Subscribe with RSS.
Series · eight parts
One flake builds every machine I run. Each part takes one piece of it, the layout, the secrets, the services, the desktop, the editor, and explains why it is shaped the way it is. They read fine on their own.
How the config is laid out. import-tree reads every file in modules/, so there is no import list to keep current, and one convention holds the rest together.
niri with noctalia and a colourscheme, packaged so the whole desktop builds as one thing, and menus that show the keybinds instead of asking you to remember them.
Committing secrets in the open, encrypted with age, using keys derived by ssh-to-age from SSH keys you already have.
Immich, Jellyfin, Grocy and SearXNG on a home server, with nothing reachable from the internet. How the tailnet-only setup is put together.
Building Neovim from an empty init.lua: lazy loading, a colourscheme, a tree-sitter grammar for my own file formats, and nixd pointed at the flake.
ik_llama.cpp built with CPU flags for the hardware I actually have, serving an OpenAI-compatible API to a chat interface.
Three machines that share almost nothing except the flake. What stays common, what stays per-host, and how to stop them drifting apart.
The shell as a derivation: one wrapped package that every entry point resolves to, with git identity set at build time.
Elsewhere
Which engine, which quantization and which context on three specific machines, with the decode and prefill rates each one gives. Readings from daily use rather than a benchmark run.
Read it →Pi, OpenCode and DeepSeek Harness, all pointed at the same OpenAI-compatible endpoint on my own hardware. What each one taught me about the layer between me and the model.
Read it →Interface discovery over an nl80211 dump, then replacing every fork and exec of iw and ip with genl and rtnetlink calls, in a probe that hops 31 channels every four seconds.
Read it →30 keys, 16 RGB LEDs, two cascaded TLC5947 drivers, and about 0.9 A of backlight against a 300 mA supply. What the board taught me about reading a datasheet before ordering parts.
Read it →Everything I run sits on hardware I own, so I opened an account to see the other side of it: security groups, key pairs, instance roles, and what keeps billing after you stop the instance.
Read it →In the queue
Notes from the binary reverse-engineering and memory-corruption challenges, written up challenge by challenge.
How the wifi module decides that a MAC is a device or an access point, and what OUI prefixes, mDNS and SSDP probes could add on top.
The tree-sitter grammar from part 5 in full: the grammar file, the queries, and the topiary formatting rules.
Next on the NixOS server: Nextcloud. The CV already lists it, the server does not run it yet. The note will cover the setup once it is actually up.
Nothing here is published until it is written. No RSS feed yet. Say the word if you want one and I will add it.