Writing

Everything I’ve published here.

Build logs and post-mortems from my own homelab and side projects. Each one starts with what broke, what the numbers said, and what I changed.

rsync moved 167.9 GiB and freed exactly zero bytes Build log

A --remove-source-files move across disks hit a tree of hardlinks, deleted one of two names, kept every byte where it was, and wrote a second full copy. Here's the tell, and the repair.

Six models scored 13/13 on my rubric and none of them worked Build log

22 local one-shots at a single coding task produced one behavioral pass that didn't reproduce. My static grader couldn't separate the pass from the failures, and that turned out to matter more.

My DNS resolver rate-limited the whole house as one client Build log

App Store downloads took 10+ minutes on Wi-Fi and one minute on cellular. Two AdGuard Home defaults gave every device on the subnet a shared 20 qps budget, and the dropped queries never showed up in the log.

95% of my tokens were the same context, resent Build log

835.3M of 879.2M tokens across 3,823 requests were cache reads. I was paying for the search over and over, not for the answer.

Launch day proves nothing Essay

Three of my own systems, measured six months after they shipped. The only property that survived is whether the thing fails loudly when it drifts.

1,688 of my 1,883 contacts are dead weight Project note

Sodalis scores contacts by decayed interaction history and archives the ones nothing touches. Most of the work went into four guards that stop it eating my address book.

A rename is three renames, and I only scripted one Build log

I moved a runtime root from /opt/openclaw to /opt/hog in one clean commit. Seven months later the runbook still points at the old path in ten places.