GitHub vs Forgejo

GitHub suits teams that want a managed platform with a large ecosystem and Actions marketplace. Forgejo suits teams that need self-hosted repositories under a GPL-licensed, community-governed forge, with the trade-offs in CI compatibility and operations.

On this page

GitHub vs Forgejo: when each fits a source hosting decision

GitHub fits best when managed operations and an existing Actions investment matter more than control over where code and CI run, and Forgejo fits best when a self-hosted, GPL-licensed forge with non-profit governance is the requirement. Most readers arriving here are facing a renewal, a data residency rule, a licensing change or a lock-in concern, and the answer depends on which of those is driving the decision. GitHub's strengths are a managed service, a large marketplace of Actions and integrations, and a developer base that already knows the interface. Teams with many workflows, reusable actions and third-party apps wired into GitHub will find that switching costs are real and should be counted before any migration is scheduled.

Forgejo fits when the organization wants the forge itself inside its own infrastructure, under a license that cannot be changed by a single vendor. Forgejo is licensed GPL-3.0-or-later from v9.0 onward, and Codeberg e.V., a non-profit association registered in Berlin, owns its domains while project governance stays independent. Forgejo Actions is designed to feel familiar to GitHub Actions users but is not compatible with it, so existing workflows need review, and runners must be operated by the team. Confirm the current LTS line on the Forgejo releases page before choosing a version, since LTS support windows drive how often the instance must be upgraded.

The decision turns on four things: CI, integrations, operating capacity and migration scope. Count the workflows, reusable actions, secrets and bots that depend on GitHub, and decide whether they are rewritten, kept on another CI system or retired. Assess who will patch, back up and upgrade the server, and whether that work is staffed or outsourced under a written scope. Finally, decide what must move: Git history can be cloned or mirrored, while issues, pull requests and reviews need the dump-repo and restore-repo commands, so test one representative repository end to end before committing to a date.

Which scenarios favor GitHub or Forgejo

This table maps common situations to the platform that usually fits better and the condition that tips the decision. Read each row as a starting point, then confirm the condition in your own environment before choosing. The main takeaway is that Forgejo fits best when self-hosting and independent governance are requirements, while GitHub fits best when the workflow library and hosted operations matter more than location.

ScenarioBetter fitCondition that makes it so
Data residency rules require self-hostingForgejoYour regulator or contract requires source code and metadata to stay in facilities you control, and you can staff the server, backups and upgrades.
Large existing Actions workflow libraryGitHubMany workflows depend on marketplace actions and GitHub-specific features, since Forgejo Actions is designed to be familiar but is not compatible with GitHub Actions.
Small platform team without spare operations capacityGitHubNobody can own patching, backups, upgrades and runner fleets, so a hosted service with vendor-run operations reduces the work you must staff.
Need for GitHub Enterprise Server-style self-managementForgejoYou want software you run on your own infrastructure with an open-source license, and you accept that support comes from a different model than an enterprise vendor contract.
Need for an independent community forgeForgejoYour organization values a GPL-3.0-or-later project with governance independent of any single commercial vendor, with Codeberg e.V. holding its domains.
Existing Gitea installation to keep runningForgejoYou can use the documented upgrade path from Gitea up to v1.22 in two steps, first to Forgejo v10.0.x and then to later versions.
Heavy reliance on GitHub Copilot or GitHub Marketplace integrationsGitHubYour developers depend on those integrations daily, and moving them would cost more in lost productivity than hosting savings.
Need for a regular LTS track with a fixed support windowForgejoYou plan around LTS releases published in the first quarter of each year, and you confirm the support dates for the release you adopt on the Forgejo releases page.

How Forgejo Actions differs from GitHub Actions

Teams whose workflows build, run tests and publish artifacts with a few steps usually have the smallest migration. Forgejo Actions is a built-in CI system that hands jobs to separate runners, and it is designed to feel familiar to people who already write GitHub Actions workflows. That familiarity covers the general structure of a workflow file, but Forgejo Actions is not compatible with GitHub Actions, so each file still needs a review against the Forgejo documentation before it runs.

  • Workflow location: Forgejo reads workflows from .forgejo/workflows and falls back to .github/workflows when the first folder is absent, so existing files may run without a move.
  • Runner setup: Jobs need at least one registered runner, which is a separate process you operate, so plan for its host, labels and updates.
  • Standard shell steps: Plain run steps that call compilers, test runners or deployment scripts usually carry over with little change.
  • Runner environment: Confirm the tools and images a job expects are present on your runner, since a hosted GitHub runner image includes many preinstalled tools.
  • Secrets: Repository secrets do not export from GitHub, so create them again in Forgejo before the first run.

