Shipping Greenhouse's release pipeline on a security camera's Mac Mini
A self-hosted macOS build runner sharing a box with an NVR, a DMG bundler that drives Finder through AppleScript, and the env var that overrode my env var.
Notes on the software, games, and music coming out of Imperfect Systems.
RSS feedA self-hosted macOS build runner sharing a box with an NVR, a DMG bundler that drives Finder through AppleScript, and the env var that overrode my env var.
Why a newsletter batch needed its own model instead of reusing the 1:1 post-sync pattern, plus Listmonk's odd auth scheme and a Brakeman quirk.
One protocol method, a reused state enum, a routing convention that held, and a lint budget that forced a split worth making anyway.
A spec that states its own encoding wastes 2 bits and then never says how the remaining 128 map onto its two fields - decoded by trusting the spec's own worked example over its prose.
A fetched table of RFC hex values looked fine until I checked digit counts: several entries were a character short, a summarization artifact, not a spec error.
A spike into Tauri's asset protocol, a runtime-scoped grant for a user-chosen vault, a narrow CSP widening, and an autoplay bug the a11y tests caught first.
Measuring on device found a whole-library scan running on every Discover batch - and a 16x measurement trap where the HTTP cache flattered the wrong path.
A try? ?? [] made network failure indistinguishable from "no releases", which let an outage cache an empty feed over good data for 24 hours.
A filter setting only applied after relaunch, since a TabView keeps view models alive and seeded state stays frozen. The fix deleted a concept, not a bug.
CLAUDE.md is great for stable conventions, but bad at holding gotchas and hard-won lessons. That needs one shared vault, not a copy per repo.
Page 4 of 14