Forgejo vs Gitea: Self-Hosting Your Git Server in 2026

If you self-host anything, you have probably stared at the Forgejo/Gitea choice and thought "they're the same thing, right?" Four years after the fork, they are the same thing the way a river upstream and downstream of a dam is the same water. Same origin, diverging behavior. This is a practical comparison for someone running a handful of repos on a $10 VPS or an old mini-PC — what actually differs, and how to choose.

A fork by necessity

Gitea began in 2016 as a community fork of Gogs, and by 2021 it was the default self-hosted Git server: one static binary, SQLite or Postgres, and a web UI that felt like GitHub without the megacorp. In late 2022, a chunk of the maintainer team split to form Forgejo, after the project's commercial company (Gitea Ltd) was set up with a governance model the community felt was opaque. Forgejo is now stewarded by Codeberg e.V., the non-profit that runs Codeberg.org — a public Forgejo instance with hundreds of thousands of users.

The practical upshot: both projects share a vast amount of code, both regularly merge fixes from each other, and both will happily host your repos. The differences are in licensing, governance, and a small but growing set of features.

Licensing and governance: the real fork

GiteaForgejo
LicenseMITAGPL-3.0-or-later
StewardGitea Ltd (company)Codeberg e.V. (non-profit)
Public instancegitea.comcodeberg.org
Contribution modelMaintainer-led, company-backedCommunity-led, non-profit-backed

For most homelab users the license difference is theoretical — MIT means you could take Gitea, close it, and sell it; AGPL means any modified network service must publish its source. If you care about the guarantee that the software you depend on stays open, AGPL is the stronger promise. If you care about a company being accountable for release cadence and security patches, Gitea Ltd gives you that accountability instead.

Feature parity, and where they've drifted

Both ship the same core: repos, issues, PRs, milestones, labels, wiki, releases, packages, and a REST API. The drift is at the edges:

  • Actions/CI. Gitea Actions and Forgejo Actions are both GitHub Actions–compatible runners (you can even point a gitea/act_runner at either server). Gitea's Actions are more battle-tested and documented; Forgejo's are slightly younger but work the same way — drop a .forgejo/workflows or .gitea/workflows file in your repo and a runner picks it up.
  • Federation. This is Forgejo's headline feature: based on ActivityPub, a Forgejo instance can follow repositories, issues, and users on other Forgejo instances — federated code review across servers. Gitea has experimental ActivityPub support for user profiles, but Forgejo is far ahead on cross-instance interaction. If you've ever wanted to file an issue on someone else's self-hosted instance from yours, that's a Forgejo feature.
  • Release cadence. Gitea ships on a regular schedule with a polished upgrade path. Forgejo also ships regularly, tied to Gitea's upstream releases plus its own hardening patches.
  • Packaging. Both offer Docker images for linux/amd64 and linux/arm64 — tiny on a Raspberry Pi. Forgejo publishes codeberg.org/forgejo/forgejo; Gitea publishes gitea/gitea. Both support SQLite for single-user homelabs and Postgres for serious use.

Migration is a non-event

Here is the killer practical detail: migration between them is one-click. Both read the other's data dump format (gitea dump / forgejo dump), and the web UI has "Migration" → "Forgejo" / "Gitea" importers. Your issues, PRs, wiki, and releases survive. Losing server-side hooks and runner registration is the only real cleanup. This means the choice is not a trap — pick the one whose governance you trust, and switch later if it disappoints. That alone should lower the stakes of this whole comparison.

The homelab checklist

Whichever you pick, the setup is the same shape. A minimal Docker Compose service looks like:

services:
forgejo:
image: codeberg.org/forgejo/forgejo:10
container_name: forgejo
restart: unless-stopped
environment:
- USER_UID=1000
- USER_GID=1000
- FORGEJO__server__DOMAIN=git.example.com
- FORGEJO__server__ROOT_URL=https://git.example.com/
volumes:
- ./data:/data
- ./repos:/data/git/repositories
ports:
- "3000:3000"

Then put it behind your reverse proxy, add a runner container for CI, and point your git remote at it. Ten minutes to a private GitHub.

Verdict

For a solo homelab, the difference is close to invisible — both are excellent, lightweight, and free. Choose Forgejo if you want a non-profit steward and care about federation and the AGPL guarantee. Choose Gitea if you want the larger install base, the company-backed cadence, and the most mature Actions implementation. And if you genuinely cannot decide, flip a coin: the migration path means you get to change your mind without paying for it.