Abstract teal and amber illustration of a forge anvil merged with branching Git commit nodes representing a self-hosted Forgejo server

Forgejo

Forgejo

Forgejo is a self-hosted Git forge: repository hosting, pull requests, issue tracking, and CI/CD through Forgejo Actions, packaged as a single binary or container. It exists because of Gitea. In October 2022, a group of former Gitea maintainers forked Gitea’s codebase after Gitea’s domain names and trademark were transferred to a new for-profit company without a community vote, then launched Forgejo publicly two months later as, in its own words, “a drop-in replacement for Gitea.” It’s been developed under the non-profit Codeberg e.V. ever since. For anyone comparing the two before picking one, the differences that matter most aren’t in the feature list. They’re in who controls the project.

License: GPL v3.0-or-later (GPL v3+) for Forgejo v9.0 and later, confirmed directly from the LICENSE file in the forgejo/forgejo repository on Codeberg and restated on Forgejo’s own FAQ. That’s a change from where the project started: everything through v8.0 was MIT, inherited from Gitea at the 2022 fork. The switch to GPL v3+ was agreed in June 2023 and took effect in August 2024; Forgejo’s own announcement frames it partly as protection against “exploitive business practices, like creating a modified version of Forgejo with less freedoms to the users,” a fairly direct echo of how the project itself began. Free for any use, commercial and paid hosting included; redistributing a modified Forgejo binary now requires releasing that modification’s source under the same license.

Quick facts: official site forgejo.org · source codeberg.org/forgejo/forgejo, no official GitHub mirror since development happens exclusively on Codeberg · Docker image codeberg.org/forgejo/forgejo, Forgejo’s own registry · latest stable 15.0.4 · rootful and rootless container variants with different internal paths · web UI on port 3000, SSH on container port 22.

Why Forgejo exists

Forgejo’s own account of its founding is direct about the trigger: in October 2022, Gitea’s domain names and trademark moved into a new for-profit company, Gitea Ltd, without consulting the community. An open letter to Gitea’s owners went unanswered, and a group of maintainers built Forgejo instead, placing it under Codeberg e.V., a non-profit association registered in Berlin whose bylaws commit it to “guarantee the openness and continued availability of free software.” Codeberg holds Forgejo’s domain names and trademarks; Forgejo’s governance runs independently of Codeberg’s day-to-day operations. Forgejo started as what its comparison page calls a “soft-fork,” close enough to Gitea that migrating an existing install over was nearly seamless. That changed in early 2024, when Forgejo became a hard fork and its codebase began diverging for real. Forgejo still tests and supports upgrading a Gitea installation directly, database migrations included, but the project is explicit that it’s “no longer guaranteed to be compatible with Gitea” the way it once was. For the fuller Gitea side of this story, see our Gitea fiche.

Installing Forgejo with Docker

This follows the SQLite setup from Forgejo’s own Docker installation guide, the default most homelabs start with. MySQL and PostgreSQL backends are documented separately for larger, multi-user instances.

networks:
  forgejo:
    external: false

services:
  server:
    image: codeberg.org/forgejo/forgejo:15
    container_name: forgejo
    environment:
      - USER_UID=1000
      - USER_GID=1000
    restart: always
    networks:
      - forgejo
    volumes:
      - ./forgejo:/data
      - /etc/localtime:/etc/localtime:ro
    ports:
      - "3000:3000"
      - "222:22"
  1. Install Docker if it isn’t already on the host, save the file above as docker-compose.yml, and run docker compose up -d.
  2. Match USER_UID and USER_GID to whoever owns the ./forgejo folder on the host. Forgejo’s own docs warn the container may not start at all if that ownership is wrong.
  3. Host port 222 maps to Forgejo’s internal SSH server on port 22, so cloning over SSH uses port 222 unless the mapping is changed.
  4. Open http://your-server-ip:3000 and finish the setup wizard. SQLite is pre-filled and fine for a first instance, so the only real decisions are the instance name and the first admin account.
docker compose up -d
docker compose logs -f server

Security notes: Forgejo doesn’t terminate TLS itself, so a public-facing instance still needs a reverse proxy in front of it, like Nginx Proxy Manager or Caddy, or should stay off the open internet behind a private network tool like Tailscale. The docker-compose file above maps ./forgejo to the container by UID and GID, not by folder name, so double-check that ownership before exposing anything publicly; Forgejo’s installation guide notes plainly that the container may fail to start if it’s wrong.

Forgejo vs Gitea: what actually changed