Before cutover, run each simple workflow on a test repository and compare its output and logs with the GitHub run.

What Forgejo's GPL license and Codeberg e.V. governance mean for buyers

Forgejo's license, domain ownership, governance and federation status each affect a different part of a buying decision. Read them separately, because a legal team, a procurement team and an architecture review will weigh them differently.

GPL-3.0-or-later license from v9.0

Forgejo is licensed GPL-3.0-or-later from v9.0 onward, while earlier versions were under MIT. The copyleft terms matter if you modify Forgejo and distribute the modified build to customers, partners or subsidiaries, because those recipients may receive source code rights. If you only run it internally, the obligations are usually lighter. Ask counsel to confirm which case applies to your deployment before you patch or fork the code.

MIT history before v9.0

Installations on releases before v9.0 fall under MIT, which is a permissive license. If your organization already runs an older Forgejo or a Gitea-derived build, check which version your copy is and which license applies to it. Mixed fleets of versions can mean mixed license terms, so record the version of each instance in your asset inventory and in your upgrade plan.

Non-profit domain ownership by Codeberg e.V.

Codeberg e.V., a non-profit association registered in Berlin, owns Forgejo's domains, while project governance stays independent. For buyers, this separates the project's name and web presence from any single company's commercial decisions. Ask your procurement team to record who holds the domains and trademarks you depend on, and to confirm how the project would handle continuity if the stewardship changed.

Independent project governance

Forgejo's governance does not sit with one vendor that sells a paid edition, which is the central difference from GitLab's model. Independence can make the roadmap more community-driven, but it does not replace contracted support. Commercial support for Forgejo comes from firms that offer it, so ask any provider you evaluate to name the support scope, response expectations and the release branches they cover.

Experimental federation over ForgeFed

Forgejo's federation is experimental and under active development, based on the ForgeFed protocol built on ActivityPub. Do not design a production workflow that depends on federating repositories, issues or pull requests between instances. If cross-organization collaboration is a requirement, treat federation as a future option and confirm its status in the current release notes before planning around it.

Compared with GitLab and Gitea

GitLab is open core: its Community Edition is MIT licensed, but files in the ee/ directory are proprietary and need a paid subscription. Gitea is MIT licensed, with commercial support available from CommitGo. Forgejo's GPL terms are stricter for redistribution, while its non-profit stewardship is different from both. Compare the license of each code path you will run, not only the headline license, and confirm with counsel which features your plan includes.

How Forgejo LTS releases and upgrades affect operations

Forgejo has two support tracks, and the one you choose decides how often your team must upgrade a production forge. Stable releases receive full support for three months plus a two-week window, which means a team on stable releases must plan a version change roughly every quarter. LTS releases, published in the first quarter of each year, receive critical bugfixes and security support for one year and three months. For an organization that cannot schedule upgrades every few months, the LTS track is the operational default to evaluate first, with the caveat that the support window is shorter than the time between two stable upgrades only if you skip releases.

Check the current dates on the Forgejo releases page before you commit to a version. At the time of writing, the listed release v15 is the LTS release supported until July 15, 2027, and v17.0.0 was released on October 15, 2026 with support until January 28, 2027. Build the upgrade calendar from those dates, not from memory, and confirm them again when you schedule each change window. Also confirm whether any patch releases fall inside your window, since security fixes arrive on the supported version only.

If you are migrating from Gitea, the upgrade path is a separate planning item. Forgejo documents a transparent upgrade from Gitea installations up to Gitea v1.22, and the Forgejo upgrade guide describes two steps: first to Forgejo v10.0.x, then to any later Forgejo version. Plan the first step as its own change with a tested backup of the database and the app.ini configuration file, and rehearse both steps on a copy of production. Gitea installations newer than v1.22 need an assessment before you move, so confirm your exact version with your implementation partner or in your own environment before you set a date.

Where repository data lives and who runs the platform

