Skip to content

App Repository Setup

App repositories are where teams author schemas day-to-day and generate code with canonical import paths. They release via tag + PR to the canonical repository, enabling distributed authoring with centralized governance and seamless local-to-released transitions.

Overview

App repos handle the development lifecycle:

  • Daily Authoring


    • Teams work in familiar app repositories
    • Schema files alongside application code
    • Local validation and testing
    • Standard development workflows
  • Buf-First Approach


    • No local go.mod required for authoring
    • Buf workspace configuration
    • APX synthesizes canonical go.mod on release
    • Clean separation of concerns
  • Automated Releasing


    • Tag releases in app repo
    • CI automatically opens canonical repo PR
    • PR-based release to canonical repo
    • Validation before and after release
  • Canonical Import Paths


    • Generated code uses canonical import paths
    • go.work overlays for local development
    • Seamless switch to released modules
    • No import rewrites or replace directives

Key Benefits

  • Familiar Workflow: Teams work in their existing repositories
  • Canonical Import Paths: Single import path from local dev to production
  • Local Testing: Full validation and code generation with canonical imports
  • go.work Overlays: Seamless local development without import gymnastics
  • Automated Releasing: No manual canonical repo management
  • Clean History: PR-based workflow with full audit trail in canonical repo
  • Policy Enforcement: APX validates schemas before releasing

Directory Structure

Standard app repo layout for schema authoring:

<app-repo>/
├── go.mod                          # your app's module
├── go.work                         # managed by apx - overlays canonical → local
├── internal/
│  ├── gen/
│  │  └── go/proto/<domain>/<api>@v1.2.3/
│  │     ├── go.mod                 # module github.com/<org>/apis/proto/...
│  │     └── *.pb.go                # imports canonical path above
│  └── apis/
│     └── proto/                    # or openapi/, avro/, etc.
│        └── payments/
│           └── ledger/
│              ├── v1/
│              │  └── ledger.proto  # your schema files
│              └── v2/              # future breaking versions
├── buf.work.yaml                   # Buf workspace config
├── apx.yaml                       # APX configuration
├── apx.lock                        # Pinned toolchain versions
└── .gitignore                      # excludes internal/gen/

Configuration Files

apx.yaml

APX configuration for the app repository:

version: 1
org: <org>
repo: <app-repo>
module_roots:
  - internal/apis/proto
language_targets:
  go:
    enabled: true
release:
  tag_format: "{subdir}/v{version}"
  ci_only: true

buf.work.yaml

Buf workspace covering all version directories:

version: v1
directories:
  - internal/apis/proto/**/v1
  - internal/apis/proto/**/v2
  # Automatically includes future versions

Next Steps

  1. Set up the directory layout
  2. Configure local development
  3. Implement release workflow
  4. Add CI integration