The CI on this site went red and stayed red. Every push failed in about four seconds. I assumed I’d broken something, but the tests passed locally and the site deployed fine. The actual message, once I dug it out of the run annotations, was about billing — GitHub Actions minutes on a private repo, blocked behind a payment issue, not a line of my code.
So I had a choice. Pay for Actions minutes on a personal site, make the repo public to get free unlimited ones, or stop running CI in the cloud.
I went with the third. The whole point of CI here is “don’t ship something broken,” and that doesn’t have to live on a server. I moved the gate to a pre-push git hook: before anything reaches the remote it runs the type check and the smoke suite, and refuses the push if either fails. Same protection, no minutes, no queue. The cloud workflow is still in the repo, parked, with a note on how to switch it back on if I ever fix billing or make the repo public.
There was a second gotcha in the same stretch. A deploy quietly landed in an error state because the commit author didn’t match a recognized member of the deploy team’s SSO — the build never even started. The fix was setting the right git identity on the repo. Nothing in the code; everything in who the commit said it was.
The lesson I keep relearning on personal projects: match the tooling to the size of the thing. A one-person private repo doesn’t need a cloud CI bill. A thirty-second hook that runs on my machine before I push covers it, and it’s one fewer external service that can go red for reasons that have nothing to do with the work.