Choosing between GitHub and Forgejo is partly a decision about where source code, metadata and audit trails sit and who operates the software that holds them. The cards below separate hosting location, regional options, operator responsibilities, access control, audit logs and the compliance evidence you must produce yourself.

GitHub cloud and data residency

Standard GitHub.com stores repositories in GitHub's multi-tenant cloud, and you cannot choose where that storage sits. GitHub Enterprise Cloud with data residency on GHE.com offers EU, Australia, US and Japan regions, but it is a separate tenancy with its own URL and admin model. Ask GitHub which metadata, backups, Actions logs and support access stay inside the chosen region before you assume the whole service is regional.

GitHub Enterprise Server on your infrastructure

GitHub Enterprise Server runs as a self-managed appliance on infrastructure you operate, so repository data stays in your data center or cloud account. You still depend on GitHub's release cadence, appliance upgrade path and licensing terms, and your team performs patching, backups and capacity planning. Confirm which GitHub Enterprise Server release line your organization is on and how long each one receives support.

Forgejo on servers you control

A Forgejo instance keeps repositories, issues, pull requests and the database on hosts you choose, whether that is a private cloud, a data center or an air-gapped network. Nobody outside your organization holds the data or the admin keys unless you grant access. The trade-off is that your team owns backups, restores, database maintenance and incident response, which are the costs a hosted service absorbs for you.

Identity, access and audit trails

On GitHub, access runs through organization roles, SAML single sign-on and audit log features that depend on your plan. Forgejo uses its own accounts and teams, and you connect external identity through the authentication sources your administrators configure. Map who approves access, how offboarding removes tokens and SSH keys, and where audit records are retained, then test that export works before you migrate.

Who operates and supports the platform

Forgejo is governed independently, with Codeberg e.V. holding its domains as a non-profit association, so no single vendor controls the upgrade path. Commercial support for Forgejo is a matter for the operator or a third party you contract, and you should confirm that contract's scope in writing. Compare that with GitHub's paid support tiers and its single operator for the service.

Compliance evidence you still produce

Whichever platform you choose, auditors will ask for evidence of access reviews, change control, backup tests and retention settings, and that evidence comes from your system and your records. DeployOpen can prepare those controls, configuration baselines and evidence collection for your environment, but it does not issue audit reports, attestations or certifications. Independent auditors and certification bodies make those determinations.

How a GitHub to Forgejo move is structured

The move runs as a sequence: inventory, export and restore, re-platform automation and credentials, then a parallel period before cutover, so that repositories, their collaboration history and the teams using them land on Forgejo without a gap in service. Each stage produces a checkable output before the next one starts.

  1. Inventory repositories, metadata and dependencies

    Start by listing every repository in scope, its owners, default branches, open issues and pull requests, releases, wikis, Actions workflows, secrets, webhooks, GitHub Apps and OAuth integrations, and any package registries it publishes to. Note which repositories are large, because hosted Git services cap repository size, and check your own storage plan before you export anything. Owners of build, deployment and chat integrations should be named now. The output is a signed-off inventory that tells you which repositories move, in what order, and which teams must test afterwards.

  2. Export history with clone or mirror

    Mirror each repository with a bare Git clone so that every branch and tag comes across unchanged. Git history moves between any two forges this way, but it carries no issues, pull requests or reviews. Plan for the API rate limits on the source side if you script bulk reads of metadata, since the source platform throttles high-volume requests and a long export can stall. The output is a set of mirror clones, each checked by comparing branch and tag lists against the source.

  3. Export and restore metadata with dump-repo and restore-repo

    Use Forgejo's dump-repo command to export issues, pull requests, releases, labels, milestones, comments and wikis from GitHub, then restore-repo to load them into Forgejo. Run a trial on one non-critical repository first and compare issue counts, pull request states, comment threads and attachments with the source. Confirm in the Forgejo command-line documentation which fields come across for your version, and record any gaps for manual handling. The output is a restored repository on a staging Forgejo instance that a named owner has reviewed.

  4. Re-platform Actions workflows and runners

    Forgejo Actions is designed to be familiar to GitHub Actions users, but it is not compatible with GitHub Actions. Review each workflow in .github/workflows, check which marketplace actions and runner labels it depends on, and decide per workflow whether to keep it, adapt it, or replace it. Forgejo can fall back to .github/workflows for some setups, but you should verify that behavior against the Forgejo Actions overview for your version. Register runners in your own infrastructure. The output is a list of workflows with a status for each, and a green run for every workflow kept on staging.

  5. Re-create secrets, tokens and access

    GitHub Actions secrets do not export, so every secret used by a workflow must be re-entered in Forgejo by its owner, from the system that issued it. Recreate teams, roles and branch protection rules, and issue new personal access tokens and deploy keys for service accounts. Record who holds each credential and where it is stored. The output is a secrets register and an access matrix that the security team has checked against the GitHub inventory, with old tokens scheduled for revocation.

  6. Redirect integrations and webhooks

    Update every system that calls GitHub: CI triggers, deployment tools, chat notifications, issue links, package publishing, and any code-scanning or dependency bots. Point each webhook and API client at Forgejo and test it with a harmless event. Keep a short list of integrations that cannot be redirected yet, so they can run against the source for a limited period. The output is an integration map with each connection tested and its owner named.

  7. Run a parallel period

    Keep the GitHub repositories readable and let a pilot group develop on Forgejo while the mirrored repositories are kept in sync. Track failed builds, missing notifications and access complaints, and fix them before the cutover date. Ask your Forgejo support provider or internal team to confirm the upgrade path for the version you run, because a parallel period is also when you learn whether backups and restore tests work. The output is a list of resolved parallel-run issues and a restore test that succeeded on the Forgejo backup.

  8. Cut over and retire the source

    Freeze pushes to GitHub for each repository, run a final mirror and metadata sync, switch developer remotes and integrations to Forgejo, and then set the GitHub repositories to archived. Confirm that the last commit hashes match on both sides and that the new instance is included in backups. The output is a cutover record for each repository, showing the final commit, the time of freeze and the owner who signed off.

