Gitea

Lightweight self-hosted git platform, written in Go.

Open Source

Gitea Source Code

Author

go-gitea

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

#bitbucket#cicd#devops#docker-registry-v2#git#git-gui#git-lfs#git-server#gitea#github#github-actions#gitlab#go#golang#hacktoberfest#maven-server#npm-registry#self-hosted#typescript#vue

Homepage

https://gitea.com

Repository

  • LicenseMIT
  • Created01 Nov 16
  • Primary languageGo
  • Size351,994 KB
  • Stars57,425
  • Forks7,009
  • Watchers57,425

Language Usage

Language Usage

Project Health

  • Last commit11 minutes ago
  • Open issues2,548
  • Latest releasev1.28.0-dev

Recent Commits

  • Giteabot(17 Aug 26)

    chore(deps): update dependencies (#38947)

  • Mitrahsoft(17 Aug 26)

    fix(indexer): correct bleve indexer token filters (#38853) * fix #36228 * fix #37221 --------- Co-authored-by: wxiaoguang <[email protected]>

  • GiteaBot(17 Aug 26)

    [skip ci] Updated translations via Crowdin

  • wxiaoguang(16 Aug 26)

    fix: make "login_name" field optional for API edit user (#38917)

  • wxiaoguang(16 Aug 26)

    chore: fix repo watch (#38921)

  • GiteaBot(16 Aug 26)

    [skip ci] Updated translations via Crowdin

  • Giteabot(15 Aug 26)

    fix(deps): update module golang.org/x/image to v0.45.0 [security] (#38930) Co-authored-by: bircni <[email protected]>

  • bircni(15 Aug 26)

    fix(ui): respect FEED_PAGING_NUM on the dashboard feed (#38935) The dashboard activity feed was paginated with `[ui.user] REPO_PAGING_NUM` instead of `[ui] FEED_PAGING_NUM`. The wrong setting was picked up when the page size was hoisted into a local variable in https://github.com/go-gitea/gitea/pull/34994, most likely copied from the `dashboardRepoList` block a few lines above. `REPO_PAGING_NUM` should only control repository lists. Fixes https://github.com/go-gitea/gitea/issues/38925

  • GiteaBot(15 Aug 26)

    [skip ci] Updated translations via Crowdin

  • bircni(14 Aug 26)

    docs: Update CHANGELOG for version 1.27.2 (#38923) Signed-off-by: bircni <[email protected]>

  • Lunny Xiao(14 Aug 26)

    ci: remove AWS S3 uploads from release workflows (#38928) Release binaries and downloads have been served from Cloudflare R2 for a while now, so the AWS S3 upload is redundant. This removes the `configure aws` and `upload binaries to s3` steps from the nightly, RC and version release workflows. Since `configure-aws-credentials` no longer runs in those jobs, the `AWS_REGION: auto` workaround in the R2 step can be dropped as well. The `AWS_*` secrets for S3 can be removed from the repository settings afterwards.

  • Giteabot(14 Aug 26)

    chore(deps): update dependency go to v1.26.6 (#38912)

  • bircni(14 Aug 26)

    enhance(admin): show impersonation banner and keep password change with the user (#38924) Follow-up to https://github.com/go-gitea/gitea/pull/38614 --------- Co-authored-by: wxiaoguang <[email protected]>

  • wxiaoguang(14 Aug 26)

    refactor: wiki edit form (#38918) 1. the fragile `document.querySelector('.repository.wiki.new .ui.form')!` is broken (again), rewrite to "data-global-init" * regression from #37571 because a new form was added 3. use "form-fetch-action" and JSON response instead of "RenderWithErrDeprecated"

  • Mitrahsoft(14 Aug 26)

    docs(api): document 401/403 responses for user key endpoints (#38711)

  • wxiaoguang(14 Aug 26)

    refactor: clean up form binding & validation (#38873) Clarify the "validation" and "error display" logic. All the copied&pasted `Validate` functions are removed.

  • GiteaBot(14 Aug 26)

    [skip ci] Updated translations via Crowdin

  • Ban Yongping(13 Aug 26)

    fix(migrations): use all configured GitHub tokens (#38841) GitHub migrations accept multiple comma-separated OAuth tokens, but clients with unknown rate data are never selected. After the first client is used, every later token stays unknown and can never participate in quota-aware selection. Select each client with unknown rate data once before falling back to the existing highest-remaining-rate choice. The regression test covers initial probing of all clients and then selection by remaining quota. Fixes https://github.com/go-gitea/gitea/issues/34342 Assisted-by: Codex:GPT-5 --------- Co-authored-by: silverwind <[email protected]>

  • wxiaoguang(13 Aug 26)

    fix: update collaborator access mode (#38894) There is already AddOrUpdateCollaborator, don't duplicate the code.

  • bircni(13 Aug 26)

    fix(actions): keep github.event.inputs as strings for workflow_dispatch (#38899) `github.event.inputs` must mirror the raw `workflow_dispatch` payload, where GitHub keeps every input as a string. Only the separate `inputs` context preserves declared types, e.g. booleans. A previous fix coerced boolean inputs in the single map that fed both contexts, so `github.event.inputs.someBool` became a real boolean and comparisons like `== 'true'` stopped matching. `github.event.inputs` now stays string-only again. The `inputs` context used for server-side `if:` evaluation of needs-gated/matrix-deferred jobs re-coerces booleans independently, from the job's own workflow declaration, so that path keeps working correctly. Fixes https://github.com/go-gitea/gitea/issues/38896 --------- Co-authored-by: Zettat123 <[email protected]> Co-authored-by: silverwind <[email protected]>

  • GiteaBot(13 Aug 26)

    [skip ci] Updated translations via Crowdin

  • Zettat123(12 Aug 26)

    fix(actions): let a rerun of selected jobs read the previous attempt's artifacts (#38857) Fixes #38773 ## Background Artifacts became attempt-scoped in #37119, and the runner-facing artifact APIs filter strictly by the attempt of the running job. "Re-run failed jobs" creates a new attempt whose passed-through jobs never upload their artifacts again, so a re-run job that downloads one of them fails with "artifact not found". ## Fix The read paths (v3 and v4 list and download) now resolve artifacts across the running job's attempt plus the attempts it inherits from, and an inherited artifact is shadowed by a same-named one from a newer attempt. ## Note GitHub's documentation does not document these behaviors. The conclusions below are based on manual testing, so consistency with GitHub cannot be guaranteed. - In a "partial re-run", a job can download artifacts uploaded by an earlier attempt, every attempt keeps its own copy of a name, and a lookup by name resolves to the newest one. - A full "Re-run all jobs" never downloads artifacts from earlier attempts. --------- Co-authored-by: bircni <[email protected]>

  • wxiaoguang(12 Aug 26)

    refactor: external render (#38885) make the "command variable replacement" more accurate and OS-independent, add a test for it.

  • bircni(12 Aug 26)

    fix(actions): resolve pull_request_target reusable workflows at the base commit (#38886) For a `pull_request_target` (PRT) run, Gitea loads the top-level workflow from the trusted base branch, but any local reusable workflow it calls (`uses: ./...`) was read from the PR **head** commit, which the fork author controls. ## Fix **Record the source commit where the content is read.** `DetectedWorkflow` now carries a `SourceCommitSHA` filled in next to `Content`, so the PRT detection pass at the base commit records the base SHA automatically. **Defense in depth.** `loadReusableWorkflowSource` pins the PR base commit for a PRT run's local `uses: ./...` rather than trusting the stored SHA. This also covers runs recorded before this change, whose rows still hold the head SHA and would otherwise resolve from the fork on rerun. Existing run rows are not migrated. --------- Co-authored-by: Zettat <[email protected]>

  • bircni(12 Aug 26)

    enhance(repo): add default object format setting (#38877) Adds `[repository] DEFAULT_OBJECT_FORMAT` to default new repositories to `sha1` or `sha256`. Applies the setting to repository creation defaults in the UI and API, reducing repeated manual selection. Docs: https://gitea.com/gitea/docs/pulls/504 Fixes https://github.com/go-gitea/gitea/issues/38854 --------- Co-authored-by: wxiaoguang <[email protected]>

  • Lunny Xiao(12 Aug 26)

    chore: Pre-register a builtin OAuth2 application for the official Gitea mobile app (#38880) This is a prepare and required step for upcoming Gitea Official Mobile APP which supports login with OAuth2. The official Gitea mobile app needs the same mechanism. This adds a builtin application for it: | | | |---|---| | client ID | `b757811a-05c8-4c76-8d74-a5ee3d2073f2` | | config name | `gitea-app` | | display name | `Gitea App` | | redirect URI | `com.gitea.app://oauth/callback` | Unlike the existing entries, which are CLIs and can therefore use a loopback `http://127.0.0.1` redirect, a mobile app authorises through a system browser session (`ASWebAuthenticationSession` on iOS, Custom Tabs on Android) that can only receive a custom-scheme callback, hence the custom scheme here.

  • bircni(12 Aug 26)

    docs: Adjust Changelog to include all Security relevant details (#38876) Signed-off-by: bircni <[email protected]>

  • silverwind(12 Aug 26)

    fix(server): set `ReadHeaderTimeout` on HTTP servers (#38878) Add `ReadHeaderTimeout` which limits how long a client can take to send HTTP headers.

  • GiteaBot(12 Aug 26)

    [skip ci] Updated translations via Crowdin

  • somaz(11 Aug 26)

    fix(repo): avoid a repo-sized temp file for every bundle download (#38863) Bundle downloads run `git bundle create` into a temp file under `data/tmp/git-repo-content` and copy it to the response, so every download puts a second, repo-sized copy on disk before the first byte is sent. If the process dies mid-request that copy is stranded: the startup sweep only drops files older than 3 days, and cannot remove a directory that still holds a newer file. Streaming `git bundle create -` to the response removes that copy. `CreateArchive` above already uses the same gitcmd pattern, and the bundle bytes are unchanged (existing integration assertions on the exact length still pass). One consequence: git can now fail after output starts, so a mid-stream failure truncates the body instead of returning an error. I did not act on the TODO. A temp ref only works under `refs/heads/*`; with `refs/bundle/temp-*` the bundle carries no branch and clones empty, so I noted that on the TODO. Fixes https://github.com/go-gitea/gitea/issues/38447 --------- Co-authored-by: silverwind <[email protected]>

Gitea Security

6.8/10

Repo Security Summary

Updated 27 Jul 26 Fuzz tested

  • Security-Policy10/10
  • Code-Review9/10
  • Maintained10/10
  • Dangerous-Workflow0/10
  • CII-Best-Practices5/10
  • Token-Permissions6/10
  • License10/10
  • Binary-Artifacts10/10
  • Fuzzing10/10
  • Packaging10/10
  • Branch-Protection3/10
  • Pinned-Dependencies8/10
  • Signed-Releases8/10
  • SAST1/10

Security Advisories (76)

  • criticalPatchedCVSS 9.8

    CVE-2026-60004Remote Code Execution via diffpatch Git Hook Installation

  • criticalPatchedCVSS 9.8

    CVE-2026-59774Unauthenticated Arbitrary File Read can lead to RCE

  • mediumPatched

    CVE-2026-58438Cross-repository IDOR in issue-dependency removal lets an attacker tamper with and comment on private repos they cannot access

  • highPatched

    CVE-2026-58433Team-repository linking endpoint bypasses the RepoAdminChangeTeamAccess organization setting

  • mediumPatchedCVSS 6.8

    CVE-2026-58440Webhooks 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`)

  • mediumPatchedCVSS 4.3

    CVE-2026-59766CVE-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`

  • mediumPatchedCVSS 6.3

    CVE-2026-58441SSRF in restore-repo via unsanitized pull_request.yml Head.CloneURL

  • mediumPatchedCVSS 6.5

    CVE-2026-58442Repository migration SSRF via multi-answer DNS allow-list bypass

  • criticalPatchedCVSS 9.6

    CVE-2026-58443Public-only repository tokens can update private PR head branches

  • mediumPatchedCVSS 4.3

    CVE-2026-58444Personal access token scope enforcement bypass on the repository home page (`GET /{owner}/{repo}`) discloses private repository contents

  • mediumPatched

    CVE-2026-58427Private org member list leaked via /members API endpoint — incomplete fix for PR #38145

  • lowPatchedCVSS 2.7

    CVE-2026-58445Cross-repository label-ID enumeration oracle via unscoped DeleteIssueLabel API

  • mediumPatchedCVSS 6.5

    CVE-2026-42931Denial of Service via Unbounded io.ReadAll in NPM Package Tag Endpoint

  • mediumPatchedCVSS 6.3

    CVE-2026-58416Fork-PR Actions task can read a third private repository via the collaborative-owner branch (missing fork-PR guard)

  • mediumPatchedCVSS 4.3

    CVE-2026-50105RSS/Atom feed handlers bypass API-token scope & public-only confinement (incomplete fix of #37698)

  • lowPatched

    CVE-2026-58417REST API exposes organization membership of private organizations to public

  • highPatchedCVSS 7.5

    CVE-2026-54481Internal API HTTP client hardcodes InsecureSkipVerify:true with no config override (CWE-295)

  • mediumPatchedCVSS 4.3

    CVE-2026-27761API access token scope enforcement bypass on repository RSS/Atom feed endpoints leaks private repository commit data

  • mediumPatchedCVSS 6.5

    CVE-2026-58418SSRF via HTTP Redirect in Repository Migration

  • lowPatched

    CVE-2026-58434Private Repository Metadata Remains Accessible After Access Revocation

  • highPatched

    CVE-2026-24451Fork Synchronization Continues After Parent Repository Changes from Public to Private

  • mediumPatched

    CVE-2026-55982OIDC userinfo Endpoint Returns Identity Claims Without Enforcing API Token Scopes

  • mediumPatched

    CVE-2026-25038Unauthorized Access to Labels of Private Organizations

  • lowPatched

    CVE-2026-58419Notification API leaks private issue metadata after access revocation

  • highPatchedCVSS 7.1

    CVE-2026-20779TOTP TOCTOU race on web 2FA paths + missing replay check on Basic-Auth `X-Gitea-OTP` surface

  • lowPatchedCVSS 2.7

    CVE-2026-55984Null Pointer Dereference in AddTime API Causes Authenticated Denial of Service

  • mediumPatchedCVSS 5.4

    CVE-2026-55986Email Management API Bypasses ManageCredentials Feature Restrictions

  • highPatched

    GHSA-rjvx-x5h2-6px5API Fork Endpoint Authorization Bypass Allows Organization Members to Bypass Repository Creation Restrictions

  • mediumPatched

    CVE-2026-58420Local File Inclusion via file:// URI in Migration Restore

  • highPatched

    CVE-2026-27775Cached Per-Branch Permission Check in Pre-Receive Hook Allows Full Repository Write

  • highPatched

    CVE-2026-58435Gitea LFS Deploy-Key Privilege Escalation

  • highPatchedCVSS 8.1

    CVE-2026-55987OAuth2 sign-in reactivates an administrator-deactivated account on auth sources without refresh tokens (incomplete fix of #38009)

  • mediumPatchedCVSS 4.3

    CVE-2026-56443Token public-only scope bypassed on Limited-visibility owners (Repository + Package categories) — residual after CVE-2026-25714 / PR #37118

  • highPatchedCVSS 7.1

    CVE-2026-28740Git LFS object reuse allows non-Code access to authorize private source objects

  • mediumPatched

    CVE-2026-56654Privilege Escalation via Access Token Scope Escalation in API

  • mediumPatchedCVSS 4.3

    CVE-2026-58431Public-only API token restriction is not enforced on team API routes

  • mediumPatched

    CVE-2026-56657Gitea SSH Key Parser Denial of Service

  • mediumPatched

    CVE-2026-58421Unauthenticated ReDoS via CODEOWNERS pattern matching allows denial of service

  • lowPatched

    CVE-2026-56750Gitea Remember-Me Token Theft Not Invalidating Attacker Session

  • mediumPatched

    CVE-2026-56755Denial of Service (CPU & Memory Exhaustion) via O(N^2) String Concatenation in Debian Package Upload

  • mediumPatchedCVSS 5.9

    CVE-2026-57886Cross-repository issue/comment attachment re-linking can expose private attachment content

  • highPatched

    CVE-2026-58422Improper authorization on OAuth sign-in callback silently re-enables administrator-disabled accounts

  • criticalPatchedCVSS 9.8

    CVE-2026-20896Gitea Docker image: `REVERSE_PROXY_TRUSTED_PROXIES = *` default lets any source IP impersonate any user via `X-WEBAUTH-USER`

  • highPatchedCVSS 8.5

    CVE-2026-57894Repository Migration Follows Git HTTP Redirects After URL Allow/Block Validation, Enabling Internal Git Repository Exfiltration

  • highPatchedCVSS 7.7

    CVE-2026-58423LFS authentication bypass via malformed SSH sub-verb allows unauthorized read access to private repositories

  • highPatched

    CVE-2026-58436ParseAcceptLanguage quadratic-time DoS via Locale middleware on unauthenticated requests

  • mediumPatchedCVSS 6.5

    CVE-2026-57897Cross-Repo Information Disclosure via Org-Level Actions Run/Job APIs

  • highPatched

    CVE-2026-58314Two SSRF findings in Gitea 1.26.2

  • highPatchedCVSS 8.9

    CVE-2026-58424Permanent Fork PR Workflow Approval Gate Bypass

  • mediumPatchedCVSS 4.3

    CVE-2026-58425OAuth token introspection returns metadata of tokens issued to other clients (RFC 7662 section 4 violation)

  • criticalPatchedCVSS 9.6

    CVE-2026-22874Incomplete SSRF Protection in Webhook and Migration Allow-list Default Filter

  • mediumPatchedCVSS 5.3

    CVE-2026-58507Private Repository Existence Disclosure via go-get Meta Endpoint

  • highPatchedCVSS 7.1

    CVE-2026-58437Repository Visibility Manipulation via Git Push Options

  • mediumPatchedCVSS 4.3

    CVE-2026-27783Missing repository-unit authorization on issue-template API endpoints

  • mediumPatched

    CVE-2026-58508Two SSRF vulnerabilities in Gitea migration/mirror (DNS rebinding + missing re-validation)

  • mediumPatched

    CVE-2026-20706Token scope bypass on web archive download endpoint (variant of PR #37698)

  • mediumPatched

    CVE-2026-58510GHSA-8fwc-qjw5-rvgp ClearRepoWatches fix not applied to API EditRepo path — sister code path retains stale watches on public->private

  • mediumPatchedCVSS 6.5

    CVE-2026-58428Release attachment extension allowlist bypass via web release edit form (variant of CVE-2025-68939)

  • highPatchedCVSS 8.1

    CVE-2026-24791Public-only tokens bypass private-resource restrictions on `/api/v1/user` self routes

  • mediumPatchedCVSS 5.9

    CVE-2026-58432Missing 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

  • criticalPatchedCVSS 9.6

    CVE-2026-58426Gitea Actions Artifacts V4 signed URL HMAC ambiguity allows cross-repository artifact read and cross-task upload-state write

  • lowPatchedCVSS 2.7

    CVE-2026-58511Webhook Authorization Header Returned in Plaintext via API

  • highPatchedCVSS 8.1

    CVE-2026-28744Git Smart HTTP Skips Repository Token Scopes for Bearer Tokens

  • mediumPatched

    CVE-2026-59763Unbounded Arch package file metadata can cause resource amplification in Gitea package uploads

  • highPatchedCVSS 8.2

    CVE-2026-27771Critical Vulnerability - Already emailed

  • lowPatchedCVSS 3.1

    CVE-2026-23603Blind SSRF in OAuth2 avatar synchronization via unvalidated OIDC picture claim

  • highPatchedCVSS 8.1

    CVE-2026-28699OAuth2 access token scope enforcement bypass via HTTP Basic authentication

  • mediumPatchedCVSS 4.9

    CVE-2026-58429Public-Only Personal access tokens scope bypass in Organization and Permission Endpoints

  • highPatchedCVSS 8.5

    CVE-2026-26231Authorization Bypass via "Allow edits from maintainers" allows unauthorized commits to any readable repo

  • highPatchedCVSS 8.1

    CVE-2026-58439Branch Protection Bypass via PR Retargeting Preserves Stale `official` Approval Flag

  • highPatchedCVSS 8.7

    CVE-2026-28737Stored XSS via glTF `extensionsRequired` in Gitea 3D File Viewer

  • mediumPatchedCVSS 4.3

    CVE-2026-25714Incomplete CVE-2025-68941 fix: /user/orgs missing checkTokenPublicOnly + switch-case logic flaw

  • highPatched

    CVE-2026-59765SSRF via Migration Asset Downloads Bypasses hostmatcher — Reads Internal Files and Cloud Metadata

  • highPatchedCVSS 8.1

    CVE-2026-22555API Fork Missing CanCreateOrgRepo Check Allows Org Secret Exfiltration

  • mediumPatched

    CVE-2026-25779Open Redirect via redirect_to in Gitea

  • highPatched

    GHSA-3m6q-h5gj-7mrwUnsecure default ssh settings

Gitea Website

Website

301 Moved Permanently

Redirects

Redirects to https://gitea.com/

Security Checks

1 security checks failed (64 passed)

  • External Redirect Detected

Server Details

  • IP Address104.21.17.32
  • LocationSan Francisco,California,United States of America,NA
  • ISPCloudFlare Inc.
  • ASNAS13335

Associated Countries

  • USUS

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

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.

#Web#Tools

View on DockerHub

gitea/gitea:latest

Run 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 NameDefault
  • PUID1000
  • PGID100

Port List

  • 3000:3000/tcp
  • 222:22/tcp

Volume Mounting

  • Container PathHost Bind
  • /data/portainer/Files/AppData/Config/Gitea
  • /etc/timezone:ro /etc/timezone
  • /etc/localtime:ro/etc/localtime

Gitea Reviews

More Code Hosting

About the Data: Gitea

Change History

Edit Gitea Data

You can edit Gitea's entry in this section of awesome-privacy.yml by submitting a PR to our GitHub repo.
Note that some of the information shown above has been aggregated from external sources, a list of these can be found data documentation.

Origin Data

Modify Data

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!