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
| Feature | Gitea | Forgejo |
|---|---|---|
| Governance | For-profit (Gitea Ltd.) | Non-profit (Codeberg e.V.) |
| License | MIT | MIT (with contributor covenant) |
| Federation (ActivityPub) | No | Experimental (ForgeFed protocol) |
| CI/CD | Gitea Actions (GitHub Actions compatible) | Forgejo Actions (same compatibility) |
| Package Registry | Yes (npm, PyPI, Maven, Docker, etc.) | Yes (same registries) |
| Issue Tracker | Yes | Yes |
| Built-in Wiki | Yes | Yes |
| Git LFS | Yes | Yes |
| Docker Support | Official image on Docker Hub | Official image on Codeberg registry |
| API Compatibility | Gitea API v1 | Gitea API v1 (compatible) |
| Third-Party Integrations | Larger ecosystem (Drone CI, Woodpecker, etc.) | Growing (most Gitea integrations work) |
| Accessibility | Standard | Improved (active accessibility work) |
| Update Frequency | Regular releases | Regular releases (tracks Gitea upstream + own patches) |
| Resource Usage | ~170 MB RAM idle | ~170 MB RAM idle (nearly identical) |
| Community Size | Larger (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.
| Metric | Gitea 1.25 | Forgejo 14.0 |
|---|---|---|
| Idle RAM | ~170 MB | ~170 MB |
| RAM under load (50 repos, CI active) | ~300-500 MB | ~300-500 MB |
| CPU (idle) | Negligible | Negligible |
| 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:
- Stop the Gitea container
- Replace the Gitea Docker image with Forgejo’s image
- Rename environment variable prefixes from
GITEA__toFORGEJO__(optional — Forgejo accepts both) - 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.
Related
Get self-hosting tips in your inbox
Get the Docker Compose configs, hardware picks, and setup shortcuts we don't put in articles. Weekly. No spam.
Comments