For over a decade, GitHub was the undisputed home of the open source community. Lately, its wobbly availability and aggressive AI push have prompted second thoughts about relying on it exclusively. This post describes why the JUnit team started experimenting with Codeberg and how we keep a mirror of our repository in sync.
I created my GitHub account in March 2010. My first pull request to JUnit was merged in October 2011. At the time, working with GitHub was like a breath of fresh air compared to previous platforms like Sourceforge. Over the next decade, every software developer I knew opened an account. The platform was celebrated for its engineering excellence. Someone working at GitHub was met with reverence. The Octocat, GitHub’s mascot, featured as a sticker on countless developer laptops. In short, GitHub was where the open source community met to discuss and collaborate.
Fast-forward to 2026, where GitHub appears to be struggling with a measly three nines availability, documented in all its glory shame by The Missing GitHub Status Page.
To make matters worse, GitHub is aggressively pushing AI into the faces of its users whether they like it or not.
There are quite a few projects that have had enough.
To name just one example, the Zig project quit GitHub a while ago because of the platform’s “AI obsession”.
Collaborating with others on GitHub means a lot to me, and I’m not yet ready to give up and quit the platform. Nevertheless, putting all our faith in a US big tech company (GitHub was acquired by Microsoft in 2018) does not seem like a good idea, either. Therefore, we in the JUnit team have decided to start experimenting with other platforms. For us, Codeberg seemed like the obvious choice. While it’s not as popular as GitHub and doesn’t yet have feature parity, it’s backed by a non-profit organization (a German e.V.) and has a growing user community. That it runs on Forgejo, an open-source Git forge forked from Gitea, is another plus because it leaves the door open for self-hosting an instance in the future.
For a start, we have created a junit-team organization and a junit-framework repository on Codeberg. Forgejo/Codeberg has a migration assistant that can directly import GitHub repositories, including their issues, pull requests, etc. For now, we’ve decided to only import and mirror the Git repository, though, since we still want to keep the GitHub repo as the main source of truth and place to discuss. To keep both repos in sync, we use a GitHub Actions job that is scheduled periodically. That’s all there is to it.
Of course, not having migrated our issues to Codeberg limits what collaboration we can expect. While we do accept pull requests on Codeberg, we haven’t yet received a single one. Nevertheless, it feels good to have a backup of the repository in a central location (in addition to local clones). To support the platform, the JUnit GbR (our legal entity in Germany) has joined Codeberg e.V. as a member. Give the JUnit repo on Codeberg a try, star it, open a PR, and consider joining Codeberg e.V. as well!