Use this path when you already have an OCI package containing Kubernetes objects and need to make a small, reviewable change. You do not need a ConfigHub account, ConfigHub Server, or a Kubernetes cluster. You can also view this as a markdown file.
The command pulls the package, changes one named field, runs checks, and writes a new local OCI image. It records the input digest, the old and new values, and the check results inside the output image. It then pulls the new image back and compares the objects and records.
This is useful before ConfigHub as well as beside it. A team can run the command locally or in CI, inspect the result, and decide later whether to publish the image, upload it to ConfigHub, or deploy it with an existing controller.
Before you change it
First identify what the OCI contains:
npm run oci:inspect -- oci://REGISTRY/REPOSITORY:TAG
The OCI inspection guide explains the package roles. oci:transform accepts a literal Kubernetes configuration OCI. A Helm source chart or cub installer package must be rendered first.
Change one field
This tested example starts with five reviewed NGINX objects and changes the Deployment from three replicas to four:
Anonymous registry access is the default. The command gives ORAS an empty credential file. Use --registry-config FILE only when the input is private.
--value accepts JSON values. Numbers, booleans, strings, arrays, and objects are supported. The field must already exist. The command will not silently add an unknown path, add or remove Kubernetes objects, or change more than the one field you named.
What the output contains
The new OCI image has four readable files:
File
Purpose
manifests/release-objects.yaml
The complete changed Kubernetes object set.
records/source.json
The input reference, resolved digest, object hash, and any context you supplied.
records/change.json
The object, field, old value, new value, and before/after object hashes.
records/checks.json
The decision and every pass, warning, or failure.
If the input already contains companion records, they are retained under records/input/. A second change therefore keeps the records from the first change instead of replacing them.
The current checks reject malformed objects, duplicate object identities, obvious placeholder values, and a change that affects anything outside the named field. They also report unpinned container images, missing probes, and external Secret references. CRDs, Jobs, and Helm hook annotations produce a lifecycle warning so that install order and execution still receive a separate review.
The NGINX example passes with one warning because the target must provide the nginx/ai-provider-credentials Secret. The warning is stored in the output image.
What happens next
The command creates a local OCI image layout. It does not publish or deploy it. From there you can:
inspect the changed YAML and records;
push the image to a registry with an authenticated tool;
upload the literal configuration to ConfigHub as a base variant;
give a compatible deployment bundle to Argo CD or Flux; or
discard it and leave the input unchanged.
These are separate actions because they have different permissions and consequences.
Proof and limits
The anonymous OCI-to-OCI receipt records the public input digest, exact replica change, check results, output digest, and pull-back comparison.
That reviewed output is also published as a permanent public example:
Read the publication and ConfigHub import summary for the recorded digest, anonymous pull-back, companion-record checks, and exact ConfigHub object comparison. A separate GitHub Actions job repeats the public source pull with no ConfigHub credentials.
Direct ConfigHub import of an OCI with companion JSON records needs the fix in confighub/sdk PR #11. The fix is included in cub v0.2.6 and later. Run cub upgrade before importing this OCI with an older client.
The proof does not claim cluster admission, controller reconciliation, workload health, or a signed provenance chain. Your own command still creates a local OCI layout until you publish it deliberately.
Use this entry in ConfigHub
Every Catalog entry page carries these five steps in this order. Each step says what the Catalog has run for this entry, and a step with a missing precondition gives no command.
Steps 1 and 2 need no account. Install the cub CLI before any cub command. A live run on 2026-10-08 used these cub variant commands on other configuration, with no Target. It is not a run for this entry. This block is for configuration-oci-nginx-replicas-4, which has no page of its own.
What is fixed, and what you supply
Fixed when this entry was built. These went into the build, so the objects already carry them. To change one, build the entry again from its source.
source is oci://europe-west1-docker.pkg.dev/nth-fort-499605-q5/helm-expt/nginx-replicas-4@sha256:aa58e2a9d120d09f029fdef80596225f8c44d0aa629b18766fe8b6694659f518
artifactType is application/vnd.confighub.kubernetes.config.v1
change is Deployment/nginx spec.replicas 3 -> 4
Yours to supply or check. The destination must have these before the objects are applied. The words in italics say what the Catalog knows about each.
The Deployment references this Secret; the credential is not stored in the public OCI. Declared. Not checked on any destination.
This entry's plan, and how to test it
The record lists no plan step for this entry.
Test the plain objects yourself.This script tests the retained objects themselves with kubectl, and it needs no cub and no account. Read it first and use a throwaway cluster. The Catalog has no recorded run of this script.
The Catalog retains its 5 objects in one file, exactly as supplied.
# fetch the retained objects for this entry$ curl -fsSL -o configuration-oci-nginx-replicas-4.yaml https://raw.githubusercontent.com/confighub/helm-expt/main/examples/anonymous-oci-transform/reviewed-output/manifests/release-objects.yaml
# check the bytes against the listing$ shasum -a 256 configuration-oci-nginx-replicas-4.yaml
602f340e5130f7041df5f21f6e358246d988d6945cd23f50ae2de4ca59647c72 configuration-oci-nginx-replicas-4.yaml
2. Compare with another version or base Not available yet
The Catalog holds no other version or base of this entry's source in the same format. A second entry for nginx-replicas-4 in this format would give this step a sibling.
3. Upload it as a variant Run for this entry
The Catalog saved this entry in ConfigHub. The commands use its published literal configuration bundle. Read the receipt.
# sign in; steps 3 to 5 write to your ConfigHub organization$ cub auth login
# preview the upload of the published bundle; nothing is written$ cub variant upload --dry-run --component nginx-replicas-4 --variant replicas-4 --space configuration-oci-nginx-replicas-4 oci://europe-west1-docker.pkg.dev/nth-fort-499605-q5/helm-expt/nginx-replicas-4@sha256:aa58e2a9d120d09f029fdef80596225f8c44d0aa629b18766fe8b6694659f518
# upload the bundle as a base Space of Units$ cub variant upload --component nginx-replicas-4 --variant replicas-4 --space configuration-oci-nginx-replicas-4 oci://europe-west1-docker.pkg.dev/nth-fort-499605-q5/helm-expt/nginx-replicas-4@sha256:aa58e2a9d120d09f029fdef80596225f8c44d0aa629b18766fe8b6694659f518
4. Deploy it Not run for this entry
No delivery run is recorded for this entry. Argo CD has not run, Flux has not run, and kubectl has not run. The commands name the Target workshop/target, which cub cluster up --name workshop creates on a local kind cluster with Argo CD. Use your own Target for a real destination. The listing records one input that the destination must supply, so read it before you deploy.
# clone the base onto a Target as a dev variant$ cub variant create dev configuration-oci-nginx-replicas-4 --target workshop/target --space-pattern "template:configuration-oci-nginx-replicas-4-dev"
# publish the Release that Argo CD or Flux pulls$ cub release publish configuration-oci-nginx-replicas-4-dev
5. Promote a change Not run for this entry
No promotion is recorded for this entry. Promotion carries a change in the base to the dev variant. The base changes when you edit a Unit or upload a newer version into the same Space.
# preview what the dev variant would take from the base$ cub variant promote configuration-oci-nginx-replicas-4-dev --dry-run -o mutations
# promote once you have read the preview$ cub variant promote configuration-oci-nginx-replicas-4-dev --change-desc "Pull the reviewed base forward"
Technical notes and disclaimers
The plain-objects script applies the objects and ends. It does not wait for the workloads to start. The script does not run the steps the plan names for an upgrade or a delete.