Gitea vs Forgejo

Forgejo forked from Gitea in late 2022 after Gitea Ltd. transferred governance to a for-profit company, alarming the open-source community. Codeberg e.V. launched Forgejo as a community-governed alternative with a promise: no corporate capture, ever. Two years later, the projects have genuinely diverged. Here is what actually matters when choosing between them.

Quick Verdict

Forgejo is the better choice for most self-hosters. It is community-governed with no risk of future proprietary licensing moves, ships federation support (experimental but progressing), and remains a drop-in replacement for Gitea — same API, same data format, same workflow. If you are starting fresh, pick Forgejo. If you already run Gitea and need specific third-party integrations that only work with Gitea’s ecosystem, stay put. Migrating later is straightforward either way.

Overview

Gitea is a lightweight, self-hosted Git platform written in Go. It provides repository hosting, pull requests, issue tracking, CI/CD (Gitea Actions), a package registry, and a built-in wiki. Gitea is backed by Gitea Ltd., a for-profit company. It has the larger install base and more third-party integrations. See our full Gitea setup guide for Docker deployment details.

Forgejo is a hard fork of Gitea, maintained by the Forgejo community under Codeberg e.V., a German non-profit. It tracks Gitea’s upstream changes but adds its own features — most notably federation via ActivityPub/ForgeFed. Forgejo shares the same core architecture, the same API surface, and the same configuration system as Gitea, making migration between the two trivial.

Feature Comparison

FeatureGiteaForgejo
GovernanceFor-profit (Gitea Ltd.)Non-profit (Codeberg e.V.)
LicenseMITMIT (with contributor covenant)
Federation (ActivityPub)NoExperimental (ForgeFed protocol)
CI/CDGitea Actions (GitHub Actions compatible)Forgejo Actions (same compatibility)
Package RegistryYes (npm, PyPI, Maven, Docker, etc.)Yes (same registries)
Issue TrackerYesYes
Built-in WikiYesYes
Git LFSYesYes
Docker SupportOfficial image on Docker HubOfficial image on Codeberg registry
API CompatibilityGitea API v1Gitea API v1 (compatible)
Third-Party IntegrationsLarger ecosystem (Drone CI, Woodpecker, etc.)Growing (most Gitea integrations work)
AccessibilityStandardImproved (active accessibility work)
Update FrequencyRegular releasesRegular releases (tracks Gitea upstream + own patches)
Resource Usage~170 MB RAM idle~170 MB RAM idle (nearly identical)
Community SizeLarger (older project)Smaller but growing rapidly

Governance — Why It Matters

This is not an abstract concern. In 2022, Gitea’s maintainers transferred the project to Gitea Ltd. without community input. The company controls the trademark, the domain, and release decisions. That does not mean Gitea will go proprietary tomorrow — but it means the option exists.

Forgejo is structured to prevent this. Codeberg e.V. is a registered non-profit. The project uses a soft fork model (tracking Gitea upstream) with independent governance. No single entity can change the license or add proprietary features.

If you are deploying infrastructure you plan to run for years, governance stability matters. Forgejo has the stronger guarantee here.

Federation — The Differentiator

Forgejo is building federation using the ForgeFed protocol on top of ActivityPub — the same standard that powers Mastodon, Lemmy, and the rest of the fediverse. The goal: interact with repositories, issues, and pull requests across different Forgejo instances without creating accounts on each one.

As of early 2026, federation is experimental. Federated starring of repositories works. HTTP signatures on ActivityPub endpoints are implemented. Following users across instances is in progress. Full cross-instance issue and PR interaction is still in development, with an NLnet grant funding the work through April 2026.

This is not a reason to choose Forgejo today for production federation. It is a reason to choose Forgejo if you believe software forges should be decentralized — and you want to be on the platform that ships federation first.

Gitea has no federation support and has not announced plans for it.

Installation Comparison

Both projects deploy almost identically with Docker Compose. The configuration system is the same — environment variables use the GITEA__ prefix in Gitea and the FORGEJO__ prefix in Forgejo (though Forgejo also accepts GITEA__ for backward compatibility).

Gitea Docker Compose

services:
  gitea:
    image: gitea/gitea:1.25.5
    container_name: gitea
    restart: unless-stopped
    ports:
      - "3000:3000"
      - "2222:22"
    environment:
      USER_UID: "1000"
      USER_GID: "1000"
      GITEA__database__DB_TYPE: "postgres"
      GITEA__database__HOST: "db:5432"
      GITEA__database__NAME: "gitea"
      GITEA__database__USER: "gitea"
      GITEA__database__PASSWD: "change_this_password"
    volumes:
      - gitea_data:/data
      - /etc/localtime:/etc/localtime:ro
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: gitea
      POSTGRES_PASSWORD: change_this_password
      POSTGRES_DB: gitea
    volumes:
      - gitea_pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U gitea"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  gitea_data:
  gitea_pgdata:

