Get a stack
You want a stack — a set of configs checked for conflicts before they render. Here is how you get one.
1. Want a ready-made one?
Pick a shipped stack and certify it in one command. cub stack sandbox eks-inference renders 130 objects from eight certified bundles, each hash-verified against its receipt. Thirteen ship, from a full inference platform to three services; see the stacks that ship.
2. Already have a Kubara platform?
Turn its own output into a stack with cub stack from-kubara ., rendered with the values Kubara generated, so certify judges the platform you actually have. Build a platform walks the whole Kubara adoption journey, generate to deploy.
3. Composing your own?
Author a manifest from catalog parts by digest, or let an assistant propose one from images that already exist and were checked. Then run cub stack certify until it holds together; see the manifest and the loop.
4. Ready to run it with a team?
Upload the stack, place it on clusters, then promote and gate it in ConfigHub. That is where a stack becomes a platform. The taxonomy note sets out these paths in full.
What a stack is
A stack is a set of parts named in one manifest and checked before any of it runs. A platform is what a stack becomes once it is running under governance with your apps on it. A fleet is that stack and its apps placed across many clusters as data. So a stack is what you get and certify, a platform is the outcome once it runs, and each cluster in a fleet becomes its own platform when it runs.
An app, in turn, is “a workload you bring,” as Apps on a platform defines it. Upload, place, govern below is how an app's stack becomes the platform it runs on.
Stacks span a wide range. One provisions a cloud network, a cluster, and a GPU runtime from an empty account. Another is three services on a cluster you already run. The plane on each component, hub, mgmt, or workload, is how a manifest says which level it works at. The list further down is sorted by that level, not flat.
An AICR-generated AI platform is a stack in this same sense, composed from Argo CD Applications instead of a manifest here. Try AICR inspects one without a GPU.
Creating a stack: the manifest and the loop
A stack manifest names its components. Each component is either a bundle pinned by digest with a receipt, or a render or authored file of rendered objects the stack owns. A bundle is pulled once and hash-verified against its receipt before a single object parses.
Each component carries a plane, its altitude, and an order that sequences it within that plane so CRDs land before the resources that use them. Bindings between components live in the manifest too, so upload builds the links from data.
There is no continuous validation. It is a loop: edit the YAML, run cub stack certify <file>, read what it names wrong, fix it, run again. Certify is the contract you build against. Read the manifest specification.
What certify checks
Resource conflicts
No two components may claim the same object. This is the hard failure, and it exits non-zero.
CRD before CR
Every custom resource's CRD must be present and delivered first, across components.
Admission webhooks
Which webhooks need a certificate, and whether cert-manager is in the stack to issue it.
Namespaces
Which namespaces the stack creates, and which must already exist before it lands.
What each app needs
An app's own objects say what the platform must carry: an ingress controller that answers to its class, cert-manager, a Prometheus operator, external-secrets. A stack that lacks one is refused, and the message names the fix.
Two shipped stacks exist to be refused. metrics-double carries two copies of metrics-server that claim the same nine objects. conflict-demo carries two authored components that define one ConfigMap differently.
The stacks that ship, by altitude
A full stack, cloud to workload
| Stack | Composed from | Result |
|---|---|---|
| eks-inference | eight digest-pinned certified bundles across all three planes: a cloud network, an EKS cluster, node autoscaling, a GPU runtime, and the inference workload | CERTIFIED, 130 objects |
Platform services on a cluster you already run
| Stack | Composed from | Result |
|---|---|---|
| kubara-platform | the catalog's certified renders for a Kubara platform | CERTIFIED, 86 objects |
| kubara-shop-platform | the Kubara platform grown by external-secrets, with the app adapted to Traefik's class | CERTIFIED, 135 objects, every app need carried |
| web-platform | cert-manager, ingress-nginx, kube-prometheus-stack | CERTIFIED; carries what an app like shop-web depends on |
| observability-base | cert-manager, metrics-server, kube-prometheus-stack | CERTIFIED, 175 objects, 10 CRDs before 50 custom resources |
| gitops-secrets | cert-manager, external-secrets, argo-cd | CERTIFIED, 26 CRDs composed together |
| data-services | redis, postgresql, rabbitmq | CERTIFIED, 31 objects, no CRDs |
| app-platform | database, cache, ingress, certificates, and monitoring | CERTIFIED |
| redis-platform | redis, external-secrets, kube-prometheus-stack | CERTIFIED |
| web-tiny | two authored ConfigMaps, sized for a live upload | CERTIFIED |
Made to be refused, to show the gate
| Stack | Composed from | Result |
|---|---|---|
| kubara-shop-first-try | the Kubara platform as first picked, with the shop app placed on it | REJECTED: the app asks for the nginx ingress class and a Prometheus operator, and the platform carries neither |
| metrics-double | metrics-server, twice | REJECTED: nine objects claimed twice |
| conflict-demo | two authored components, one ConfigMap defined two ways | REJECTED |
The bundle-form stacks pull from public registries by digest. The render-form stacks ship inside the plugin, so they certify offline.
Adapting a stack
Adaptation happens in two places, and neither needs a new verb.
You adapt by hand before you upload. When certify refuses, change either side. Adapt the app, its ingress class or a secret it pulls, or grow the platform by the service the app needs. Re-run certify until it passes. The app and the platform negotiate through certify, and the platform ends up shaped by its apps. The kubara-shop-first-try refusal above becomes kubara-shop-platform this way.
You adapt again in ConfigHub, after upload. Variants explains when that is a new base and when it is a derived variant. See the operate verbs.
Becoming a platform: upload, place, govern
cub stack upload <name> --run certifies first, then builds one base Space per component in ConfigHub and the links the manifest declares. Without --run it prints the plan and changes nothing. From there ConfigHub's own verbs take over: cub variant create places a base on a target, cub release publish releases it by digest, and cub variant promote moves a reviewed change up the tree.
A fleet places a stack across many clusters as data. cub fleet up meridian scaffolds ten regional cluster Spaces, uploads twenty component bases, and places and releases their deployments through those same governed verbs. cub fleet status meridian then recomputes four attention tiles, blocking gates, unreleased changes, upgrades available, and outstanding rollouts, from the queries the product runs. The fleet model is specified alongside the stack manifest.
A stack can also leave as OCI with no account. cub stack publish <name> --out oci://… publishes it as an index of images with the manifest and verdict attached, and cub stack sandbox <name> --out oci://… publishes the flattened form a reconciler pulls. Every result is an image. See every OCI shape in one table.
What you can do with the workshop plugin
Config's tool table introduces the plugin as one free path. Here is its full command surface, from a first check to a fleet.
| Level | Do this | Command | What you get |
|---|---|---|---|
| Basic | See what a chart installs | cub config check redis | The objects, what the chart hides, and what the cluster must already have. |
| Basic | See what an app needs from its platform | cub app check shop-web | The services the app's own objects ask for: an ingress controller, cert-manager, an operator. |
| Basic | Certify and render a stack | cub stack sandbox kubara-shop-platform | CERTIFIED or REJECTED, with every check named, and the rendered objects. No cluster. |
| Basic | See a refusal | cub stack certify kubara-shop-first-try | The two reasons the shop app cannot run on the platform as first picked. |
| Advanced | Hand a check on as a verified image | cub config check redis --out oci://REGISTRY/redis:v1cub config verify oci://REGISTRY/redis@sha256:… | An image with its receipt attached, and a verify that refuses an image with no receipt. |
| Advanced | Publish a stack as an index | cub stack publish shop-platform --out oci://REGISTRY/shop-platform:v1cub stack certify oci://REGISTRY/shop-platform@sha256:… | One image per part under one index digest, certifiable straight from the registry. |
| Advanced | Upload a certified stack into ConfigHub | cub stack upload kubara-shop-platform --run | A base Space per part, one Unit per file, linked the way the manifest says. |
| Advanced | Build a fleet from a manifest | cub fleet plan demo-platformcub fleet up demo-platformcub fleet status demo-platform | Clusters, bases, deployments, and releases for every placement, then four tiles: gates, unreleased, upgrades, rollouts. |
Fleet operations live here too. cub changeorder create traefik-wave --space traefik-base --in-scope-space traefik-demo-dev,traefik-demo-staging --description "…" rolls one change across every Space in its scope, and cub fleet status reports the same gates, unreleased changes, upgrades, and rollouts for the whole fleet.
Fleet status, gates, and rollouts sit here rather than on the Operations page, because a fleet is a stack placed across many clusters, and stack is where that noun is defined. Operate keeps the single-target verbs: release, promote, gate, and roll back.
Run it
These four run here. The ten-minute demo walks all of them end to end, from one chart to a governed fleet.
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.
$ cub plugin install confighub/cub-workshop
# CERTIFIED, 130 objects, no cluster
$ cub stack sandbox eks-inference
# REJECTED: nine objects claimed twice
$ cub stack certify metrics-double
# a real Kubara platform, as a certified stack
$ cub stack from-kubara ./my-kubara-platform
# an index of images
$ cub stack publish shop-platform --out oci://REGISTRY/shop-platform:v1
Every manifest on this page ships in the plugin: the stacks directory, with eks-inference as the worked example and the ten-minute walkthrough. The site links these files and never copies them, so the file you read is the file the plugin runs.
Receipts and boundaries
The eks-inference sandbox receipt · The composition verdict · The certified-bundle receipts · The plugin repository and its ten-minute walkthrough
The four nouns are proposed verbs packaged as a prototype; ConfigHub's own verbs underneath are released. The composition verdict runs here as the plugin's certify step and in the repository as a regression gate. As a gate inside the ConfigHub product it remains proposed, and this page does not claim otherwise.