Browse Config
Catalog
Config
Stacks
Operate
Docs

Package and deliver it as OCI, and see what is signed

Every result in this catalog can leave as an OCI artifact, and OCI covers several different shapes with different producers, consumers, and signatures. This page names each shape, shows which layout each consumer needs, and says which shapes carry a signature today.

This page defines the OCI shapes and digests once. Config explains the lifecycle they carry, Variants explains the base and derived variants a bundle becomes, and Stacks and fleets keeps the two stack OCI forms and links back here.

New to cub? Install the cub CLI first. Public catalog packages pull and render anonymously, and you sign in only once a command saves or changes ConfigHub data.

1. Tell the OCI shapes apart, and match each to its consumer

OCI is the common transport in this catalog, not a universal execution model. A package can carry exact objects plus routes and source records. Read the full passage.

The consumer still decides what runs. cub installer renders the objects, ConfigHub stores and changes the records, Argo CD or Flux reconciles them, a cloud controller provisions infrastructure, and a model server answers inference requests.

The word OCI covers several related but different artifacts here, and five source documents name the roles differently. This catalog's own doctrine names four: a source or installer package, a literal configuration bundle, a portable deployment bundle, and a ConfigHub release bundle. Read that four-row table.

The literal upload bundle and the portable deployment bundle can carry the same Kubernetes objects in different OCI layer layouts. The consumer decides which layout it needs, so check the package you produce against the consumer that will use it.

The installer-package guide names three roles instead: an installer package OCI, a rendered OCI, and a ConfigHub release OCI. Read that table. An installer package can offer several presets, a rendered OCI holds one chosen result, and a ConfigHub release OCI holds the later revision after review, approval, or promotion.

The processing-model guide calls OCI the transport, not the processor and not the deployment proof. It names three roles again: a source package OCI, a literal configuration OCI, and a ConfigHub release OCI. Read that table. These artifacts can hold related objects but carry different manifests and digests, so a receipt names both identities rather than treating unlike digests as one.

The deployment guide narrows to the two artifacts a user meets directly: an installer-package OCI and a ConfigHub Space release OCI. Read that table. An installer package can offer several preset configurations, a Space release holds one selected and reviewed configuration, and an installer-package URL is never a Space-release URL.

A separate roadmap note adds a fifth table. It names a fourth role most others skip: a runtime image OCI, the application, model server, agent runtime, or sandbox image Kubernetes actually runs. Read that table. That image has a different job from every configuration shape below it, and the site must not use the word OCI as if every artifact had the same job.

Nine shapes, side by side

Every claim in this table cites its own source doc. Where a fact is missing, the cell says so instead of guessing.

ShapeMedia typeLayoutProducerConsumerRegistrySigned by
Installer / source package OCINot named; a multi-file OCI image (installer.yaml, presets, records/)installer.yaml plus preset configs plus records/ (source-and-intent and Helm-render-intent files)The catalog publisher, with npm run installer-oci:publishcub installer setup --pull, cub installer inspectGoogle Artifact Registry, public readYes: a dedicated Google service account, Sigstore keyless
Literal configuration bundle (upload layout)Not namedKubernetes YAML laid out for per-file ingestion; a different layout from the row below even for the same objectsNot named as one command in these docscub variant upload oci://…Not namedNot stated
Portable deployment bundle (rendered OCI)Not named; described as “a standard OCI content layer”One selected preset's exact non-secret Kubernetes objectscub installer setup --output-ociArgo CD, Flux, an anonymous pull, or cub variant uploadA local OCI layout, or an oci://host/repo:tag referenceNot stated
ConfigHub release bundle (Space release OCI)Not namedThe exact reviewed Units from one ConfigHub Spacecub release publish <space>Argo CD, Flux, or another ConfigHub delivery pathoci://oci.hub.confighub.com:443/space/<space>Not stated
Certified bundleapplication/vnd.confighub.config.bundle.v1One gzipped, byte-reproducible tar layer: sorted names, zeroed owners, epoch timestampscub config check --out oci://…, cub app check --out oci://…cub config verify, then cub variant upload --granularity per-fileToday: provider-specific paths on two registries. Proposed: a stable oci://catalog.confighub.com/… endpointOpen item: keyless cosign for a user's own output, the catalog's own key for its own
Bundle receipt (referrer record)application/vnd.confighub.record.v1+jsonOne JSON record, attached to the bundle's manifest digest as a referrerThe same command that pushes the bundle it describescub config verify, oras discoverThe same registry as the bundle it describesNot stated separately from the bundle
Stack indexAn OCI image index; no dedicated type namedEntries are component bundles by digest; the manifest and certify verdict attach to the index digestcub stack publish <name> --out oci://…Today: the Catalog itself. Planned: cub stack sandbox oci://…index@sha256:…Wherever --out oci://… pointsNot stated; the verdict is a record, not a signature
Stack release (flattened stack image)Not namedThe whole stack rendered into one manifest, not an indexcub stack sandbox <name> --out oci://…A reconciler; it pulls one manifestWherever --out oci://… pointsNot stated
Runtime image OCINot namedNot detailed in these docsNot named; built outside this catalogKubernetes, as the workload it runsNot discussed in these docsNot addressed by this catalog's signing scheme