Both projects still share a common ancestor codebase and, for now, most of the same core workflow: pull requests, issues, a package registry, Actions-based CI/CD with GitHub Actions-compatible YAML. What’s diverged since October 2022 is everything around that codebase: who owns it, how contributions are handled, and how each project treats security disclosure and testing.

ForgejoGitea
GovernanceNon-profit Codeberg e.V.For-profit Gitea Ltd
LicenseGPL v3+ since v9.0; MIT beforeMIT throughout
Contributor policyNo copyright assignment requiredCopyright assignment required, even for MIT code
Development toolingSelf-hosted on Codeberg, Woodpecker CI, MatrixGitHub, GitHub Actions, Crowdin
Security advance noticeOpen to vetted third partiesPaying customers only
Forge federationActive development (experimental)No known work

Some of that comparison is Forgejo’s own framing of a dispute it’s clearly not neutral about. But the specific claims underneath are checkable against Gitea’s own pages: its contribution policy does require copyright assignment, even for MIT-licensed code, and its advance security notice is limited to paying customers. The governance and license split isn’t framing, though. Gitea Ltd owns Gitea’s domains and trademark; Codeberg e.V., a non-profit, owns Forgejo’s.

  • Non-profit governance under Codeberg e.V., with Forgejo’s own governance process kept independent from Codeberg’s day-to-day operations
  • Copyleft license (GPL v3+) adopted specifically to make a future Gitea-style takeover harder to pull off against Forgejo itself
  • No copyright assignment required from contributors, unlike Gitea’s policy
  • Security advance notice open to any vetted third party rather than gated behind a paid tier
  • Active work on forge federation over ActivityPub, not currently shipped by Gitea
  • No longer a guaranteed drop-in replacement for current Gitea releases since the 2024 hard fork; only the upgrade path from Gitea is tested
  • No official Windows binaries; support was dropped in 2024 for lack of maintainer expertise to keep testing and packaging it
  • Forge federation is explicitly experimental, and Forgejo warns a breaking change could get a domain’s ActivityPub identity permanently “burned”
  • Younger and smaller than Gitea, which is itself smaller than GitHub or GitLab

Hardware: Forgejo grew out of Gitea’s Go codebase and keeps the same single-binary, SQLite-by-default architecture, so there’s no structural reason it needs more than Gitea’s documented 2 CPU cores and 1GB of RAM for a small instance. Forgejo doesn’t publish its own minimum-hardware page, so treat that as an inference from shared architecture, not a number Forgejo states itself. Our homelab setup guide for beginners covers picking that first machine.

Reaching a self-hosted Forgejo instance from outside the house works the same way it does for any other homelab service: a reverse proxy for a real HTTPS domain, or a private network tool if public exposure isn’t worth it. Our Nginx Proxy Manager and Caddy fiches cover the reverse-proxy route, and Tailscale covers skipping public exposure entirely, the same three options that apply whether Gitea or Forgejo is running underneath.

FAQ

Is Forgejo free and open source?

Yes. Forgejo v9.0 and later is GPL v3+; versions through v8.0 were MIT. Both are free for any use, including commercial and paid hosting for others.

Is Forgejo a drop-in replacement for Gitea?

It was designed as one at the 2022 fork, and upgrading an existing Gitea installation to Forgejo directly is still tested and supported. Since Forgejo became a hard fork in early 2024, full ongoing compatibility with newer Gitea releases is no longer guaranteed.

Can I migrate an existing Gitea installation to Forgejo?

Yes. Forgejo’s own upgrade documentation covers this directly and runs the needed database migrations automatically, even across skipped releases. Forgejo recommends upgrading straight to Forgejo rather than continuing to upgrade Gitea once a migration is planned.

What’s the real difference between Forgejo and Gitea?

Mostly governance and license, not features. Forgejo runs under the non-profit Codeberg e.V. and is GPL v3+; Gitea is controlled by the for-profit Gitea Ltd and stays MIT. Forgejo also doesn’t require contributors to assign copyright, where Gitea does, even for MIT-licensed contributions.

Does Forgejo run on Windows?

Not officially. Forgejo dropped Windows binaries in 2024, citing a lack of maintainer expertise to keep testing and packaging them properly. A community-built Windows version of the Forgejo runner, its CI/CD agent, exists separately.

For anyone already running Gitea without complaints, none of this is urgent; the two are still close enough underneath that switching isn’t required. For a fresh install, it comes down to whether non-profit governance and a copyleft license are worth choosing a younger, smaller project over Gitea.