Coming from Helm? How your habits map to cub

A repository document, rendered for the site. View source markdown.

New to cub? Install the cub CLI first. You can pull and render public catalog packages without an account. Commands that save or change ConfigHub data require you to sign in.

Generated at: 2026-07-30T12:38:02.000Z UTC · source: committed helm-expt evidence for this rendered repository document.

UNOFFICIAL/EXPERIMENTAL. A Helm-fluent dev's cheat-sheet. cub installer uses declared, typed inputs and named bases - not free-form --set - so a little muscle-memory translation is needed. The good news: cub safely rejects Helm idioms (it never silently mishandles them); the gap this page fills is the migration guidance cub's error messages don't yet give you (measured in the Helm-fluent-migrant friction lane: every Helm idiom is rejected, but with a generic "unknown flag/input" and no hint toward the cub way).

The one big difference

The cheat-sheet

In Helm you'd…cub's error todayDo this in cub instead
--set replicaCount=3unknown flag: --set--input replicaCount=3 if it's a declared input (cub installer doc); otherwise choose/author a --base, or edit the base
-f values.yaml / --values v.yamlunknown shorthand flag: 'f'cub has no values-file flag - pass declared values as --input k=v (repeatable), or author a base variant that bakes in your values
--set image.tag=v2unknown flag: --set--set-image <name>=<ref> (the base must declare an images: block)
--set-string key=valunknown flag: --set-string--input key=val - inputs are typed by the package, so no --set-string needed
--set-file key=cert.pemunknown flag: --set-fileprovide it as a declared input or a staged target fact (e.g. an existing Secret)
--set nested.deep.path=x for a path the chart exposes but the package doesn'tunknown input "nested.deep.path"that path isn't an exposed input - pick a --base that customizes it, or edit/author the base (the change becomes reviewable config-as-data)
--set arr[0]=x (array index)unknown input "arr[0]"set the whole structured value via a declared input, or in the base
helm install NAME chart (release name)n/a - different modelcub renders into a --namespace; the "name" is the ConfigHub space / unit, not a Helm release

What the managed setup guidance should say

The managed setup guidance proof records five common Helm habits and the plain-language hint a user should get. This is the adoption bar: safe rejection is not enough when the user is trying something normal from Helm.

User triesBetter guidance
--set replicaCount=2cub has no --set. Declared values use --input KEY=VALUE; run cub installer doc <pkg> to see the inputs. Values that are not declared belong in a base.
--values values.yaml or -f values.yamlcub has no values-file flag. Choose, edit, or author a base variant instead of passing a Helm values file at runtime.
--set-string image.tag=7.4Use --set-image when the package declares images; otherwise make the image change in the base.
--input replicaCount=2 but the input is not declaredThe hard error is intentional. Confirm the input exists, or edit the base so the change is visible as config.
A base bakes a placeholder passwordTreat it as a demo placeholder. The safer default is an existing-secret or reuse-existing-secret base; stage your own Secret before apply.

Source: managed setup guidance.

Why cub works this way (the upside of the friction)

The declared-input model is what makes cub catch the typo footgun Helm silently absorbs - in the careless-dev fuzz, Helm swallowed ~66% of bad --set keys with no error; the same key as a cub --input is a hard unknown input. And because customization is a declared input, a named base, or a base edit, your change is reviewable config-as-data before it reaches a cluster, instead of a transient flag. The cost is this translation step - which is why this page (and, ideally, guidance baked into cub's own error messages) exists.

Quickest path

  1. cub installer doc <pkg> - see the bases and the exact declared inputs.
  2. Use --base <name> to pick a variant, --input <name>=<value> for declared inputs, and --set-image <name>=<ref> for image overrides.
  3. Anything else: edit or author a base (config-as-data) rather than spraying --set.

→ see also: choosing-commands · cub-deployment-path · how-it-works