- Python 56.5%
- Shell 43.5%
| docs | ||
| examples | ||
| relay | ||
| .gitignore | ||
| CONTRIBUTING.template.md | ||
| ias-git-backup.sh | ||
| ias-git-mirror-setup.sh | ||
| ias-git-pull-contribution.sh | ||
| ias-git-server-standup.sh | ||
| LICENSE | ||
| NOTICE | ||
| README.md | ||
Sovereign Git Server + Forge-Agnostic Contribution Coordination
What this is: a small, reproducible bundle for running your own sovereign git server (Forgejo) as the canonical source of truth, mirroring out to GitHub + GitLab + Codeberg for reach, and — the hard part nobody ships — collating contributions raised on any of those forges back to your canonical, forge-agnostically.
Why (the motivation). Public developer platforms are under US jurisdiction. In July 2019 GitHub, complying with US OFAC export sanctions, cut off developers in Crimea, Cuba, Iran, North Korea, and Syria — freezing private repos and refusing to let affected users even export their own data (Iran was only restored in Jan 2021). Separately, the US CLOUD Act (18 U.S.C. §2713, 2018) compels US-headquartered providers to disclose data "regardless of whether [it] is located within or outside of the United States" — which the EU's own regulators found in tension with GDPR Art. 48. The sovereign response is already real: the Netherlands government runs its own Forgejo forge (code.overheid.nl, 2026) "for digital sovereignty." This bundle lets any team do the same — without losing the reach of the big forges.
The model (one line)
git.vake.works (your Forgejo) is the single canonical merge point; GitHub/GitLab/Codeberg are reach-only mirrors; contributions raised on ANY forge are pulled back to canonical, merged there, and the merge push-mirrors back out — closing the loop. The forge-agnostic hook: every forge exposes each PR as a fetchable git ref (refs/pull/N/head on GitHub/Forgejo, refs/merge-requests/N/head on GitLab).
Set up your own, coffee to forge: docs/SETUP.md (provider → DNS A-record → Forgejo+HTTPS → mirrors → backups → contributions).
Full design: docs/contribution-coordination-framework.md.
Proof it works (dogfood)
bash examples/local-dogfood-harness.sh
Spins up local bare-repo stand-ins for the canonical Forgejo + all three mirrors and drives the entire loop — mirror-out → a contributor PR on each forge → relay-fetch-by-ref → merge on canonical → mirror-out → all three re-converge. 19/19 assertions GREEN, zero external services. This is the git-mechanics proof; the forge-API adapters (list open PRs per forge) are tested against the real forges separately.
Bundle layout
| File | Role | Status |
|---|---|---|
local-dogfood-harness.sh |
End-to-end loop proof on local stand-ins | ✅ GREEN |
README.md |
This index | ✅ |
ias-git-server-standup.sh |
Forgejo + Caddy TLS + app.ini hardening + systemd |
⏳ (per docs/contribution-coordination-framework.md §2) |
ias-git-mirror-setup.sh |
Per-repo push-mirrors → github/gitlab/codeberg (Forgejo API) | ⏳ |
ias-git-pull-contribution.sh |
L1: fetch a PR by ref from any forge → land on canonical | ⏳ |
forge-adapters/ |
L2: list open PRs per forge (github/gitlab/codeberg) | ⏳ |
CONTRIBUTING.md |
L0: mirror redirect ("PRs on any mirror relayed upstream") | ⏳ |
ias-git-backup.sh |
forgejo dump + restic off-box |
⏳ (per standup §3) |
Layered contribution model (escalating)
- L0 —
CONTRIBUTINGredirect on every mirror (zero build). - L1 — maintainer fetches a PR by its per-forge ref, applies on canonical (forge-agnostic;
gh/glab/tea). - L2 — relay bot: watch each mirror's PR API → fetch → land
contrib/<forge>/pr-Non canonical → open Forgejo PR → CI → comment back. No turnkey tool exists — this is the build. - L3 — side doors: AGit-flow + patch/email (
git format-patch/b4). - Not ForgeFed (experimental in 2026; GitHub/GitLab don't speak it).
Status
DRAFT, 2026-07-20. Direction ratified (all-3-forges, git.vake.works, build+dogfood, local-first). Local dogfood GREEN. Real-forge instantiation + server ops held for operator. Ships (with the scripts above) alongside the sovereign-git LinkedIn article.