Gitea
gitea.ioLightweight self-hosted git platform, written in Go.
- Homepage: gitea.io
- GitHub: github.com/go-gitea/gitea
- Web info: web-check.xyz/check/gitea.io
Gitea Source Code
Author
Description
Git with a cup of tea! Painless self-hosted all-in-one software development service, including Git hosting, code review, team collaboration, package registry and CI/CD
Homepage
https://gitea.comLicense
MIT
Created
01 Nov 16
Last Updated
29 Jul 26
Latest version
Primary Language
Go
Size
346,634 KB
Stars
57,093
Forks
6,952
Watchers
57,093
Language Usage
Star History
Top Contributors
-
@unknwon (2635)
-
@lunny (2135)
-
@GiteaBot (1945)
-
@silverwind (1598)
-
@wxiaoguang (1451)
-
@zeripath (1187)
-
@6543 (570)
-
@techknowlogick (437)
-
@KN4CK3R (340)
-
@ethantkoenig (271)
-
@lafriks (258)
-
@yp05327 (251)
-
@jolheiser (242)
-
@yardenshoham (231)
-
@fuxiaohei (191)
-
@sapk (180)
-
@wolfogre (171)
-
@Zettat123 (154)
-
@a1012112796 (152)
-
@andreynering (143)
-
@tboerger (139)
-
@appleboy (128)
-
@strk (124)
-
@bircni (124)
-
@CirnoT (109)
-
@slene (107)
-
@guillep2k (105)
-
@mrsdizzie (86)
-
@delvh (80)
-
@bkcsoft (79)
-
@JakobDev (76)
-
@adelowo (74)
-
@HesterG (71)
-
@kerwin612 (67)
-
@codeskyblue (65)
-
@noerw (62)
-
@jpraet (61)
-
@Bwko (60)
-
@brechtvl (58)
-
@TheFox0x7 (53)
-
@denyskon (51)
-
@nanguanlin6 (51)
-
@davidsvantesson (50)
-
@typeless (50)
-
@psmit (50)
-
@kolaente (48)
-
@cez81 (47)
-
@earl-warren (47)
-
@sillyguodong (44)
-
@kdumontnu (44)
-
@qwerty287 (44)
-
@metalmatze (44)
-
@jonasfranz (43)
-
@Morlinest (38)
-
@ChristopherHX (36)
-
@nanoant (35)
-
@harryzcy (35)
-
@CaiCandong (34)
-
@Copilot (33)
-
@daviian (33)
-
@tyroneyeh (32)
-
@kemzeb (32)
-
@puni9869 (30)
-
@richmahn (30)
-
@dependabot[bot] (28)
-
@nussjustin-hmmh (27)
-
@fanningert (27)
-
@thehowl (27)
-
@sebastian-sauer (26)
-
@0rax (26)
-
@bagasme (24)
-
@fnkr (24)
-
@SagePtr (23)
-
@singuliere (23)
-
@Cherrg (21)
-
@hiifong (21)
-
@n0toose (19)
-
@saitho (19)
-
@42wim (18)
-
@nussjustin (18)
-
@compressed (17)
-
@gary-kim (17)
-
@eeyrjmr (16)
-
@SudhanshuMatrix (16)
-
@charles7668 (16)
-
@crystaldust (16)
-
@bytedream (16)
-
@BLumia (15)
-
@metiftikci (15)
-
@bohde (15)
-
@0xBAADF00D (15)
-
@sebastianertz (14)
-
@makhov (13)
-
@CL-Jeremy (13)
-
@odinuge (13)
-
@pgaskin (13)
-
@geek1011 (13)
-
@thibaultmeyer (13)
-
@axifive (13)
-
@justusbunsi (13)
Recent Commits
-
GiteaBot (29 Jul 26)
[skip ci] Updated translations via Crowdin
-
wxiaoguang (28 Jul 26)
chore: still keep ctx in git.Repository struct for cat-file batch command (#38684) Unfortunately, we can't completely remove the ctx from git.Repository, because the CatFileBatch still heavily depends on a parent context. If we remove the Repository ctx, the CatFileBatch will become a mess and create a lot of unnecessary git processes. http://localhost:3000/-/admin/monitor/perftrace * Before: open a repo home, dozens of git processes (duplicate cat-file) * After: only a few (no duplicate cat-file)
-
Pascal Zimmermann (28 Jul 26)
feat: Add support for dynamic matrix evaluation in Gitea Actions workflows (#36564) Adds dynamic matrix evaluation to Gitea Actions: a job's `strategy.matrix` can be built from the outputs of the jobs it needs. ```yaml jobs: generate: runs-on: ubuntu-latest outputs: matrix: ${{ steps.set.outputs.result }} steps: - id: set run: echo "result=[1,2,3]" >> $GITHUB_OUTPUT build: needs: [generate] runs-on: ubuntu-latest strategy: matrix: version: ${{ fromJson(needs.generate.outputs.matrix) }} steps: - run: echo "building ${{ matrix.version }}" ``` Such a matrix cannot be expanded at planning time, so the job is planned as a single placeholder and expanded by the job emitter once its needs finish. Each combination is then gated by `if:` and concurrency as usual. - A matrix that resolves to no combination fails the job, as on GitHub. - Expansion is capped at `MaxJobNumPerRun`. - Workflows without a needs-dependent matrix are unaffected. Fixes https://github.com/go-gitea/gitea/issues/25179 --------- Signed-off-by: Pascal Zimmermann <[email protected]> Signed-off-by: ZPascal <[email protected]> Co-authored-by: Claude <[email protected]> Co-authored-by: silverwind <[email protected]> Co-authored-by: Claude (Opus 4.8) <[email protected]> Co-authored-by: bircni <[email protected]> Co-authored-by: Zettat123 <[email protected]>
-
water (28 Jul 26)
fix: Alpine registry APKINDEX.tar.gz returns 405 for HEAD requests [fj4WqyCCw3C5ShR1RfB7MoBPTpkRrBFYP1uT35g3MvT] (#38686) ### Description Fixes #38676 The Alpine package registry registers for only, so a request returns . Clients that probe the index with before fetching it (like and other -based tools) fail outright. **Fix:** Change to for the APKINDEX.tar.gz route, matching the pattern already used by the i386 registry a few lines below. ### Related issue Closes #38676 Co-authored-by: waterWang <[email protected]>
-
wxiaoguang (28 Jul 26)
fix: repo home page 500 due to the timeout of "get last commit info" (#38678) Regression of the ctx removal from "git.Repository" struct (the old code was already wrong and can still cause 500, the "ctx removal" just makes the problem easier to reproduce). Merge duplicate code. Reviewd by codex: no actionable findings.
-
GiteaBot (28 Jul 26)
[skip ci] Updated translations via Crowdin
-
bircni (27 Jul 26)
docs: Update Changelog for release v1.27.1 (#38670) Add changelog for version 1.27.1 with security, API, enhancements, bug fixes, build updates, and miscellaneous changes. --------- Signed-off-by: bircni <[email protected]> Co-authored-by: silverwind <[email protected]>
-
Shudhanshu Singh (27 Jul 26)
refactor(git): clarify GetBranch behavior to make it only gets an existing branch (#38662) `GetBranch` silently returned soft-deleted branches, contradicting `IsBranchExist` and forcing callers to manually check `branch.IsDeleted` everywhere. Refactored it to `GetBranchExisting` to have a clear behavior: it only returns the existing branch. --------- Signed-off-by: Sudhanshu Singh <[email protected]> Co-authored-by: wxiaoguang <[email protected]>
-
Giteabot (27 Jul 26)
chore(deps): update dependencies (#38660) Signed-off-by: silverwind <[email protected]> Co-authored-by: silverwind <[email protected]>
-
Pascal Zimmermann (27 Jul 26)
feat: Add max-parallel Support for Gitea Actions (#36357) Add support for `strategy.max-parallel` on Gitea Actions matrix jobs. **How it works** Jobs over the limit are inserted as `Blocked` instead of `Waiting`, so runners never see them. When a job finishes, the job-status resolver promotes one `Blocked` job per freed slot, in job order. Slots are counted per `JobID` and scoped by reusable-workflow caller. A `Cancelling` job still owns its runner, so it keeps its slot. The cap is applied wherever a job can become `Waiting`: initial insert, rerun, approval, and resolver promotion. Best effort, not a hard invariant: two concurrent emitter passes can each promote into the last slot, overshooting by one. It does not compound, since every later pass recounts. **Parsing** Any YAML number, cast to an int as GitHub does (`1.5` → 1). `0` or negative means unlimited. Expressions (`${{ ... }}`) are not evaluated yet and fall back to unlimited. **Migration** Adds the `max_parallel` column on `action_run_job`. No index or constraint changes. **Compatibility** Existing rows default to `0`, so behaviour is unchanged. No runner changes needed: the runner protocol is untouched, and since the server splits the matrix each runner still receives a single job. Closes https://github.com/go-gitea/gitea/issues/35561 Signed-off-by: Pascal Zimmermann <[email protected]> Signed-off-by: ZPascal <[email protected]> Signed-off-by: wxiaoguang <[email protected]> Co-authored-by: silverwind <[email protected]> Co-authored-by: wxiaoguang <[email protected]> Co-authored-by: Zettat123 <[email protected]>
-
Harsh Satyajit Thakur (27 Jul 26)
fix: skip OIDC end-session after password login for OAuth2 users (#38439) Fixes #38209 OAuth2-linked accounts that sign in via the password form were still redirected to the provider end_session_endpoint on logout because the redirect was keyed off account LoginType. Store the session sign-in method (password vs oauth2) and only use RP-initiated OIDC logout when this session was authenticated via OAuth2. Sessions without the new key keep the previous LoginType behavior. --------- Co-authored-by: wxiaoguang <[email protected]>
-
Lunny Xiao (27 Jul 26)
ci: set AWS_REGION for Cloudflare R2 upload steps (#38658) The `configure-aws-credentials` step earlier in the same job exports **both** `AWS_DEFAULT_REGION` and `AWS_REGION` into `$GITHUB_ENV` (verified in `exportRegion()` at the pinned SHA `517a711`), so `secrets.AWS_REGION` (the real AWS region) stays set for every later step in that job. The AWS CLI v2 region resolution order is `--region` > `AWS_REGION` > `AWS_DEFAULT_REGION`. The R2 step only set `AWS_DEFAULT_REGION: auto`, so the leaked `AWS_REGION` won and R2 rejected it, since R2 only accepts `wnam`, `enam`, `weur`, `eeur`, `apac`, `oc` or `auto`. The failure log shows both `AWS_DEFAULT_REGION: auto` and `AWS_REGION: ***` in the step env, which confirms the leak. ### Fix Set `AWS_REGION: auto` explicitly in the R2 upload step env of all three release workflows. Step-level `env:` is applied after `GITHUB_ENV`-derived variables, so this reliably overrides the leaked value. No other variable leaks from `configure-aws-credentials` matter here: `AWS_SESSION_TOKEN` is only exported when a session token exists, and these workflows use static access keys without `role-to-assume`; `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` are already overridden in the R2 step. Consolidating the three duplicated upload steps into a composite action remains a follow-up, as noted in #38635.
-
wxiaoguang (27 Jul 26)
fix: make Actions log parser support multiple line message encoding (#38659) fix #38652 UI part (`.log-msg`) uses "white-space: break-spaces;" so the new line can be correctly rendered. --------- Signed-off-by: silverwind <[email protected]> Co-authored-by: silverwind <[email protected]>
-
silverwind (27 Jul 26)
test(pubsub): stop racing the Redis SUBSCRIBE ack (#38661) `RedisBroker.Subscribe` returns before the server acks `SUBSCRIBE`, so a publish right after it can be dropped, making `TestRedisBroker/CrossBroker` fail intermittently on loaded CI runners ([example](https://github.com/go-gitea/gitea/actions/runs/30257188479/job/89948425118)). Each scenario now uses its own topic and waits for `PUBSUB NUMSUB` before publishing. `MemoryBroker` registers synchronously and skips the wait.
-
silverwind (27 Jul 26)
chore(ci): fix renovate custom manager regex (#38656) Make this regex compatible with https://github.com/uhop/node-re2 used by renovate and which does not support lookahead. `renovate-config-validator` which I had used earlier fails to run `re2` on node 26 because of missing prebuilt binary and falls back to JS regex which does support lookahead, giving incorrect validation results. Upstream bug report: https://github.com/renovatebot/renovate/discussions/44873 Fixes: https://github.com/go-gitea/gitea/issues/38648
-
mohammad rahimi (27 Jul 26)
feat: Replace SSE with WebSocket for UI notifications (#36965) * Closes #36942 * Fixes #19265 Replaces the SSE-based push channel (`/user/events`) with a WebSocket endpoint (`/-/ws`). ### What changes - **New `/-/ws` endpoint** (authenticated). One WebSocket per origin, shared across tabs via a single `SharedWorker`. - **Pubsub broker** (`services/pubsub`) for fan-out by topic, behind a `Broker` interface. `MemoryBroker` is the default (single process); a Redis backend is available for multi-process setups, configured via `[websocket].PUBSUB_TYPE` / `PUBSUB_CONN_STR`. The internal Gitea queue was not usable here because it has FIFO/single-consumer semantics. - **Push-only event production.** Events are emitted by write-triggered notifiers — `NotificationCountChange`, `PublishStopwatchesForUser`, and the logout publisher — wired into the existing `notify.Notifier` interface. No server-side pollers. - **Typed pub/sub on the client.** `web_src/js/modules/worker.ts` is a singleton transport; features subscribe per event type via `onUserEvent('notification-count', cb)` instead of branching on `event.data.type`. - **Wire contract** (`UserEventType` union) is shared between the worker and consumers via `web_src/js/types.ts`, kept in sync with `services/websocket/events.go`. - **Client-side periodic polling fallback** kicks in only when the WebSocket cannot be established (e.g. proxy blocks WS, browser lacks module-SharedWorker support). ### What's removed - `modules/eventsource` (SSE manager, run loop, messenger). - `/user/events` route and `tests/integration/eventsource_test.go`. - All server-side polling for stopwatches and notification counts. ### Stopwatch multi-tab fix The navbar stopwatch icon was previously rendered conditionally on `{{if $activeStopwatch}}`, so tabs loaded before the timer started had no DOM element to update. The icon and popup are now always rendered (toggled with `tw-hidden`), and the start/stop/cancel handlers POST silently so all open tabs reflect the change in real time. ### Deployment note WebSocket needs the upgrade headers to pass through a reverse proxy, e.g. for nginx: ```nginx proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; ``` Without them the WebSocket cannot be established, and after 3 consecutive failed opens the shared worker signals `push-unavailable`: the notification count and stopwatch fall back to periodic polling on the existing `[ui.notification]` timeouts. Real-time push is lost, the features keep working. The reverse-proxy docs need the same note (see the `docs-update-needed` label). --------- Co-authored-by: silverwind <[email protected]> Co-authored-by: wxiaoguang <[email protected]> Co-authored-by: Epid <[email protected]>
-
Shudhanshu Singh (27 Jul 26)
fix(actions): use base branch ref for pull_request_target context (#38636) Fixes a bug in Actions context generation for `pull_request_target` workflows where `github.ref` / `gitea.ref` was incorrectly populated with `refs/heads/owner:branch` instead of `refs/heads/branch`. ### Problem Statement In `services/actions/context.go`, when constructing the `ref` string for `pull_request_target` events: ```go ref = git.BranchPrefix + pullPayload.PullRequest.Base.Name Signed-off-by: Sudhanshu Singh <[email protected]> Signed-off-by: wxiaoguang <[email protected]> Co-authored-by: wxiaoguang <[email protected]>
-
Zettat123 (27 Jul 26)
fix(actions): skip already-approved runs in `ApproveRuns` (#38653) The handler of `/actions/runs/{run}/approve` doesn't check if the run is already approved. If a run is re-approved, its jobs' status will be reset to `StatusWaiting`, causing incorrect job status.
-
roman.s (27 Jul 26)
fix(api): accept fully-qualified refs in contents API (#38650) `GET/POST` repository contents endpoints resolve the `ref` query parameter through `ResolveRefCommit`, which previously only accepted short branch/tag names or commit IDs. Clients that pass fully-qualified Git refs (GitHub-compatible), e.g. `ref=refs%2Fheads%2Fmain` or `ref=refs%2Ftags%2Fv1.0`, received 404 "object does not exist". This change accepts fully-qualified **`refs/heads/*`** and **`refs/tags/*`** only, then falls back to the existing short-name and SHA logic. Other `refs/*` prefixes (e.g. `refs/pull/`, `refs/for/`) are rejected. Fixes #38197 --------- Co-authored-by: roman s <[email protected]> Co-authored-by: wxiaoguang <[email protected]>
-
GiteaBot (27 Jul 26)
[skip ci] Updated translations via Crowdin
-
Lunny Xiao (27 Jul 26)
chore(build): upload release to Cloudflare R2 (#38635) The download site’s bandwidth costs are growing rapidly, while Cloudflare R2 does not charge egress fees. Therefore, we would like to migrate the download site from S3 to R2. To ensure a smooth transition, we will keep the existing S3 upload process temporarily and remove it after the migration is complete. The upload steps are currently duplicated in three places. They could be consolidated into a composite action in a separate PR.
-
silverwind (26 Jul 26)
ci: match `# renovate:` markers that trail the value (#38640) The preset we extended only matches a `# renovate:` comment on the line above the `_VERSION` assignment. Ours trails the value, like the ones in the `Makefile`, so it never matched and the pin has sat at `43.141.5` since https://github.com/go-gitea/gitea/pull/37050. Co-authored-by: Claude (Opus 5) <[email protected]>
-
wxiaoguang (26 Jul 26)
feat: admin impersonates a user (#38614) * fix #3631 * fix #21599 by the way, refactored the "profile avatar card" to simplify the code.
-
wxiaoguang (26 Jul 26)
refactor: git patch apply (#38637) Merge duplicate code and add a unit test There are already integration test cases in `TestEditor` -> `WebGitCommitEmail` for these two endpoints.
-
wxiaoguang (26 Jul 26)
fix: orgmode render include path (#38642) Co-authored-by: TheFox0x7 <[email protected]>
-
bircni (26 Jul 26)
fix(actions): cancel tasks immediately when the runner stopped reporting (#38616) Fixes jobs that get stuck in `cancelling` after Gitea is restarted while a job is running. Reproduction: 1. Run a job with `sleep 100` 2. Stop Gitea and wait 120s (> 100s) 3. Start Gitea — the job is still `running`; cancel it, and it stays in `cancelling` ## Cause A cancellation is only ever delivered to a runner as the *response* to its `UpdateTask` RPC. A runner that has already given up on the task — it crashed, or it failed to report the final state while Gitea was unreachable — never calls `UpdateTask` again, so it never learns about the cancellation. The task then sits in `cancelling` until `stop_zombie_tasks` reaps it, which needs `ZOMBIE_TASK_TIMEOUT` (10m) of silence and only runs every 5 minutes. Cancelling actually made this worse. xorm rewrites the `updated` column on every `UPDATE`, even when `Cols()` restricts the update to `status`, so persisting the `cancelling` status reset the zombie clock. Pressing cancel pushed the cleanup a full `ZOMBIE_TASK_TIMEOUT` into the future instead of bringing it forward. ## Change `StopTask` now skips the `cancelling` handshake when the task has had no state report from its runner for longer than `TaskReportTimeout` (1 minute) and cancels it directly. This joins the two existing fallbacks — runner deleted, and runner without cancelling support — so every cancel path (web UI, API, concurrency, rerun) is covered. Runners report the state of a running task every few seconds, so a minute of silence means the runner is gone. The value is a constant rather than a setting because it only decides whether the runner is still reachable, not whether a task should be killed — `ZOMBIE_TASK_TIMEOUT` still owns that. ### Tradeoff If a runner is alive but has been silent for over a minute and is cancelled in that window, it skips the graceful post-step cleanup added in #37275. No work is lost: the runner still learns the outcome on its next report, because `UpdateTask` returns the task status as the result and the runner stops there. That is the behaviour that existed before #37275. --------- Co-authored-by: Zettat123 <[email protected]> Co-authored-by: silverwind <[email protected]>
-
Elisei Roca (26 Jul 26)
fix(issues): fix label bulk-load key and reduce log noise in LoadLabel (#38632) CommentList.loadLabels keyed the result map by label.ID but looked up by comment.ID, so every label event fell back to individual DB queries. This caused log spam for any comment where the label was deleted, since ToTimelineComment calls LoadLabel unconditionally for all comment types including those with LabelID=0. Fix the map key, skip the query when LabelID=0, demote the now rarely triggered orphaned-label log to Debug, and fix a typo ("Commit" -> "Comment") in that message. --------- Signed-off-by: wxiaoguang <[email protected]> Co-authored-by: wxiaoguang <[email protected]>
-
silverwind (26 Jul 26)
fix(ui): avoid layout shifts in `overflow-menu` and repo filter (#37818) Eliminate two layout shifts in the menu, one related to non-existant label on page load and one to `0` value rendering. Signed-off-by: silverwind <[email protected]> Co-authored-by: Claude (Opus 4.7) <[email protected]> Co-authored-by: bircni <[email protected]>
-
silverwind (26 Jul 26)
chore: generate codemirror languages from `linguist-languages` package (#38624) Replace the previous main-branch fetch with data from npm package [`linguist-languages`](https://github.com/ikatyang-collab/linguist-languages) and only run generate targets when actually needed. The removed `fileFilters` were leftovers from the nolyfill removal.
-
GiteaBot (26 Jul 26)
[skip ci] Updated translations via Crowdin
Gitea Security
Security Advisories (74)
- medium Patched
CVE-2026-58438 Cross-repository IDOR in issue-dependency removal lets an attacker tamper with and comment on private repos they cannot access
- high Patched
CVE-2026-58433 Team-repository linking endpoint bypasses the RepoAdminChangeTeamAccess organization setting
- medium Patched CVSS 6.8
CVE-2026-58440 Webhooks created by a collaborator keep firing after their repo access is revoked → ongoing real-time exfiltration of private repo content (incomplete revocation cleanup in `DeleteCollaboration`)
- medium Patched CVSS 4.3
CVE-2026-59766 CVE-2026-20800 sibling endpoints not covered: revoked user still reads private repo objects via `/api/v1/user/starred` and private issue titles via `/api/v1/user/times`
- medium Patched CVSS 6.3
CVE-2026-58441 SSRF in restore-repo via unsanitized pull_request.yml Head.CloneURL
- medium Patched CVSS 6.5
CVE-2026-58442 Repository migration SSRF via multi-answer DNS allow-list bypass
- critical Patched CVSS 9.6
CVE-2026-58443 Public-only repository tokens can update private PR head branches
- medium Patched CVSS 4.3
CVE-2026-58444 Personal access token scope enforcement bypass on the repository home page (`GET /{owner}/{repo}`) discloses private repository contents
- medium Patched
CVE-2026-58427 Private org member list leaked via /members API endpoint — incomplete fix for PR #38145
- low Patched CVSS 2.7
CVE-2026-58445 Cross-repository label-ID enumeration oracle via unscoped DeleteIssueLabel API
- medium Patched CVSS 6.5
CVE-2026-42931 Denial of Service via Unbounded io.ReadAll in NPM Package Tag Endpoint
- medium Patched CVSS 6.3
CVE-2026-58416 Fork-PR Actions task can read a third private repository via the collaborative-owner branch (missing fork-PR guard)
- medium Patched CVSS 4.3
CVE-2026-50105 RSS/Atom feed handlers bypass API-token scope & public-only confinement (incomplete fix of #37698)
- low Patched
CVE-2026-58417 REST API exposes organization membership of private organizations to public
- high Patched CVSS 7.5
CVE-2026-54481 Internal API HTTP client hardcodes InsecureSkipVerify:true with no config override (CWE-295)
- medium Patched CVSS 4.3
CVE-2026-27761 API access token scope enforcement bypass on repository RSS/Atom feed endpoints leaks private repository commit data
- medium Patched CVSS 6.5
CVE-2026-58418 SSRF via HTTP Redirect in Repository Migration
- low Patched
CVE-2026-58434 Private Repository Metadata Remains Accessible After Access Revocation
- high Patched
CVE-2026-24451 Fork Synchronization Continues After Parent Repository Changes from Public to Private
- medium Patched
CVE-2026-55982 OIDC userinfo Endpoint Returns Identity Claims Without Enforcing API Token Scopes
- medium Patched
CVE-2026-25038 Unauthorized Access to Labels of Private Organizations
- low Patched
CVE-2026-58419 Notification API leaks private issue metadata after access revocation
- high Patched CVSS 7.1
CVE-2026-20779 TOTP TOCTOU race on web 2FA paths + missing replay check on Basic-Auth `X-Gitea-OTP` surface
- low Patched CVSS 2.7
CVE-2026-55984 Null Pointer Dereference in AddTime API Causes Authenticated Denial of Service
- medium Patched CVSS 5.4
CVE-2026-55986 Email Management API Bypasses ManageCredentials Feature Restrictions
- high Patched
GHSA-rjvx-x5h2-6px5 API Fork Endpoint Authorization Bypass Allows Organization Members to Bypass Repository Creation Restrictions
- medium Patched
CVE-2026-58420 Local File Inclusion via file:// URI in Migration Restore
- high Patched
CVE-2026-27775 Cached Per-Branch Permission Check in Pre-Receive Hook Allows Full Repository Write
- high Patched
CVE-2026-58435 Gitea LFS Deploy-Key Privilege Escalation
- high Patched CVSS 8.1
CVE-2026-55987 OAuth2 sign-in reactivates an administrator-deactivated account on auth sources without refresh tokens (incomplete fix of #38009)
- medium Patched CVSS 4.3
CVE-2026-56443 Token public-only scope bypassed on Limited-visibility owners (Repository + Package categories) — residual after CVE-2026-25714 / PR #37118
- high Patched CVSS 7.1
CVE-2026-28740 Git LFS object reuse allows non-Code access to authorize private source objects
- medium Patched
CVE-2026-56654 Privilege Escalation via Access Token Scope Escalation in API
- medium Patched CVSS 4.3
CVE-2026-58431 Public-only API token restriction is not enforced on team API routes
- medium Patched
CVE-2026-56657 Gitea SSH Key Parser Denial of Service
- medium Patched
CVE-2026-58421 Unauthenticated ReDoS via CODEOWNERS pattern matching allows denial of service
- low Patched
CVE-2026-56750 Gitea Remember-Me Token Theft Not Invalidating Attacker Session
- medium Patched
CVE-2026-56755 Denial of Service (CPU & Memory Exhaustion) via O(N^2) String Concatenation in Debian Package Upload
- medium Patched CVSS 5.9
CVE-2026-57886 Cross-repository issue/comment attachment re-linking can expose private attachment content
- high Patched
CVE-2026-58422 Improper authorization on OAuth sign-in callback silently re-enables administrator-disabled accounts
- critical Patched CVSS 9.8
CVE-2026-20896 Gitea Docker image: `REVERSE_PROXY_TRUSTED_PROXIES = *` default lets any source IP impersonate any user via `X-WEBAUTH-USER`
- high Patched CVSS 8.5
CVE-2026-57894 Repository Migration Follows Git HTTP Redirects After URL Allow/Block Validation, Enabling Internal Git Repository Exfiltration
- high Patched CVSS 7.7
CVE-2026-58423 LFS authentication bypass via malformed SSH sub-verb allows unauthorized read access to private repositories
- high Patched
CVE-2026-58436 ParseAcceptLanguage quadratic-time DoS via Locale middleware on unauthenticated requests
- medium Patched CVSS 6.5
CVE-2026-57897 Cross-Repo Information Disclosure via Org-Level Actions Run/Job APIs
- high Patched
CVE-2026-58314 Two SSRF findings in Gitea 1.26.2
- high Patched CVSS 8.9
CVE-2026-58424 Permanent Fork PR Workflow Approval Gate Bypass
- medium Patched CVSS 4.3
CVE-2026-58425 OAuth token introspection returns metadata of tokens issued to other clients (RFC 7662 section 4 violation)
- critical Patched CVSS 9.6
CVE-2026-22874 Incomplete SSRF Protection in Webhook and Migration Allow-list Default Filter
- medium Patched CVSS 5.3
CVE-2026-58507 Private Repository Existence Disclosure via go-get Meta Endpoint
- high Patched CVSS 7.1
CVE-2026-58437 Repository Visibility Manipulation via Git Push Options
- medium Patched CVSS 4.3
CVE-2026-27783 Missing repository-unit authorization on issue-template API endpoints
- medium Patched
CVE-2026-58508 Two SSRF vulnerabilities in Gitea migration/mirror (DNS rebinding + missing re-validation)
- medium Patched
CVE-2026-20706 Token scope bypass on web archive download endpoint (variant of PR #37698)
- medium Patched
CVE-2026-58510 GHSA-8fwc-qjw5-rvgp ClearRepoWatches fix not applied to API EditRepo path — sister code path retains stale watches on public->private
- medium Patched CVSS 6.5
CVE-2026-58428 Release attachment extension allowlist bypass via web release edit form (variant of CVE-2025-68939)
- high Patched CVSS 8.1
CVE-2026-24791 Public-only tokens bypass private-resource restrictions on `/api/v1/user` self routes
- medium Patched CVSS 5.9
CVE-2026-58432 Missing Authorization and Authorization Bypass Through User-Controlled Key and Incorrect Permission Assignment for Critical Resource and Exposure of Sensitive Information to an Unauthorized Actor in code.gitea.io/gitea
- critical Patched CVSS 9.6
CVE-2026-58426 Gitea Actions Artifacts V4 signed URL HMAC ambiguity allows cross-repository artifact read and cross-task upload-state write
- low Patched CVSS 2.7
CVE-2026-58511 Webhook Authorization Header Returned in Plaintext via API
- high Patched CVSS 8.1
CVE-2026-28744 Git Smart HTTP Skips Repository Token Scopes for Bearer Tokens
- medium Patched
CVE-2026-59763 Unbounded Arch package file metadata can cause resource amplification in Gitea package uploads
- high Patched CVSS 8.2
CVE-2026-27771 Critical Vulnerability - Already emailed
- low Patched CVSS 3.1
CVE-2026-23603 Blind SSRF in OAuth2 avatar synchronization via unvalidated OIDC picture claim
- high Patched CVSS 8.1
CVE-2026-28699 OAuth2 access token scope enforcement bypass via HTTP Basic authentication
- medium Patched CVSS 4.9
CVE-2026-58429 Public-Only Personal access tokens scope bypass in Organization and Permission Endpoints
- high Patched CVSS 8.5
CVE-2026-26231 Authorization Bypass via "Allow edits from maintainers" allows unauthorized commits to any readable repo
- high Patched CVSS 8.1
CVE-2026-58439 Branch Protection Bypass via PR Retargeting Preserves Stale `official` Approval Flag
- high Patched CVSS 8.7
CVE-2026-28737 Stored XSS via glTF `extensionsRequired` in Gitea 3D File Viewer
- medium Patched CVSS 4.3
CVE-2026-25714 Incomplete CVE-2025-68941 fix: /user/orgs missing checkTokenPublicOnly + switch-case logic flaw
- high Patched
CVE-2026-59765 SSRF via Migration Asset Downloads Bypasses hostmatcher — Reads Internal Files and Cloud Metadata
- high Patched CVSS 8.1
CVE-2026-22555 API Fork Missing CanCreateOrgRepo Check Allows Org Secret Exfiltration
- medium Patched
CVE-2026-25779 Open Redirect via redirect_to in Gitea
- high Patched
GHSA-3m6q-h5gj-7mrw Unsecure default ssh settings
Gitea Website
Website
Redirects
Redirects to https://about.gitea.com/
Security Checks
2 security checks failed (63 passed)
- Empty Page Content
- External Redirect Detected
Server Details
- IP Address 99.84.132.115
- Hostname server-99-84-132-115.atl59.r.cloudfront.net
- Location Atlanta, Georgia, United States of America, NA
- ISP Amazon.com Inc.
- ASN AS16509
Associated Countries
-
US
Safety Score
Website marked as safe
100%
Blacklist Check
gitea.io was found on 0 blacklists
- AntiSocial Blacklist
- Artists Against 419
- Badbitcoin
- Bambenek Consulting
- CERT Polska
- CoinBlockerLists
- CRDF
- CryptoScamDB
- EtherAddressLookup
- EtherScamDB
- Fake Website Buster
- MetaMask EthPhishing
- NABP Not Recommended Sites
- OpenPhish
- PetScams
- PhishFeed
- PhishFort
- Phishing.Database
- PhishStats
- PhishTank
- Phishunt
- RPiList Not Serious
- Scam.Directory
- SecureReload Phishing List
- Spam404
- StopGunScams
- Suspicious Hosting IP
- ThreatFox
- ThreatLog
- TweetFeed
- URLhaus
- ViriBack C2 Tracker
Website Preview
Gitea Docker
Container Info
gitea
Git with a cup of tea! Painless self-hosted all-in-one software development service, including Git hosting, code review, team collaboration, package registry and CI/CD.
gitea/gitea:latestRun Command
docker run -d \
-p 3000:3000/tcp \
-p 222:22/tcp \
-e PUID=${PUID} \
-e PGID=${PGID} \
-v /portainer/Files/AppData/Config/Gitea:/data \
-v /etc/timezone:/etc/timezone:ro \
-v /etc/localtime:/etc/localtime:ro \
--restart=unless-stopped \
gitea/gitea:latest Compose File
version: 3.8
services:
gitea:
image: "gitea/gitea:latest"
ports:
- "3000:3000/tcp"
- "222:22/tcp"
environment:
PUID: 1000
PGID: 100
volumes:
- "/portainer/Files/AppData/Config/Gitea:/data"
- " /etc/timezone:/etc/timezone:ro"
- "/etc/localtime:/etc/localtime:ro"
restart: unless-stopped Environment Variables
- Var Name Default
- PUID 1000
- PGID 100
Port List
- 3000:3000/tcp
- 222:22/tcp
Volume Mounting
- /portainer/Files/AppData/Config/Gitea /data
- /etc/timezone /etc/timezone:ro
- /etc/localtime /etc/localtime:ro
Gitea Reviews
More Code Hosting
-
A fully-managed instance of Forgejo.
-
Fully-featured git, CI and project management platform. Managed instance available, but can also be self-hosted.
-
Lightweight self-hosted git platform, written in Go.
-
Git and mercurial code hosting, task management, mailing lists, wiki hosting and Alpine-based build pipelines. Can be self-hosted, or used through the managed instance at sr.ht.
About the Data: Gitea
Change History
- Amended (github) #608
API
You can access Gitea's data programmatically via our API. Simply make a GET request to:
https://api.awesome-privacy.xyz/v1/services/gitea The REST API is free, no-auth and CORS-enabled. To learn more, view the API Docs or read the API Usage Guide.
Share Gitea
Help your friends compare Code Hosting, and pick
privacy-respecting software and services.
Share Gitea and Awesome Privacy with your network!