Browse Stacks
Catalog
Config
Stacks
Operate
Docs

Compose, certify, place

Build a stack from certified parts

Free until upload

Combine components into custom stacks and application platforms. A stack is a set of charts and YAML named in one manifest and checked for conflicts before it renders. A fleet says which stacks and apps land on which clusters. Both run today as a cub plugin.

Certify and sandbox need no cluster and no account. Upload and the fleet verbs need a ConfigHub organization you can write to.

no clusterno account to certifyreceipts for every stack
one install, three commands
$ cub plugin install confighub/cub-workshop

$ cub stack sandbox eks-inference
  [PASS] no resource conflicts across components (130 objects)
  [WARN] 2 object(s) carried more than once inside one component with identical content; the last occurrence wins at apply:
      apiextensions.k8s.io/v1|CustomResourceDefinition||fieldexports.services.k8s.aws  x3  inside  ack-controllers
      apiextensions.k8s.io/v1|CustomResourceDefinition||iamroleselectors.services.k8s.aws  x3  inside  ack-controllers
  [PASS] CRD ordering: 46 CRDs are delivered before the 25 custom resources that need them
  [PASS] no admission webhooks need a certificate
  [PASS] namespaces: 4 created, 1 must already exist (kube-system)
  => CERTIFIED
  130 objects total

$ cub stack certify metrics-double
  [FAIL] 9 resource conflict(s) - the same object is claimed by more than one component:
      rbac.authorization.k8s.io/v1|ClusterRoleBinding||metrics-server:system:auth-delegator  <=  metrics-server + metrics-server-again
  => REJECTED

Certify is a hard gate. It rejects metrics-double and exits non-zero because two of its components claim the same nine objects. The warning on eks-inference is different. Identical CRDs carried more than once inside one component are not a conflict, so it still certifies.

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

StackComposed fromResult
eks-inferenceeight digest-pinned certified bundles across all three planes: a cloud network, an EKS cluster, node autoscaling, a GPU runtime, and the inference workloadCERTIFIED, 130 objects

Platform services on a cluster you already run

StackComposed fromResult
kubara-platformthe catalog's certified renders for a Kubara platformCERTIFIED, 86 objects
kubara-shop-platformthe Kubara platform grown by external-secrets, with the app adapted to Traefik's classCERTIFIED, 135 objects, every app need carried
web-platformcert-manager, ingress-nginx, kube-prometheus-stackCERTIFIED; carries what an app like shop-web depends on
observability-basecert-manager, metrics-server, kube-prometheus-stackCERTIFIED, 175 objects, 10 CRDs before 50 custom resources
gitops-secretscert-manager, external-secrets, argo-cdCERTIFIED, 26 CRDs composed together
data-servicesredis, postgresql, rabbitmqCERTIFIED, 31 objects, no CRDs
app-platformdatabase, cache, ingress, certificates, and monitoringCERTIFIED
redis-platformredis, external-secrets, kube-prometheus-stackCERTIFIED
web-tinytwo authored ConfigMaps, sized for a live uploadCERTIFIED

Made to be refused, to show the gate

StackComposed fromResult
kubara-shop-first-trythe Kubara platform as first picked, with the shop app placed on itREJECTED: the app asks for the nginx ingress class and a Prometheus operator, and the platform carries neither
metrics-doublemetrics-server, twiceREJECTED: nine objects claimed twice
conflict-demotwo authored components, one ConfigMap defined two waysREJECTED

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.

LevelDo thisCommandWhat you get
BasicSee what a chart installscub config check redisThe objects, what the chart hides, and what the cluster must already have.
BasicSee what an app needs from its platformcub app check shop-webThe services the app's own objects ask for: an ingress controller, cert-manager, an operator.
BasicCertify and render a stackcub stack sandbox kubara-shop-platformCERTIFIED or REJECTED, with every check named, and the rendered objects. No cluster.
BasicSee a refusalcub stack certify kubara-shop-first-tryThe two reasons the shop app cannot run on the platform as first picked.
AdvancedHand a check on as a verified imagecub config check redis --out oci://REGISTRY/redis:v1
cub config verify oci://REGISTRY/redis@sha256:…
An image with its receipt attached, and a verify that refuses an image with no receipt.
AdvancedPublish a stack as an indexcub stack publish shop-platform --out oci://REGISTRY/shop-platform:v1
cub stack certify oci://REGISTRY/shop-platform@sha256:…
One image per part under one index digest, certifiable straight from the registry.
AdvancedUpload a certified stack into ConfigHubcub stack upload kubara-shop-platform --runA base Space per part, one Unit per file, linked the way the manifest says.
AdvancedBuild a fleet from a manifestcub fleet plan demo-platform
cub fleet up demo-platform
cub 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.