Here is what the command does. cub installer is an open-source plugin for the cub CLI. cub installer setup pulls a catalog package and writes its Kubernetes files locally, leaving delivery to kubectl, Argo CD or Flux. The generated scripts stop before doing any work when the plugin or kustomize is missing.

Which consumer needs which layout

  • cub installer setup --pull and cub installer inspect need the installer-package layout, row one above.
  • cub variant upload oci://… needs the literal-configuration-bundle layout, row two, or a certified bundle ingested with --granularity per-file, row five.
  • Argo CD, Flux, an anonymous pull, or oras and kubectl need the portable-deployment-bundle layout, row three.
  • cub config verify needs the certified-bundle layout with its receipt attached as a referrer, rows five and six.
  • A reconciler that pulls one manifest for a whole stack needs the flattened stack-release layout, row eight.
  • The Catalog itself, or a future index-aware puller, needs the stack-index layout, row seven.

2. See how a certified bundle and a stack become one artifact

One shape carries this catalog's own certified bundles: an OCI artifact of type application/vnd.confighub.config.bundle.v1, whose layer is a reproducible tar.gz of rendered configuration. Its receipt attaches to the same digest as a referrer, of type application/vnd.confighub.record.v1+json. Read the design center's definition.

Verified means the bundle was pulled by digest, every listed file was re-hashed against the receipt, and the layer bytes matched. cub config verify does those three checks today. A signature is checked only where one is present, and signing itself remains an open item, covered below.

Three forms share one digest rule. A variant is a single image: one component at one recorded set of inputs. A stack is an index of images, with its manifest and certify verdict attached to the index digest. A release is a flattened image, because a reconciler pulls one manifest, not an index. Read the full definitions.

One receipt links the three forms. The identity of a certified bundle is always its OCI manifest digest, and the object-set hash lives inside the receipt. It never substitutes for the manifest digest.

The stack manifest itself is a source file, and its published form is the index in row seven above. cub stack publish produces that index, and cub stack sandbox --out oci://… produces the flattened release in row eight. Read the full section. The Catalog holds indexes, not manifests, and a receipt links the index to its release.

Every digest, and what it pins

Five records can identify one configuration journey, and their hashes never identify the same bytes. Read the source table.

IdentityWhat it pinsExample
Base-revision digestThe complete base record, including source inputs and processing contextA Helm variant-revision digest, or an AICR platform-index digest
Exact-object digestThe accepted Kubernetes object set, or the inventory that pins every object filerenderedObjectSetSHA256 for a Helm revision
OCI manifest digestOne transported artifact manifest; a source package OCI and a literal configuration OCI carry different roles and digestsThe digest a registry returns
ConfigHub data hashOne retained Unit revisionThe hash reported for a ConfigHub Unit
Release OCI digestThe immutable artifact published from one reviewed ConfigHub Space revisionThe digest Argo CD or Flux consumes

