Projects · the workbench
Tools made because the right one didn’t exist
Engineering is where the letters’ habits of mind were first learned, and it’s still how I build. Know the whole system before touching a part. Find the failure point before it fails. If the right tool doesn’t exist, make it, and make it small enough to still understand in three years. These are the things on the bench right now, and what each one taught.

Training
The round caller
A garage session needs a clock, a voice, and a record, and I kept being all three at once. So the phone does it now. Four kinds of session: rotation at the dummy, integration on a taped footwork grid, resistance work, and, once a block, a single set taken to failure, which is measurement rather than training. The calls are spoken aloud so the punch is a response and not a choice, which is the one thing a bag can’t give you and a mitt-holder can.
When the bell ends the session, it writes the log itself: one row per exercise, appended to the same plain CSV file the record has always lived in, never rewritten. The block label is computed from an anchor date and a cadence, not typed in, so it stays correct without anyone remembering to edit it. That was the failure point in the previous version, and the fix was to remove the human from the step that didn’t need one.

Measurement
The health dashboard
Everything I track about my body lives in three CSV files: check-ins, meals, exercise. A script reads them and writes a self-contained dashboard page and a roadmap that re-projects every milestone from the latest reading. The workshop serves that page, and when a source file is newer than the output, it rebuilds before serving, so the dashboard can never be stale and I never have to remember to run anything.
The design decision that matters most isn’t technical. Progress is reported as a seven-day mean with the individual readings hidden, because a single morning’s number is noise and, worse, a verdict. The entry forms show nothing back. The plan constants live in one place, and the block windows are computed from a cadence, because the day I hard-coded a block’s dates was the day the dashboard started confidently showing a closed block. Same failure point as the round caller’s log, same fix.
A school’s classroom
A learning platform for a martial arts school
The school I train at teaches by transmission, teacher to student, and wanted to reach students who can’t be in the room. I built and keep the platform: a Moodle site carrying the curriculum level by level in the order it’s taught, video classrooms for live sessions, shared files, and a single sign-on so a student has one identity across all of it. Email leaves through a proper sending service with the authentication records that keep it out of spam folders, and everything is reached through tunnels rather than open ports.
Alongside it, the school’s public site was rebuilt from scratch this year on a custom theme, with a staging copy for trying things and a cutover plan written before the cutover. What it taught: never jump a major version, because a half-migrated identity system breaks both the old and the new; and the most useful document in a project is the one that says how to put it back the way it was.
The ground under this page
A homelab you can lose a piece of
This site, the school’s platform, and a household’s files and home automation all run on a few servers in my house. In May the network under them was rebuilt: renumbered and cut into segments so that if the most exposed machine is ever compromised, the attacker doesn’t inherit the storage, the secrets, or the personal devices. No new hardware, every step written with its own rollback, the whole cutover done in one afternoon with a plan reviewed by a second opinion before it started.
Backups follow the plain rule: three copies, two kinds of storage, one off-site. Every service is captured nightly into encrypted, deduplicated archives on a separate storage server, with monitoring that complains when a backup goes stale, and the restore drill treated as part of the work rather than an afterthought. The lesson that cost the most: an archive that completed with a warning is still an archive, and a script that treats a warning as failure will quietly stop recording success. Read the exit code, not the mood.
Writing
The letters pipeline
Each letter is written with AI tools inside a process I direct, and the process is the project. A draft is produced, then argued with: one pass for whether the reasoning holds and the letter keeps its own rules, one that checks every quotation, attribution, and etymology against a real source and grades it, one for the sentences, and one for whether it still sounds like the rest of the run. The critics critique; they don’t edit. I read every line and decide what stays.
The accuracy pass exists because of a specific failure: a letter once asserted a hopeful metaphor as settled etymology, and nothing in the chain was checking whether claims were true. What each letter draws on becomes a short note below the rule, offered and never assigned. The whole thing is tiered on purpose, so the rigor doesn’t become the courtroom the letters are dismantling. A small script pushes the finished Markdown and its recording here, and a scheduler releases one each Sunday. How I make this says the rest.
Hands
A sweater vest, from my own pattern
The one project here with no log, no dashboard, and no deadline. A worsted-weight vest worked from a pattern I wrote myself, a few rows at a time in the evening. Knitting math is the same discipline as everything above (swatch first, calculate, then trust the numbers), applied to the one domain where I’ve decided nothing gets measured after the swatch. It’s on this page because the other five would be worse without it.