
From GitHub to Forgejo
Back in December 2025, I stopped using GitHub for new personal projects. I started pushing to a server sitting in my house instead. Some open source work, rehype-code-titles and client code for JokinglyBadTech still lives on GitHub. But anything new and personal goes to Forgejo.
This was before GitHub was getting dunked on weekly for outages, supply chain attacks, etc. Mostly my decision boiled down to two things:
- I loathe MicroSoft with every fiber of my soul.
- My code being used to train LLMs.
It is not like my personal projects are winning any Nobel Prizes. Like every good developer, most of my side projects languish and die with domains that follow suit. It is the principle of it all. If I want to send my codebase to Anthropic along with $100 a month, that is my decision to make. Microsoft having their tentacles in everything is a hard pass. Self-hosting Ollama and running open source models like DeepSeek or Qwen is on the list — at some point Anthropic gets the boot too.
Why Forgejo
The Umbrel App Store makes the decision pretty easy for choosing an alternative: Forgejo, Gitea, and GitLab are all right there. Three options, pick one. I had used GitLab in the cloud at a previous job and was not a fan, so that one was out immediately.
I started with Gitea back in November 2025 and it was fine. Ultimately I ended up switching to Forgejo and have not looked back. Yes, Forgejo is a fork of Gitea. Yes, under the hood they are basically the same thing. I just preferred it.
A real selling point for anyone looking to move off of GitHub is that both Gitea and Forgejo support near one-to-one compatibility with GitHub Actions.
My Setup
I run an Umbrel home server. Forgejo is available directly from the Umbrel App Store. The whole install took maybe five minutes.
Getting it accessible from the outside world is where it gets a little more interesting. I use Cloudflare Tunnels to expose my Forgejo instance without opening ports on my home network. The tunnel runs via the Cloudflare Tunnel app on Umbrel, configured through the Zero Trust Dashboard and cloudflared on my MacBook Pro. It sounds more complicated than it is.
For CI/CD, I set up Forgejo runners manually (the App Store does not cover that part), so there is some actual configuration involved.
I put together a full step-by-step guide that covers all of it:
- Configuring Forgejo on Umbrel (docker-compose and app.ini)
- Setting up a Cloudflare Tunnel to expose your instance
- Securing access with Cloudflare Zero Trust
- Setting up Forgejo runners for CI/CD
- Migrating repos from GitHub and updating your local remotes
- SSH through the Cloudflare Tunnel for Git operations
It is the guide I wish I would have had when I was setting this up myself.
Wrap Up
A few months in and I cannot say there have not been growing pains. My infrastructure is not GitHub’s, so running Playwright e2e tests takes me back to the days of “go make a cup of coffee and watch the grass grow.” Other than that, things work fine. It is also just me, so it is not like the instance is supporting billions of lines of AI slop being committed daily.
Until next time,
Cody