A receipt binds two of these identities by naming both and comparing the exact objects between them. It never calls unlike digests the same digest.

Where the receipt lives is still an open question

Two planning documents disagree about where a certified bundle's receipt belongs. The design center attaches it to the same digest as a referrer, discoverable through the OCI registry's own referrers API. Read that definition.

The certified-bundle spec instead says the catalog emits a receipt beside each published bundle, a separate committed record rather than an OCI-native referrer. Read that passage. This page records the disagreement rather than resolving it.

3. See what a signature actually proves, and check one yourself

Every currently published installer package has a committed publication receipt, and the Google Artifact Registry repository grants roles/artifactregistry.reader to allUsers. Read the full access note.

A user can run cub installer inspect or cub installer setup --pull against the public catalog refs with no Google Cloud credentials. Write access stays private, so maintainers still need registry credentials to publish or replace a package.

A successful cosign verify proves four things. The named service account signed the exact OCI manifest digest. The signed payload records the expected package path and package SHA-256. The registry served the signature with no credentials when the receipt was written, and Sigstore recorded the signing event. Read the full list.

It does not show that a selected preset is suitable for a particular cluster. It also does not prove that a hook, CRD, Secret, or later rollout will succeed.

What is signed today

ShapeSigned today?Mechanism
Installer / source package OCIYesSigstore keyless cosign, a dedicated Google service account identity
Literal configuration bundleNot statedNot discussed in these docs
Portable deployment bundleNot statedNot discussed in these docs
ConfigHub release bundleNot statedNot discussed in these docs
Certified bundleOpen itemKeyless cosign for a user's own output, the catalog's own key for its own; the mechanism already runs in CI for other artifacts
Bundle receipt (referrer record)Not stated separatelyNot discussed in these docs
Stack indexNot statedThe certify verdict is a record, not a signature
Stack releaseNot statedNot discussed in these docs
Runtime image OCINot addressed hereOutside this catalog's signing scheme

Choose the right verify command

Four commands check different OCI shapes, and none of them substitutes for another.

  1. Have an installer-package ref? Run cub installer inspect <ref> --json first, to confirm the manifest and layer digests the publication receipt recorded.
  2. Then run cosign verify with the identity, issuer, and annotations from the chart page, to confirm the named service account signed that exact digest.
  3. Have a certified-bundle ref? Run cub config verify oci://…@sha256:…. It pulls the bundle, finds its receipt, and re-hashes every listed file; it checks a signature only where one is attached.
  4. Have the downloadable package index? Run cosign verify-blob --bundle packages.sigstore.json … against the committed index signature.

These four commands cover the shapes listed above them. A ConfigHub release bundle, a stack index, a stack release, and a runtime image have no matching command here, because these docs describe no signing for those shapes.

4. See how other tools already produce these shapes

The stack manifest is not the first tool to compose OCI-referenced configuration. Three tools already overlap with it directly. Read the full comparison.

Timoni

Timoni already ships OCI-referenced module bundles, a format this catalog already lists as one of its entries. The stack-manifest design calls it a natural producer for the manifest itself.

AICR

AICR is a manifest emitter rather than a competing format. Its profile-owned values and its refuse-on-conflict rule map onto the stack manifest's bindings and verdict, and its platformDigest is the same primitive as the composition digest.

Kubara

Kubara's own adoption step already compiles one OCI package per component and one digest-bound platform index, with destination bindings and secrets excluded from the portable packages. That index is a producer-private stack manifest. Its component packages match the components list here, and its platformDigest is the same primitive as the composition digest.

Stacks and fleets keeps the two stack OCI forms and the certify step that judges them before either is built. Run it with Flux, Argo CD, or kubectl carries the Argo CD 3.x and 2.x specifics and the exact manifests each controller needs.

The OCI shapes here are defined once. Config is the lifecycle model, Variants decides where a change belongs, and Stacks and fleets composes bundles into a platform.