What drives the cost of running Forgejo versus GitHub

The cost comparison turns on who pays for what. On the GitHub side, the bill is made up of per-user seats on a Team or Enterprise plan, Actions minutes and storage consumed by workflows and packages. On the Forgejo side, there is no license fee, so the cost sits in servers or virtual machines, block and object storage, backup targets, a monitoring stack, the Forgejo Actions runners that execute jobs, and the staff time to operate all of it. No figures are given here. The structure of each line item, and what to ask for when pricing it, is laid out on the cost-by-component page, and the reader should fill in their own seat count, job volume and storage growth before comparing totals.

Most of the one-time cost is front-loaded. The migration itself (running dump-repo and restore-repo for each repository, checking issues, pull requests and wikis after restore, and rewriting workflows from .github/workflows to run on Forgejo Actions runners) is a project with a start and an end. Re-creating Actions secrets, which do not export from GitHub, and building the runner pool are also one-time tasks. Recurring cost is the operations side: patching and upgrades on the Forgejo release schedule, backup restore tests, runner capacity as build volume grows, certificate and monitoring upkeep, and the on-call time that a hosted service would otherwise absorb. Ask whether the upgrade and support model for the chosen Forgejo release line, including its LTS or stable support windows, is priced into the quote.

When requesting a quote, ask the provider to separate one-time work from retainers and to state each recurring item in its own line: infrastructure sizing for the Forgejo server and runners, storage and backup retention assumptions, upgrade cadence, security patch response, and any monitoring or on-call coverage. Ask for the assumed number of repositories, the volume of CI jobs, and the expected data growth, since these are the inputs that move recurring cost most. Compare that total with GitHub seats, Actions consumption and storage for the same period, and confirm that the quote excludes or includes staff time in a way your finance team can read.

Questions buyers ask before switching from GitHub to Forgejo

Can Forgejo run our existing GitHub Actions pipelines unchanged?

No. Forgejo Actions is built in and designed to feel familiar to GitHub Actions users, but it is not compatible with GitHub Actions, so workflows need review and adjustment. Forgejo's documentation describes the Actions overview and how workflows are handed to separate runners, which is the first place to check. Your team should inventory every workflow, third-party action, runner label and secret reference, then test each one on a Forgejo runner before cutover. Pipelines that depend heavily on GitHub-specific actions or context variables usually take the most rework.

How long does a move from GitHub to Forgejo take, and what drives it?

