Skip to content

Tagging Strategy

APX uses subdirectory-scoped git tags to version individual API lines independently within a single canonical repository.

Tag Format

Tags follow the pattern:

<api-id>/v<semver>

Examples:

API ID Version Git Tag
proto/payments/ledger/v1 v1.0.0-alpha.1 proto/payments/ledger/v1/v1.0.0-alpha.1
proto/payments/ledger/v1 v1.0.0-beta.1 proto/payments/ledger/v1/v1.0.0-beta.1
proto/payments/ledger/v1 v1.0.0 proto/payments/ledger/v1/v1.0.0
proto/payments/ledger/v2 v2.0.0-alpha.1 proto/payments/ledger/v2/v2.0.0-alpha.1

API Line vs Release Version

These are different concepts:

  • API line (v1, v2) = compatibility namespace. Only changes on breaking changes.
  • Release version (v1.0.0-beta.1, v1.1.0) = SemVer release of that line.

What stays stable

The import path does not change between pre-release and GA:

// This import is the same whether you're on alpha, beta, or GA
import ledgerv1 "github.com/acme/apis/proto/payments/ledger/v1"

Only the resolved module version changes:

# During beta
go get github.com/acme/apis/proto/payments/ledger@v1.0.0-beta.1

# At GA
go get github.com/acme/apis/proto/payments/ledger@v1.0.0

What triggers a new API line

Only breaking changes create a new API line (v1v2). This means a new directory, new import path, and consumers must explicitly opt in:

import ledgerv2 "github.com/acme/apis/proto/payments/ledger/v2"

Lifecycle Metadata

Lifecycle state is tracked separately from the version tag:

Lifecycle Description
experimental Early exploration, no compatibility guarantees
beta API surface is stabilizing; minor breaking changes still possible
stable Production-ready, backward-compatible within the API line
deprecated Superseded by a newer line, still supported
sunset End-of-life, will be removed

Note

preview is accepted as a backward-compatible alias for beta.

Inspect Tags

Use apx inspect to see what tags would be created:

apx inspect release proto/payments/ledger/v1@v1.0.0-beta.1