<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Forgejo | Derek Armstrong — Software Engineer · AI · Infrastructure</title><link>https://derekarmstrong.dev/tags/forgejo/</link><atom:link href="https://derekarmstrong.dev/tags/forgejo/index.xml" rel="self" type="application/rss+xml"/><description>Forgejo</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Sat, 23 May 2026 00:00:00 +0000</lastBuildDate><image><url>https://derekarmstrong.dev/media/sharing.png</url><title>Forgejo</title><link>https://derekarmstrong.dev/tags/forgejo/</link></image><item><title>Why I Use Both GitHub and Forgejo - And Why That Matters</title><link>https://derekarmstrong.dev/blog/why-forgejo-git-ci-and-you-should-too/</link><pubDate>Sat, 23 May 2026 00:00:00 +0000</pubDate><guid>https://derekarmstrong.dev/blog/why-forgejo-git-ci-and-you-should-too/</guid><description>&lt;h2 id="the-setup"&gt;The Setup&lt;/h2&gt;
&lt;p&gt;I use GitHub for my public projects. I share code there, participate in the community, open issues on other people&amp;rsquo;s repos, and let people discover my work. That part of my workflow is locked into GitHub — not because I love the company, but because that&amp;rsquo;s where the developers are. The network effect is real.&lt;/p&gt;
&lt;p&gt;I also run Forgejo on my own hardware. Self-hosted. My rules, my servers, my data. No corporate oversight, no acquisition risk, no sudden policy changes from a company that answers to shareholders.&lt;/p&gt;
&lt;p&gt;They look similar because they&amp;rsquo;re built on the same lineage. GitHub Actions and Forgejo Actions share the same YAML syntax, same &lt;code&gt;runs-on:&lt;/code&gt; labels, same &lt;code&gt;actions/checkout@v4&lt;/code&gt; kind of steps. The only structural difference is where you put your workflow files: &lt;code&gt;.github/workflows/&lt;/code&gt; on GitHub, &lt;code&gt;.forgejo/workflows/&lt;/code&gt; on Forgejo. Sometimes &lt;code&gt;.github/workflows/&lt;/code&gt; works on Forgejo too, depending on your version and configuration.&lt;/p&gt;
&lt;p&gt;I use both. Not because I am hedging my bets. Because they solve different problems.&lt;/p&gt;
&lt;h2 id="what-forgejo-is"&gt;What Forgejo Is&lt;/h2&gt;
&lt;p&gt;Forgejo is a self-hosted Git forge. It does the expected things well:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Repositories, pull requests, code review, and issue tracking&lt;/li&gt;
&lt;li&gt;Wiki, package registry, releases&lt;/li&gt;
&lt;li&gt;Repository mirroring — less talked about, extremely useful&lt;/li&gt;
&lt;li&gt;Built-in CI/CD via &lt;strong&gt;Forgejo Actions&lt;/strong&gt; (GitHub Actions-compatible)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Forgejo powers Codeberg, the non-profit code hosting platform. It&amp;rsquo;s developed under the umbrella of Codeberg e.V., a German non-profit whose entire mission is guaranteeing the openness and continued availability of free software. The license is GPLv3+ starting with v9.0 — a deliberate choice that prevents someone from taking the code, stripping it down, and selling it as a proprietary product without sharing their changes.&lt;/p&gt;
&lt;p&gt;The people building it are volunteers, grant recipients, and donors through Codeberg&amp;rsquo;s Liberapay. No venture capital. No acquisition target. Just people who want a sustainable, community-controlled Git forge.&lt;/p&gt;
&lt;p&gt;That is the story. The features are secondary.&lt;/p&gt;
&lt;h2 id="the-feature-that-actually-matters"&gt;The Feature That Actually Matters&lt;/h2&gt;
&lt;p&gt;Here is what I care about: Forgejo Actions lets me run CI on my own hardware using the same workflow syntax that GitHub uses.&lt;/p&gt;
&lt;p&gt;My setup is a single Debian VM on my homelab, running two Forgejo runner instances via systemd template services. Each runner pulls Docker containers for &lt;code&gt;ubuntu-latest&lt;/code&gt; jobs. The runners are lean — just enough cores and disk to chew through builds without complaining.&lt;/p&gt;
&lt;p&gt;Workflows live in &lt;code&gt;.forgejo/workflows/&lt;/code&gt; in your repository. They work just like GitHub Actions. Write the YAML, push, and the runner picks it up.&lt;/p&gt;
&lt;p&gt;This is the practical bridge between the two platforms. I can write a workflow once, adapt it slightly, and run it on my own hardware with zero GitHub dependency. The syntax is familiar because Forgejo Actions was built on &lt;code&gt;act&lt;/code&gt;, the open-source project that runs GitHub Actions locally. It&amp;rsquo;s designed to be familiar, not identical — the Forgejo team has said they don&amp;rsquo;t plan to chase GitHub&amp;rsquo;s changes. That&amp;rsquo;s intentional. They want users to feel comfortable, not locked in.&lt;/p&gt;
&lt;p&gt;My daily use:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Automating Docker image builds&lt;/li&gt;
&lt;li&gt;Running tests on code changes&lt;/li&gt;
&lt;li&gt;Handling deployments across my homelab&lt;/li&gt;
&lt;li&gt;Mirroring public GitHub repos to my Forgejo instance for backup&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The mirroring is worth calling out. I use it for some of my projects — push to GitHub, mirror to Forgejo. The &lt;code&gt;.forgejo/workflows&lt;/code&gt; folder is ignored on GitHub, but the &lt;code&gt;.github/workflows&lt;/code&gt; folder on Forgejo can be configured to work too (depending on your version). It&amp;rsquo;s not a perfect one-way sync, but it&amp;rsquo;s good enough for what I need.&lt;/p&gt;
&lt;h2 id="why-not-just-use-github"&gt;Why Not Just Use GitHub&lt;/h2&gt;
&lt;p&gt;Two words: vendor lock-in.&lt;/p&gt;
&lt;p&gt;GitHub is a fantastic product. But it is also a for-profit company owned by Microsoft. Their pricing changes. Their policies change. Their AI features eat into your private code. Their terms of service are not something you control.&lt;/p&gt;
&lt;p&gt;When you build your CI/CD around GitHub Actions, you are building on rented land. You can migrate — it&amp;rsquo;s not impossible — but it is painful. Every workflow file references GitHub&amp;rsquo;s APIs, GitHub&amp;rsquo;s runner images, GitHub&amp;rsquo;s marketplace. You are tied to their ecosystem.&lt;/p&gt;
&lt;p&gt;Forgejo removes that dependency. Your CI runs on your network, with your hardware. Credentials, artifacts, logs — everything stays local. Want more concurrency? Spin up another runner. Need a heavier build environment? Give the VM more RAM. You are not paying per minute to a cloud provider, and you are not at the mercy of a vendor&amp;rsquo;s pricing page.&lt;/p&gt;
&lt;h2 id="why-not-just-use-forgejo"&gt;Why Not Just Use Forgejo&lt;/h2&gt;
&lt;p&gt;Because I want people to find my work.&lt;/p&gt;
&lt;p&gt;GitHub is where the open source community lives. People file issues, submit pull requests, star repos, fork projects. If you want your code to be discovered, used, and contributed to, GitHub is still the place to be. The network effect is not a marketing claim — it&amp;rsquo;s a measurable reality. Most open source projects live on GitHub because that&amp;rsquo;s where the developers already are.&lt;/p&gt;
&lt;p&gt;Forgejo is excellent for private projects, for code you want to control, for infrastructure you want to own. But it is not a community platform. There is no &amp;ldquo;trending&amp;rdquo; page. No discovery mechanism. No way for a random developer to stumble across your project and submit a pull request.&lt;/p&gt;
&lt;p&gt;Running both is not redundancy. It&amp;rsquo;s strategy.&lt;/p&gt;
&lt;h2 id="the-workflow"&gt;The Workflow&lt;/h2&gt;
&lt;p&gt;Here is how it actually works in practice:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Public repos&lt;/strong&gt; live on GitHub. I use &lt;code&gt;.github/workflows/&lt;/code&gt; for CI. People discover my work, file issues, submit PRs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mirror repos&lt;/strong&gt; go to my Forgejo instance. The mirror keeps a copy safe on my hardware.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Private repos&lt;/strong&gt; live on Forgejo. &lt;code&gt;.forgejo/workflows/&lt;/code&gt; for CI. No GitHub dependency.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Forgejo Actions&lt;/strong&gt; can often reuse GitHub Actions workflow files with minimal changes. The syntax is the same. The runner is different. The YAML is familiar.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Forgejo&amp;rsquo;s mirroring feature makes this frictionless. Set it up once, and your GitHub repos are automatically synced to your self-hosted instance. You get a backup that runs its own CI, independent of GitHub&amp;rsquo;s infrastructure.&lt;/p&gt;
&lt;h2 id="the-culture-question"&gt;The Culture Question&lt;/h2&gt;
&lt;p&gt;This is the part that actually matters.&lt;/p&gt;
&lt;p&gt;Gitea and Forgejo are basically the same product. Same codebase lineage, same feature set, same UI. The difference is not technical — it&amp;rsquo;s cultural.&lt;/p&gt;
&lt;p&gt;Gitea&amp;rsquo;s lead maintainer founded a for-profit company, transferred trademarks, and started pushing toward an open-core model with a hosted SaaS product. The code stayed open source — technically — but the direction felt off. Long-time maintainers left. Trust broke.&lt;/p&gt;
&lt;p&gt;Forgejo started as a soft fork of Gitea in December 2022, then went hard fork in early 2024. The people who left Gitea decided they would rather build something where the project&amp;rsquo;s governance matched its stated values. Forgejo runs under Codeberg e.V., a German non-profit. GPLv3+ license. No acquisition target. No SaaS push.&lt;/p&gt;
&lt;p&gt;I care about that. Not because I am some open-source purist with a sign outside my door, but because I am building infrastructure I expect to still be here in three years. Long-term stability is not a nice-to-have for homelab gear. It is the whole damn point.&lt;/p&gt;
&lt;h2 id="the-bottom-line"&gt;The Bottom Line&lt;/h2&gt;
&lt;p&gt;If you are building infrastructure you want to own, run Forgejo. If you want your code to be discovered and contributed to by the open source community, use GitHub. Running both is not a compromise — it is the best of both worlds.&lt;/p&gt;
&lt;p&gt;I am not saying Forgejo is perfect. The federation features are experimental right now. The documentation is good but still catching up to the velocity of the code. And the ecosystem of community actions is not as large as GitHub&amp;rsquo;s — though the default Actions URL points to
, which has the essentials.&lt;/p&gt;
&lt;p&gt;But for what I need — a reliable, self-hosted Git forge with proper CI/CD that I know will still be around when my next homelab upgrade cycle hits — Forgejo is the right call.&lt;/p&gt;
&lt;p&gt;GitHub for community. Forgejo for control. Both using the same workflow syntax. That is not redundancy. That is a strategy.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Forgejo is a project under Codeberg e.V. Their site is at
, source code lives on
, and you can support them via
.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="next"&gt;Next&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
— self-hosted infrastructure that benefits from the same Git server, with real network hardening practices.&lt;/li&gt;
&lt;li&gt;
— another self-hosted Git option, lighter weight than Forgejo.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>