Moving CI to a self-hosted runner after GitHub broke our billing
Dead CI, live deploys: folding every job onto the homelab runner, deleting the hosted-runner compensation machinery, and the CVE backlog waiting behind the gate.
Notes on the software, games, and music coming out of Imperfect Systems.
RSS feedDead CI, live deploys: folding every job onto the homelab runner, deleting the hosted-runner compensation machinery, and the CVE backlog waiting behind the gate.
Dependency scanning without a new CI job, grouped update PRs, and the virtual-workspace detail that makes the cargo entry point at the wrong directory.
A one-time cleanup fixed 80 posts and promised nothing. The second fix is twelve lines that fail the build, with zero exceptions.
Library ids fed to catalog requests: two symptoms, one bug, a device-verified fix, and the 1,610-artist number that forced a redesign.
The Not Interested store only ever kept keys. Then it had to become a screen, and the model needed to carry its own description.
The UI arc: a wizard shell built before its steps existed, a capture flow torn out for being wrong, and the gap between green checkmarks and the truth.
118 green tests, a clean simulator pass, and dead buttons on a real phone. The bug was a @MainActor service doing synchronous work between awaits.
The folder layout that outlives the app: zones versus stages, a config that refuses to overwrite itself, a database printout, and adopt-in-place import.
A full Rust rules engine and 22 tests, written before Greenhouse had a UI or even a working Rust toolchain, and what broke the moment it finally compiled.
Why Imperfect Systems is keeping a public dev log, and how the blog is wired up under the hood.
Page 14 of 19