The duration depends on scope, not on a fixed rule. The main drivers are the number of repositories, how much metadata (issues, pull requests, reviews, wikis, releases) must come across, how many CI workflows need rework, and how many secrets must be re-created by hand, since Actions secrets do not export. Forgejo's dump-repo and restore-repo commands carry issues, pull requests, releases, labels, milestones, comments and wikis per repository, so a bulk move is largely scripted, while pipeline and access work is manual. Ask for a written scope with a repository inventory before accepting any timeline.

What does the work require from our team?

Three skill areas are needed: administration of a Forgejo server (or servers) with backups, TLS, identity integration and upgrades; CI engineering to port workflows and set up runners; and an owner who decides how permissions, branch protection and code review rules map to the new system. Your team also needs to agree on a cutover plan, including how developers update remotes and how open pull requests are handled. Each of these tasks has a recurring part, such as runner maintenance and patching, which should be assigned to a named owner before go-live.

Can a small team run Forgejo alone without outside help?

A small team can run Forgejo itself, because it is a single application with a database and documented upgrade paths. Whether it can do so safely depends on whether someone owns backups, restore tests, security patching, runner capacity and upgrades on a fixed schedule. Those duties recur every month, and they are the part most often underestimated. If no one on the team can absorb them, the choice is between hiring for them, using a support contract from a vendor that offers one, or a retainer for ongoing support, upgrades and testing. Confirm each duty by name before deciding.

Which Forgejo release should we pick, and why does LTS matter?

For production, most teams should start from the long-term support (LTS) release rather than the newest stable one. Stable releases receive full support for three months plus a two-week window, while LTS releases, published in the first quarter of each year, receive critical bugfixes and security support for one year and three months. Forgejo v15 is the LTS release supported until July 15, 2027, and Forgejo v17.0.0, released on October 15, 2026, is supported until January 28, 2027. Plan your upgrade calendar around the support end date of whichever release you run, and confirm current dates on the Forgejo releases page before you commit.

Is Forgejo federation ready for production?

No. Forgejo describes federation as experimental and under active development, built on the ForgeFed protocol, which is based on ActivityPub. Do not design a production workflow that depends on federating repositories or identities between instances. If cross-instance collaboration matters to you, treat it as a roadmap item and confirm its status with the Forgejo project before planning around it.

When should we choose GitLab or Gitea instead of Forgejo?

Choose GitLab when you want one platform for repositories, merge requests, CI/CD, package registries and related features, and you can accept a larger footprint and its open-core licensing model, where files in the ee/ directory are proprietary and need a paid subscription. Choose Gitea when you want a lightweight MIT-licensed forge with a built-in GitHub migration and commercial support available from CommitGo. Choose Forgejo when you want GPL-3.0-or-later licensing from v9.0 onward, governance independent of any single company, and a documented upgrade path from Gitea up to v1.22. Compare the three on licensing, CI approach, and who will support you, then test your heaviest workflows on each.

How DeployOpen helps evaluate and migrate to Forgejo

DeployOpen is a Chainscore Labs company that plans, implements, integrates, hardens, backs up and documents self-hosted open-source platforms inside your own infrastructure. For a GitHub to Forgejo move, we start with a written scope that tests your repositories, workflows and access model against Forgejo before any cutover is planned.

How we scope

  • Inventory repositories, issues, pull requests, wikis, releases and Actions workflows that must move to Forgejo
  • Map which GitHub features your teams use and confirm which Forgejo equivalents or gaps apply
  • Agree deployment location, data residency needs and LTS version choice in writing before work starts

How we build

  • Deploy Forgejo in your cloud account, data center or air-gapped network with your identity provider integration
  • Run dump-repo and restore-repo trials on sample repositories and verify issues, pull requests and wikis
  • Rebuild Forgejo Actions workflows and runners, and test secrets re-creation and the .github/workflows fallback

How we hand over

  • Document the architecture, backup and restore procedures, upgrade steps and runner configuration for your staff
  • Deliver a migration runbook with cutover, rollback and redirect steps agreed with your engineering leads
  • Provide evidence of configuration and controls for your compliance team, noting that independent auditors issue any attestation

How we support

  • Offer ongoing support, upgrades and continuous security testing as a retainer after handover
  • Track Forgejo release and support windows so your team plans upgrades ahead of end-of-support dates
  • Confirm with your team which support model fits, and request a quote based on the written scope

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.