Skip to content

ADR-0014: Gitea as the in-boundary git host

Status: Accepted — 001-walking-skeleton (2026-06) Principles served: I, VI Source: specs/001-walking-skeleton/research.md D-4

Context

Every app lives in its own git repo, promotion is a platform-raised pull request (ADR-0004), and the boundary requires git to live inside the configured tier — prompts, generated code, and history may not leave the customer boundary. The git host therefore has to run in-cluster and expose a PR API the Tend operator can drive programmatically.

Decision

In-cluster Gitea is the reference git host for per-app repos and promotion PRs. It is lightweight, self-hostable, and has a PR API the operator can drive (the Gitea PR reviewer group maps to the platform-approver group in Keycloak). The choice is explicitly pluggable: a customer's existing in-boundary git — for example GitLab or GitHub Enterprise on-premises — can replace Gitea, honoring the no-lock-in posture.

Alternatives considered

  • GitHub.com — rejected: off-boundary.
  • A bare git server — rejected: no PR/review primitive, which the promotion-as-PR flow requires.

Consequences

The full promotion audit trail — PR, review, merge — stays inside the boundary, and the operator has a concrete API to raise promotion PRs against. Gitea is also an evidence source: the evidence index reads commit history (with builder-recorded prompt hashes) and promotion PR metadata from its API (ADR-0016). One honest gap follows from Gitea also hosting the platform repo, which makes the app-of-apps loop circular on a fresh cluster. hack/seed-gitea.sh breaks that circle once — install Gitea directly, push the platform repo into it, register the Argo CD credential — after which Argo adopts those same manifests and the platform is self-hosting. The bootstrap gap recorded when this ADR was written is closed; the local development path survives it on its own merits.