CI You Can Afford to Run on Every Push
Closing real CI gaps while treating runner minutes as a budget: hermetic Playwright e2e, measured coverage gates, and the gate we refused to add.
Thoughts on AI-powered changelog generation, developer tools, and building in public.
Closing real CI gaps while treating runner minutes as a budget: hermetic Playwright e2e, measured coverage gates, and the gate we refused to add.
A routine Fly deploy was uploading a 477 MB Docker build context. On dockerignore semantics, silent deploy waste, and the fix that cut it to about 3 MB.
Review before publishing used to be a Pro feature. Why paywalling the safety check on AI output was backwards, and what changed when we ungated it.
A shared local test DB, parallel worktree agents, and an Alembic catalog collision. Why a 30-line POSIX file lock beat per-run databases.
Why a hallucinated release note is the worst failure for an AI changelog tool, and the three invariants KittyLog holds its generation pipeline to.
Our blog and README contradicted our own pricing page. How KittyLog now generates pricing constants from one YAML file instead of transcribing them.
For seven months KittyLog's README carried a quote from "Happy Customer," who never existed. How filler proof survives, and why absence beats invention.
KittyLog's production schema drifted from its Alembic chain: twelve timestamp columns, one stamped migration, and a guard that fails closed.
KittyLog's usage metering broke silently for most of a day while changelogs kept shipping. What a zero-token day taught us about alarming the meter.
A look at the OpenNext migration, the Pages compatibility proxy, and the deployment checks that keep the front door stable.
What an opt-in GitHub Release integration taught us about event seams, ownership markers, and leaving human notes alone.
A queue-health issue can make the boundary between finished content, scheduled posts, and human editorial judgment visible.
Changelogs are the most neglected piece of developer docs. Automation is not just convenient; it is the only way to keep them accurate.
For too many teams the changelog workflow is scrolling through 200 commits and writing something probably wrong. There is a better way.