For the full Gitea setup walkthrough, see How to Self-Host Gitea with Docker Compose.

Forgejo Docker Compose

services:
  forgejo:
    image: codeberg.org/forgejo/forgejo:14.0.3
    container_name: forgejo
    restart: unless-stopped
    ports:
      - "3000:3000"
      - "2222:22"
    environment:
      USER_UID: "1000"
      USER_GID: "1000"
      FORGEJO__database__DB_TYPE: "postgres"
      FORGEJO__database__HOST: "db:5432"
      FORGEJO__database__NAME: "forgejo"
      FORGEJO__database__USER: "forgejo"
      FORGEJO__database__PASSWD: "change_this_password"
    volumes:
      - forgejo_data:/data
      - /etc/localtime:/etc/localtime:ro
    depends_on:
      db:
        condition: service_healthy

  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: forgejo
      POSTGRES_PASSWORD: change_this_password
      POSTGRES_DB: forgejo
    volumes:
      - forgejo_pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U forgejo"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  forgejo_data:
  forgejo_pgdata:

For a full Forgejo setup guide, see How to Self-Host Forgejo.

Both stacks start with docker compose up -d and serve the web UI on port 3000. The initial setup wizard is nearly identical. If you know one, you know the other.

Performance and Resource Usage

Gitea and Forgejo have virtually identical resource profiles — unsurprising given that Forgejo tracks Gitea’s codebase.

MetricGitea 1.25Forgejo 14.0
Idle RAM~170 MB~170 MB
RAM under load (50 repos, CI active)~300-500 MB~300-500 MB
CPU (idle)NegligibleNegligible
Disk (application)~200 MB~200 MB
Startup time~2 seconds~2 seconds

Both are dramatically lighter than GitLab CE, which requires 4+ GB of RAM. Performance is not a differentiator between Gitea and Forgejo.

Migration Path

Moving between Gitea and Forgejo is straightforward because the data format is compatible.

Gitea to Forgejo:

  1. Stop the Gitea container
  2. Replace the Gitea Docker image with Forgejo’s image
  3. Rename environment variable prefixes from GITEA__ to FORGEJO__ (optional — Forgejo accepts both)
  4. Start the container — Forgejo runs its database migrations automatically

Forgejo to Gitea: The reverse works for now, but as Forgejo diverges further (particularly with federation schema changes), backward migration may require more effort. If you think you might switch back, test the migration path before upgrading Forgejo to major new versions.

CI/CD and Actions

Both platforms offer GitHub Actions-compatible CI/CD:

  • Gitea Actions launched in Gitea 1.19. It runs GitHub Actions workflows with minor syntax differences. Most Actions from the GitHub Marketplace work.
  • Forgejo Actions is the same system, forked and maintained independently. Forgejo also hosts its own Actions runner.

For most workflows, you will not notice a difference. Both support self-hosted runners, Docker-based jobs, and workflow triggers. If you rely on a specific GitHub Action, test it on your chosen platform — edge cases in compatibility exist on both.

Community and Ecosystem

Gitea has been around longer (since 2016) and has the larger ecosystem. Drone CI, Woodpecker CI, and various IDE integrations were built for Gitea first. Most of these work with Forgejo because the API is compatible, but some integrations explicitly check for Gitea and may need configuration adjustments.

Forgejo’s community is smaller but highly engaged. Codeberg itself — one of the largest public code forges outside GitHub — runs on Forgejo, which means the project dogfoods at scale. Development discussions happen transparently on Codeberg’s issue tracker.

Both projects have active development, regular releases, and responsive maintainers.

Use Cases

Choose Forgejo If…

  • You want community governance with no corporate lock-in risk
  • Federation interests you, even in its experimental state
  • You are starting a fresh self-hosted Git setup
  • You run a homelab and want the project most aligned with open-source values
  • You want to migrate from Gitea with zero friction

Choose Gitea If…

  • You already run Gitea and have no governance concerns
  • You depend on a specific Gitea integration that has not been tested with Forgejo
  • You prefer the larger install base for troubleshooting resources
  • You want the project backed by a company with commercial support options

Final Verdict

Forgejo is the better self-hosted Git platform for most people. It is functionally identical to Gitea for day-to-day use, costs nothing extra in resources or complexity, and gives you community governance as a bonus. The federation work is a forward-looking bet that no other self-hosted forge is making. If it lands, Forgejo will be the only self-hosted Git platform where you can interact across instances without centralization.

Gitea is not a bad choice. It is stable, well-maintained, and has a larger ecosystem. But the governance question is a real one for infrastructure you plan to run for years. Forgejo eliminates that concern entirely.

If you are choosing today, start with Forgejo. You can always migrate to Gitea later if you need to. The reverse is also true, but the trend favors Forgejo.

Comments