Registry
How do I publish a Katalog to the registry?
Create a pattern directory with a katalog.yaml and push it:
ork registry push postgres:v14 ./patterns/postgres/
The minimal directory is just katalog.yaml. In practice, include a simulate.yaml and e2e.yaml — they gate the push automatically and bake a quality signal into the artifact that consumers can see before importing.
postgres/
katalog.yaml # required
crd.yaml # recommended — CRD manifest for consumers who don't have it
cr.yaml # recommended — sample CR
simulate.yaml # runs before e2e, blocks push if assertions fail
e2e.yaml # runs against a real kind cluster, blocks push if expectations fail
README.md # shown in registry UI
→ Katalog patterns in the registry
How do I publish a Motif?
Same command — Motifs push to ORK_MOTIFS_REGISTRY instead of ORK_REGISTRY:
ork registry push security-baseline:v1 ./motifs/security-baseline/
If a pattern directory contains both a katalog.yaml and a motif.yaml, one push publishes both — the Katalog to the Katalog registry and the Motif to the Motif registry.
→ Motif patterns in the registry
How do simulate and e2e gate publication?
When simulate.yaml and e2e.yaml are present in a pattern directory, ork registry push runs them automatically — simulate first, then e2e — and blocks publication if either fails.
ork registry push postgres:v14 ./patterns/postgres/
→ simulate runs (< 1s, no cluster)
→ e2e runs (kind cluster, 2–5 min)
→ artifact pushed with quality annotations
The gates are ordered deliberately. Simulate is instant — it catches template errors, wrong resource names, and wrong cycle order without spinning up a cluster. E2E runs after because there is no point provisioning a cluster when the reconciler is already broken.
The result is baked into the OCI artifact:
io.orkestra.simulate.status passed | no-assertion | skipped
io.orkestra.e2e.status passed | skipped | forced
ork registry list shows an E2E column. ork registry info shows both simulate and e2e status. Consumers can see what quality guarantees a pattern carries before they import it.
To skip individual gates:
ork registry push postgres:v14 ./patterns/postgres/ --no-simulate # skip simulate only
ork registry push postgres:v14 ./patterns/postgres/ --no-e2e # skip e2e only
ork registry push postgres:v14 ./patterns/postgres/ --force # skip both
Skipping is recorded in the annotations — consumers can see it.
→ How simulate gates publication
→ How e2e gates publication
Can I use a private registry?
Yes — point Orkestra at any OCI-compatible registry:
export ORK_REGISTRY=oci://ghcr.io/myorg/katalogs
export ORK_MOTIFS_REGISTRY=oci://ghcr.io/myorg/motifs
Push and pull work identically. Credentials come from ~/.docker/config.json — run docker login before pushing.