I'm done with Github

I hosted git and CI at home because I wanted the merge button, and the test that allows the merge, off a dashboard I do not control.

I used to merge this site on Github the way I had merged everything else for a decade, same compare page and green checks and button. I still have that account, because strangers look there first, and a public mirror is an easy way to be findable. What I stopped wanting was for the copy I actually merge, and the job that says the merge is allowed, to live on a dashboard I do not control.

That was not a sudden taste for self hosting. Github spent a couple of years changing what the tab was for. Copilot moved from the editor into the pull request and then onto the invoice, and people watch a month of credits disappear before lunch. Actions still have days where a job never starts, and even a runner in the house has to check in with their servers before it is allowed to work, which means the hardware does not actually cut the cord. I wanted the next private repo on a disk I can pick up because the history matters to me the way the media library matters, and I did not want either of those things to depend on someone else’s week.

I could not have done it on the old Windows tower. After I moved the homelab onto a Pi I finally had a machine I would leave on, and git.justinwilliams.dev stopped being a toy. Forgejo is a Github-shaped forge, with issues and PRs and a YAML file that still thinks it is Actions, which is why the move was possible. I needed the old buttons on a box in the other room, and the repos on their own USB disk so a dead drive would not take the library and the git history in the same afternoon.

Git alone would have left the important question on Github. A pull request is not finished because the diff looks right. It is finished when something runs the tests and I can trust the result enough to merge. I used to borrow that worker. I committed, a hosted runner appeared, and I paid in minutes I barely thought about until the bill or the outage. I put a runner on the same Pi that serves the web UI because I wanted the merge gate in the house, with Forgejo dispatching the job and the Pi executing it. The workflows are the ones I already had, even down to the ubuntu-latest label, because the point was to own the pipeline, not to rewrite it.

A Raspberry Pi 4 is a good git server for one person and a poor build farm. Cloning a repo and merging this site are light. Installing Node and running npm test already make the board work for a living, and two jobs at once or an image build would be a bad joke. The same machine is also the media server, so recordings and CI are both hungry, and the board does not care which one I meant to privilege. I run CI there anyway because a forge that cannot test its own PRs is still waiting on Github for the part that matters. A used desktop under the same runner would mostly end the squeeze, same YAML, more CPU, the forge no longer competing with the TV. I have not bought that desktop. I wanted the pipeline close more than I wanted it fast, and the Pi is already telling me which jobs are too fat.

The git disk has to stay mounted, Forgejo has to get updates, and when a job sits in the queue there is no Github status page to refresh. I already had backups from moving the homelab, and I would not put real repos, or a merge gate I actually trust, on a machine I was going to unplug at night.