Self-hosted code forge
git gud.
Repos, issues, pull requests, CI, wiki, federation. Phoenix on the front, gitoxide on the back, ForgeFed by default. Built so you can host the small project that becomes a movement.
Repos, smart-HTTP + SSH
Bare git on disk with a Postgres cache in front. Embedded SSH daemon — DB-backed key auth, no system git user. LFS too.
Forks, PRs, line-level diffs
3-way merge, fork sync, compare any two refs, and conflicts resolved in the browser. Diffs render hunk-by-hunk with syntax-highlighted lines; large diffs keep their hunks out of the DOM until you open the file.
Forgejo Actions CI
Point any forgejo-runner at it. Matrices across architectures, needs and outputs, concurrency groups, and every trigger you'd reach for — push, pull_request(_target), dispatch with inputs, schedule, workflow_run. A commit status per job, required checks in branch protection, re-run and cancel that actually stop the runner.
Job tokens that know their place
Each job gets a token that works only while it runs, only on its own repository, and only as far as its permissions: say. Fork pull requests wait for a maintainer's approval and run with no secrets and a read-only token.
Federation that works
ForgeFed over ActivityPub: federated PRs, federated reviews (Like/Dislike), federated comments. HTTP-signed; allowlist by default.
Moderation up front
Per-repo interaction policy, quarantine queue, rate limits, peer-block suggestions, and a reversible 'replace with mod message' that keeps the original visible to admins + author.
Owners moderate their own ground
Org and repo admins see the reports about their content — not just the instance admin — and can ban someone from one repo or from every repo an org owns. A ban stops them writing and folds away what they already wrote, at render time, so lifting it restores everything.
Reviews that hold a verdict
Assign reviewers, or take a chip suggesting who actually reviews here. One standing verdict each, not a pile of contradictory rows. Optional rules: block merging while changes are requested, require N approvals, stop authors approving their own — admins can override, and the override is recorded.
Suggest a change, apply it
Comment on a line, or propose the replacement in a suggestion block that anyone with write access can commit. Refuses rather than guesses — if the branch moved since, it says so, and the ref update is a compare-and-swap so a concurrent push can't be clobbered.
History on everything
Pushes, renames, labels, reviews, edits and moderation in one timeline per issue and PR. Body edits fold their before/after into a collapsed diff. Writing #42 leaves a backlink in that item's history, so a reference reads from both ends.
Find things by what they are
Seven topic tags per repo plus one derived from its primary language, browsable at /tags. Syms — stars, but with a set of symbols. Listings filter, sort and paginate with links you can send someone.
MFA + WebAuthn
TOTP authenticator apps, FIDO2 security keys (YubiKey, passkeys, Touch ID), recovery codes. Sudo mode in front of every credential change, and optional instance-wide enforcement with a grace window.
Hardened by default
Secrets encrypted under a key it refuses to boot without. Wrong passwords, sign-in emails and sign-ups rate limited. Outbound requests refuse private addresses. Uploaded bytes never render on the forge's own origin.
Markdown that links itself
GFM with cross-references — `#42` links to whichever issue or PR that number actually is, `#x2a` works too, `owner/repo#42` crosses repos. Quote-reply on every comment.
Org-level labels
Define labels once at the org; every repo inherits unless it opts out. Color picker with a 16-swatch palette and a live preview badge.
Wikis
Every repository gets a sister .wiki.git, edited through the UI or cloned and pushed like any repo.
Package registries
Containers, PyPI, Hex, Cargo, apt and raw files, served by the forge. CI publishes with its job token — no stored secret — and one signing key per org covers everything it ships.
Bring your repositories
Import a GitHub org or user, a GitLab group, or any git URL, each on its own background job with live progress. Keep them in sync on demand or hourly, mirrored or reconciled.
Android app + gg CLI
CI runs, logs and re-runs, workflow dispatch, fork-run approval, issues and pull requests from your phone or your terminal. Pair a phone by scanning a QR code; the device is its token.
Profiles + identicon avatars
User + org profile pages at /u/:handle and /orgs/:handle. Bio, location, socials, pinned repos (drag-to-reorder, up to 7), and an auto-created alice/alice README repo that renders inline.
Language + contributor stats
0.3em GitHub-style bar above the file tree, click for /stats/languages or /stats/committers. Computed lazily by Oban from cached blob + commit metadata — no extra git walks on the request path.
Invite-gated signups
Three registration modes — open, invite-only (default), closed. Single-use invite links generated from /users/settings/invites, revocable anytime. Org members manageable from settings with a last-admin guard.