Do you want to replace GitLab, or check whether Forgejo or Gitea is enough? We plan, migrate and operate Forgejo as a Git platform and offer the combination with CI, registry and SSO as a package for Git and CI. View Forgejo operations · Book an intro call (free and non-binding)
GitLab, Forgejo and Gitea cover the same core: Git repositories, code review, issue tracking and CI/CD on your own infrastructure. They differ in licence, governance, feature scope, server requirements and the effort of a move. This comparison summarises the differences with sources. Where the documentation does not support a statement, the text says so. As of: 5 November 2026.
Table of contents
- In brief
- How do GitLab, Forgejo and Gitea differ at a glance?
- Which licence applies, and what costs money?
- Who is behind each project?
- Which versions apply in November 2026?
- How do CI/CD and registries differ?
- What do Forgejo and Gitea lack compared with GitLab?
- How much server does each platform need?
- How secure is operation?
- How do you migrate from GitLab to Forgejo or Gitea?
- When should you stay with GitLab?
- Status and methodology
- Our approach at WZ-IT
- Further guides
- Sources
In brief
The mapping is our assessment based on the differences documented below, not a vendor statement.
| Requirement | Natural choice (assessment) | Reason |
|---|---|---|
| Built-in security scans, epics, code owners, push rules, group SAML | GitLab | According to the GitLab documentation these features are available in tiers from Free to Ultimate, with DAST and Dependency Scanning in Ultimate only |
| Small instance, CI close to GitHub Actions, non-profit governance, copyleft licence acceptable | Forgejo | GPL v3+ from v9.0, governed by Codeberg e.V., documentation lists no minimum requirements |
| Small instance, MIT licence, optional commercial edition with support | Gitea | MIT, Enterprise edition with SLA support |
How do GitLab, Forgejo and Gitea differ at a glance?
| Attribute | GitLab | Forgejo | Gitea |
|---|---|---|---|
| Licence (as of November 2026) | MIT (CE) and own EE licence | GPL v3+ from v9.0 | MIT |
| Governance | GitLab Inc., publicly listed | Codeberg e.V. (non-profit) | According to the vendor page, leadership and commercial support by CommitGo; Gitea Ltd. was founded in 2022 |
| Paid edition | Premium, Ultimate | The project lists none | Gitea Enterprise |
| Current version | 19.x | 17.0.1 (LTS: 15.0.x) | 28.3.0 |
| CI/CD | GitLab CI (.gitlab-ci.yml) |
Forgejo Actions | Gitea Actions |
| Databases | PostgreSQL | SQLite, MySQL/MariaDB, PostgreSQL | PostgreSQL, MySQL, MariaDB, SQLite, MSSQL |
| Resource guideline | 8 vCPU / 16 GB | Not found in the admin docs | 2 cores / 1 GB for small teams |
Which licence applies, and what costs money?
| Product | Licence | Paid | Source |
|---|---|---|---|
| GitLab CE (gitlab-foss repository) | MIT Expat, documentation CC BY-SA 4.0 | No | LICENSE |
GitLab EE (ee/ directory) |
GitLab Enterprise Edition License, with MIT exceptions | Valid subscription needed for the production use the licence covers | ee/LICENSE |
| Forgejo up to v8.0 | MIT | No | Forgejo FAQ |
| Forgejo from v9.0 | GPL v3+ (copyleft) | No | Forgejo FAQ, release v9.0 |
| Gitea | MIT | Enterprise edition is commercial | LICENSE, pricing |
On the EE licence: the licence file allows copying and modifying for development and testing without a subscription. Production use requires agreeing to the GitLab Subscription Terms (or another usage agreement made with GitLab) and a valid subscription for the correct number of user seats. By the wording of the licence, copying, publishing, distributing, sublicensing and selling the software are prohibited, subject to the conditions stated there. Parts shipped with GitLab CE or served client-side to browsers as images, fonts and similar are under MIT Expat according to the licence. According to GitLab, the EE package can also be run with the Free features without a paid subscription. This is not legal advice.
On Forgejo: the v9.0 release post describes v9.0 as the first version under a copyleft licence and announces that more files will switch to GPL v3+ over time. The Swagger file stays MIT. We did not check how large the MIT share is today. The assumption "Forgejo is MIT like Gitea" holds only up to v8.0.
What does GitLab cost, and what does Gitea Enterprise add?
On its pricing page GitLab lists Premium at 29 US dollars per user and month with annual billing (as of November 2026) and Ultimate on request. According to the GitLab documentation, a self-managed subscription applies to the whole instance and all users get the same features. For Gitea Enterprise the vendor names on its product page: branch protection inheritance, dependency scanning, IP allowlist, mandatory 2FA, SAML 2.0 and audit log. The pricing page shows two amounts side by side, so we do not quote a price.
Which GitLab features sit in which tier?
The details come from the "Tier" header of each GitLab documentation page (as of November 2026). The tier headers of these pages name tiers (Free, Premium, Ultimate), not CE and EE; other parts of the documentation explicitly mark features as available in EE only. Whether every Free feature is part of the plain CE package is therefore not established.
| Feature | Tier according to documentation | Documentation |
|---|---|---|
| CI/CD pipelines | Free, Premium, Ultimate | Pipelines |
| Container Registry | Free and above | Container Registry |
| Package Registry | Free and above | Package Registry |
| Pages | Free and above | Pages |
| Issue Boards | Free and above (basic feature) | Issue Boards |
| Push mirror | Free and above | Push mirror |
| Pull mirror | Premium, Ultimate | Pull mirror |
| Code Owners | Premium, Ultimate | Code Owners |
| Push Rules | Premium, Ultimate | Push Rules |
| Epics | Premium, Ultimate | Epics |
| LDAP (self-managed) | Free and above | LDAP |
| Group SAML SSO (GitLab.com) | Premium, Ultimate | Group SAML |
| SAST | Free and above (basic scope) | SAST |
| Secret Detection | Free and above (basic scope) | Secret Detection |
| Container Scanning | Free and above (basic scope) | Container Scanning |
| DAST | Ultimate | DAST |
| Dependency Scanning | Ultimate | Dependency Scanning |
Who is behind each project?
Forgejo. The project states that it exists under the umbrella of the non-profit Codeberg e.V., that the domains are held by the association and that Forgejo has not registered any trademarks. Codeberg e.V. is an association registered in Berlin whose statutory goal, according to the FAQ, is to guarantee the openness and continued availability of free software. Security reports go to [email protected]. No paid edition is listed on the project pages we checked.
Gitea. On 30 October 2022 the maintainer Lunny wrote that Gitea Ltd. had been founded and that the domains and the "Gitea" trademark were transferred from him personally to the company. The logo remains community property and the owners group continues to vote. According to the vendor, Gitea offers the open-source edition under MIT, Gitea Cloud and Gitea Enterprise. The current vendor page names leadership and commercial support by CommitGo. How CommitGo and the Gitea Ltd. named in 2022 relate today is not stated in the sources we checked.
GitLab. GitLab Inc. is publicly listed (ticker GTLB, see the quarterly report).
The Forgejo page comparing itself to Gitea is the account of one of the two projects. It dates the split to October 2022 (soft fork) and early 2024 (hard fork) and claims that Gitea is controlled by a for-profit company, requires copyright assignment even for MIT-licensed code and gives advance information on security releases only to customers. These are statements by Forgejo about Gitea. On copyright assignment: the current Gitea contribution guideline states that submitting a pull request counts as agreement to the DCO and the MIT licence; it contains no explicit assignment of rights. What is confirmed on the Gitea pricing page is that enterprise customers receive "Priority security bug fix notifications". Whether these notifications are reserved exclusively for customers does not follow from that.
Which versions apply in November 2026?
| Product | Version | Date | Note | Source |
|---|---|---|---|---|
| Forgejo | 17.0 (current 17.0.1 of 26 Oct 2026) | 15 Oct 2026 | Supported until 28 Jan 2027 | Release schedule |
| Forgejo | 16.0 | 16 Jul 2026 | Support ended on 29 Oct 2026 | Release schedule |
| Forgejo | 15.0 LTS (current 15.0.11 of 26 Oct 2026) | 16 Apr 2026 | Supported until 15 Jul 2027 | Release schedule |
| Forgejo | 18.0 | planned 14 Jan 2027 | Quarterly releases | Release schedule |
| Gitea | 28.3.0 | 1 Nov 2026 | follows 28.2.0 (18 Oct 2026) | GitHub releases |
| Gitea | 28.0.0 | 29 Sep 2026 (GitHub release; blog post of 30 Sep 2026) | follows 1.27.3 (29 Aug 2026) | GitHub release, Gitea blog |
| GitLab | 19.x | 19.5.3 and 19.4.5 (patch releases, publication day not checked) | Docs list 19.0 to 19.6 | Release page, Patch 19.5.3 |
Since 28.0.0 Gitea no longer counts as 1.x. Sources that still call "Gitea 1.2x" the latest stable version are outdated. The enterprise support and release policy names rolling releases; we did not find a current LTS offering. Lunny's 2022 message mentions work on an LTS version at that time. According to the patch release page, GitLab publishes two regular patch releases per month (second and fourth Wednesday) plus critical patches as needed.
How do CI/CD and registries differ?
| Area | GitLab | Forgejo | Gitea |
|---|---|---|---|
| CI/CD | GitLab CI with .gitlab-ci.yml and runners (Free and above) |
Forgejo Actions, workflows in .forgejo/workflows/, Forgejo Runner |
Gitea Actions, "compatible with GitHub Actions", Gitea Runner 5.0.0 (8 Oct 2026) |
| GitHub Actions syntax | No, own syntax | Partly | Partly |
| Container and package registry | Container Registry and Package Registry (Free and above) | Packages including container, npm, Maven, PyPI, Cargo, Helm, Debian, RPM, NuGet | More than 20 package types including container |
| Issue tracking | Issues and boards (Free and above), epics (Premium) | Issues, labels, projects, wiki | Issues, labels, Kanban boards, milestones, time tracking, dependencies |
| Code review | Merge requests, approvals, code owners (Premium) | Pull requests, protected branches, AGit | Pull requests, branch protection (inheritance in Enterprise) |
On the limits of GitHub Actions compatibility, the Forgejo reference states that GitHub Actions and Forgejo Actions are not the same. Actions without a host resolve to data.forgejo.org by default. For pull_request events from forks, no secrets are available, the automatic token has read permissions only and OIDC is disabled. With pull_request_target, by contrast, the workflow runs with the privileges of the base repository, including secrets and a write token, and should not execute untrusted code from the pull request. The tool cache does not persist without a volume. The Gitea comparison page lists as unsupported, among others, jobs.<id>.environment (ignored), problem matchers and error annotations. GITEA_TOKEN cannot push to Gitea's own package registry. Test your own pipelines on Gitea or Forgejo before moving. If you come from GitHub Actions, the article GitHub Actions pricing change 2026 puts it in context.
What do Forgejo and Gitea lack compared with GitLab?
The statements rest on each project's documentation. "Not found" means we did not find the feature there, not that it is certainly absent.
| Area | Forgejo | Gitea |
|---|---|---|
| Security scans (SAST, secret detection, container scanning) | Not found in the docs | Open source: not listed in the comparison table, dependency scanning in Enterprise |
| Pages | Not found in the docs, Codeberg runs Codeberg Pages separately | Third-party software according to the Gitea docs |
| SAML | Not found in the admin docs | In Enterprise, "unsupported" in the open-source table |
| Other SSO | OAuth2/OIDC, LDAP, PAM, FreeIPA, OIDC group mapping | LDAP, OAuth2 |
| Federation | ForgeFed/ActivityPub under development, experimental | Not checked |
| Audit log | Not checked | Docs page "Audit Logging", in the core from 28.0.0 according to the release changelog |
The Gitea table itself notes that it may be outdated. For SAML in Gitea there were pull requests (#25165, #29358); we could not conclusively verify their history.
How much server does each platform need?
| Aspect | GitLab | Forgejo | Gitea |
|---|---|---|---|
| CPU and RAM | 8 vCPU and 16 GB baseline, 8 GB in memory-constrained environments | No minimums found in the admin docs | 2 cores and 1 GB "typically sufficient for small teams/projects" |
| Storage | App node 40 GB, Gitaly at least as large as all repositories, PostgreSQL usually at least 5 to 10 GB according to the detail text, at least 12 GB for Ultimate | Not found in the pages checked | Not found in the pages checked |
| Database | PostgreSQL 17 to 18 (for 19.x), Redis 7.0+ or Valkey 7.2 | SQLite ("apparently" good enough for at least 10 users according to the docs), MySQL/MariaDB, PostgreSQL | PostgreSQL 12+, MySQL 8.0+, MariaDB 10.4+, SQLite, MSSQL 2012 SP4+ |
| Installation | Linux package, Docker, Helm chart, GitLab Environment Toolkit | Binary, Docker (also rootless), third-party packages | Binary, package, source, Docker (also rootless), Podman Quadlet, Kubernetes |
Sources: GitLab requirements and installation methods, Forgejo installation and binary installation, Gitea documentation and database preparation. According to the installation page, GitLab recommends Docker and Helm for customers with 500 or more seats. The Gitea docs warn that SQLite scales poorly. Any figure for Forgejo would have come from field reports rather than vendor documentation, so it is not in the table. The guideline values have different reference sizes (single-node baseline for GitLab, small team for Gitea) and are not a capacity comparison under equal load. Our assessment: Forgejo and Gitea share a Go base, and we have no measured comparison of their resource needs. A guideline value is documented only for Gitea.
How secure is operation?
The numbers are not comparable and do not amount to a security ranking. Gitea publishes vulnerabilities as public GitHub advisories, while GitLab and Forgejo use other processes. A higher count therefore does not mean a product is less secure.
| Project | Finding (5 May to 5 November 2026) | Source |
|---|---|---|
| GitLab | Critical patch on 21 Oct 2026 (19.5.1, 19.4.3, 19.3.6, 19.2.9, 19.1.9, 19.0.10, 18.11.13): integer overflow in the regular expression compiler, CVE-2026-110264. The fix is a patch to Ruby, not to GitLab code. Anyone running their own Ruby runtime also needs Ruby 3.3.13, 3.4.12 or 4.0.9. Two further High-severity reports (OmniAuth/LDAP auto-linking, cache poisoning in OAuth/OIDC discovery) | Patch release |
| Gitea | The list of published advisories contains entries with severities from low to critical; we give no total because it could not be verified reproducibly. Examples: CVE-2026-104632 (code execution on runners when a maintainer cancels and re-runs a fork run, bypassing approval), CVE-2026-103059 (authentication bypass in the built-in SSH server, with SQLite, the built-in SSH server enabled and an RSA key), CVE-2026-73802 (container escape through container.options in act_runner despite privileged mode being disabled), CVE-2026-20896 (Docker image: REVERSE_PROXY_TRUSTED_PROXIES = * allows user impersonation when reverse proxy authentication is enabled and HTTP access bypassing the proxy is possible) |
GitHub advisories |
| Forgejo | Release 17.0.1 (26 Oct 2026) lists security fixes in its release notes, among others for pull_request_review actions with an unvalidated commit_id and for NuGet API keys that ignored token scopes. We give no details for release 17.0.0. We could not retrieve a central CVE list, and the release notes could not be retrieved again during independent verification |
Release notes 17.0.1 |
The entries belong to different classes of flaw (Ruby regexp, SSH authentication, reverse proxy authentication, NuGet token scopes, CI permissions). One class concerns CI runs from forks or reviews that obtain permissions or secrets: for Gitea CVE-2026-118386 (1 Nov 2026, severity High, affecting 1.19.0 to 28.2.0, fixed in 28.3.0) with a manipulated review commit_id, for Forgejo the pull_request_review entry above. Whether both were affected in the same way is not shown by the sources. Anyone running Forgejo or Gitea Actions with self-hosted runners should isolate runners, run fork pull requests without secrets and apply updates promptly. For GitLab, the Ruby dependency belongs in planning alongside the patch cadence.
How do you migrate from GitLab to Forgejo or Gitea?
Forgejo offers GitLab as a source under "New Migration". According to the Codeberg documentation, not only repository data but also metadata such as issues, labels, wiki, releases and milestones are imported. An access token for the source is required, and the "Git" option imports code only. The GitLab importer in the Gitea source code reads repository info, topics, milestones, labels, releases, issues, comments, merge requests and reviews (from MR approvals). The GitLab importer in the Forgejo source code likewise reads merge requests and reviews (from approvals, without review comments). For comment reactions, the Gitea code notes an open task. The Gitea migration page does not describe the GitLab scope. The importer is present in the Gitea repository, but we did not check its availability in the 28.x interface.
| Content | Transfer |
|---|---|
| Repository, topics, milestones, labels, releases | Present in the importer |
| Issues and comments, merge requests, reviews from approvals | Present in the importer |
CI configuration .gitlab-ci.yml |
The file arrives as repository content but is not translated into workflows (.forgejo/workflows/ must be rewritten), no converter is documented |
| CI variables, runners, pipeline history | Not present in the importer |
| Container and package registry contents | Not present in the importer |
| Group and permission structure, boards, epics, protected branch rules | Not present in the importer |
| Webhooks, deploy keys | Not present in the importer |
The table describes what the Gitea importer code covers. That something is missing from the importer is derived from absent functions, not from an explicit sentence in the documentation, and the Forgejo code was not cross-checked. One field report describes, as a single case, issues arriving without comments because the tool used did not import comments. After a test run, spot-check what arrived.
Our assessment of a staged approach:
- Inventory: record repositories, groups, access models, webhooks, registry contents and CI dependencies.
- Test run: import a few repositories with the importer and compare metadata by sampling.
- Rebuild pipelines: translate
.gitlab-ci.ymlinto workflows, recreate variables and secrets, set up runners. - Switch over: change access, webhooks and deploy keys, and keep a mirror or fallback for critical repositories.
- Retire the old system: only after checking backups and restore.
From Gitea to Forgejo, a direct upgrade is possible according to the upgrade guide only up to Gitea version 1.22. A direct upgrade from Gitea 28.x is not documented as supported, and a repository migration remains as the alternative.
When should you stay with GitLab?
GitLab is the natural choice if you need built-in security scans (basic scans for SAST, secret detection and container scanning in Free, DAST and dependency scanning in Ultimate), epics, code owners, push rules or group SAML, and a subscription is planned. If many pipelines, registry contents and permission structures would have to be migrated, staying can also be more economical, because the importer does not cover these parts. The server requirements are higher, but the features are documented in one place. This is an assessment, not a vendor statement.
Forgejo or Gitea are the natural choice if a lean platform with repositories, review, issue tracking, actions and package registries is enough. This depends on requirements and is an assessment, not a suitability guarantee. In our assessment, the decision between the two mostly depends on licence (GPL v3+ versus MIT), governance (association versus company with an enterprise edition) and whether SAML or commercial support is needed.
Status and methodology
As of: 5 November 2026. The basis is the licence files, documentation, release pages and security notices of the three projects, retrieved on 5 November 2026, each linked in the text. Statements about a project come from its own sources. Statements on "Forgejo vs. Gitea" pages are one party's account and are marked as such in the text. "Not found" means we did not find the feature in the documentation cited, not evidence that it is absent. We mark our own assessments as such. The security count covers 5 May to 5 November 2026 and is not a quality ranking. Open points: minimum resources for Forgejo, SAML and Pages in Forgejo, the publication days of the GitLab patch releases 19.5.3 and 19.4.5, and the Forgejo code for the GitLab import. Later changes to licences, versions or features are not included.
Our approach at WZ-IT
For Forgejo we plan, migrate and operate the platform including database, storage, Actions runners, identity integration, backups and service levels. When migrating from GitHub, GitLab or Gitea, we inventory repositories, organisations, access models, issues, pull requests, releases, packages, webhooks and CI dependencies and plan the test run and cutover from that. Which metadata can be transferred automatically depends on the source system and its API.
The package for Git, CI and registry combines Forgejo with Woodpecker CI, Harbor and Vaultwarden, plus an identity service (Keycloak or Authentik) and an isolated runner. Dynamic secrets for pipelines and build counts per hour are not part of the package. For existing GitLab instances, our offer is described under GitLab managed hosting and operations, and for Gitea there is a page in the app catalogue. Monitoring runs 24/7, and the response to P1 incidents follows the service level. More on ongoing operations: Managed operations and CVE monitoring.
Weighing GitLab, Forgejo and Gitea for your team? We discuss requirements, pipelines and the scope of a migration with you. View Forgejo operations · View the Git and CI package · Book an intro call (free and non-binding)
Further guides
- GitHub Actions pricing change 2026: self-hosted runner fees and open-source alternatives
- Keycloak Alternatives: Authentik, ZITADEL and More
- Why companies need CVE monitoring
- Forgejo managed hosting
- GitLab managed hosting
- Package Git, CI and registry
Sources
- GitLab CE LICENSE (gitlab-foss)
- GitLab EE LICENSE
- GitLab pricing
- GitLab Docs: system requirements
- GitLab Docs: choosing a subscription
- GitLab Docs: release 19
- GitLab Patch release 19.5.1 (CVE-2026-110264)
- GitLab: installation
- GitLab: Community and Enterprise Edition
- Forgejo FAQ
- Forgejo: Release v9.0
- Forgejo: comparison with Gitea (one party's account)
- Forgejo: release schedule
- Forgejo: Actions reference
- Forgejo: upgrade guide
- Forgejo: release notes 17.0.1
- Gitea: GitLab importer (source code)
- Codeberg Docs: migrating repositories
- Codeberg Docs: Codeberg Pages
- Gitea LICENSE
- Gitea: pricing
- Gitea Enterprise
- Gitea: support and release policy
- Gitea: contribution guideline (CONTRIBUTING)
- Gitea-Blog: message from Lunny on Gitea Ltd.
- Gitea Docs: Actions comparison
- Gitea Docs: installation comparison
- Gitea Docs: database
- Gitea Docs: migration
- Gitea security advisories
- Gitea releases
- GitLab Inc. quarterly report (SEC)













