Declare groups of module instances and their values in a single CUE file.
Timoni bundles offer a declarative way of managing the lifecycle
of applications and their infra dependencies.A Timoni bundle is a CUE file for defining a group of instances
together with their values and module references.
Example
The following is an example of a Bundle that defines a Redis
master-replica cluster and a podinfo instance connected to the Redis instance.
For the above example, Timoni performs the following actions at apply time:
Validates that the Bundle definition is in conformance with the API version specified by apiVersion.
For each instance, it fetches the module version from the registry using the module.url
as the artifact repository address and the module.version as the artifact tag.
Creates the Kubernetes namespaces if they don’t exist.
For each instance, it builds, validates and creates the Kubernetes resources using the specified values.
The list of managed resources along with the module reference and values are stored in the cluster in a
Kubernetes Secret, in the same namespace with the instance.
If an instance already exists, Timoni performs a server-side apply dry-run to detect changes and
applies only the resources with divergent state.
If previously applied resources are missing from the current revision, these
resources are deleted from the cluster.
Waits for each instance’s resources to become ready.
You can run this example by saving the Bundle into podinfo.bundle.cue.Apply the Bundle on the cluster:
command
output
timoni bundle apply -f podinfo.bundle.cue
applying instance redispulling oci://ghcr.io/stefanprodan/modules/redis:8.10.1using module timoni.sh/redis version 8.10.1installing redis in namespace podinfoNamespace/podinfo createdapplying masterServiceAccount/podinfo/redis createdConfigMap/podinfo/redis createdService/podinfo/redis createdDeployment/podinfo/redis-master createdPersistentVolumeClaim/podinfo/redis-master createdwaiting for 5 resource(s) to become ready...resources are readyapplying replicaService/podinfo/redis-readonly createdDeployment/podinfo/redis-replica createdwaiting for 2 resource(s) to become ready...resources are readyapplying instance podinfopulling oci://ghcr.io/stefanprodan/modules/podinfo:6.14.0using module timoni.sh/podinfo version 6.14.0installing podinfo in namespace podinfoServiceAccount/podinfo/podinfo createdService/podinfo/podinfo createdDeployment/podinfo/podinfo createdwaiting for 3 resource(s) to become ready...resources are ready
Build the Bundle and print the resulting Kubernetes resources for all the Bundle’s instances:
List the managed resources from a bundle and their rollout status:
command
output
timoni bundle status -f podinfo.bundle.cue
last applied 2024-03-03T20:21:19Zmodule oci://ghcr.io/stefanprodan/modules/redis:8.10.1digest: sha256:4f377b66fd6d608f6a347bbef5b4fcd1aaff3dfa253b1c8437ae8e11fa08b70aServiceAccount/podinfo/redis Current Resource is currentConfigMap/podinfo/redis Current Resource is always readyService/podinfo/redis Current Service is readyService/podinfo/redis-readonly Current Service is readyDeployment/podinfo/redis-master Current Deployment is available. Replicas: 1Deployment/podinfo/redis-replica Current Deployment is available. Replicas: 1PersistentVolumeClaim/podinfo/redis-master Current PVC is Boundlast applied 2024-03-03T20:21:19Zmodule oci://ghcr.io/stefanprodan/modules/podinfo:6.14.0digest: sha256:32082e8ac0bba9ee2a3f95534f52c94f5a41dc642bb396c73b04fa18aff147d7ServiceAccount/podinfo/podinfo Current Resource is always readyService/podinfo/podinfo Current Service is readyDeployment/podinfo/podinfo Current Deployment is available. Replicas: 1
List the instances in Bundle podinfo across all namespaces:
command
output
timoni list --bundle podinfo -A
NAME NAMESPACE MODULE VERSION LAST APPLIED BUNDLEpodinfo podinfo oci://ghcr.io/stefanprodan/modules/podinfo 6.14.0 2024-03-03T16:20:07Z podinforedis podinfo oci://ghcr.io/stefanprodan/modules/redis 8.10.1 2024-03-03T16:20:00Z podinfo
Writing a Bundle spec
A Bundle file must contain a definition that matches the following schema:
The apiVersion is a required field that specifies the version of the Bundle schema.Currently, the only supported value is v1alpha1.
Name
The name is a required field used to track the ownership of instances deployed to a Kubernetes cluster.The name must be a lowercase identifier (alphanumeric characters, -, _ and .,
starting and ending with an alphanumeric character) of at most 63 characters.Note that Bundles should have unique names per cluster, using the same name for different bundles
will result in ownership conflict.
Instances
The instances array is a required field that specifies the list of Instances part of this Bundle.Each instance name (the instances map key) must be a lowercase identifier
(alphanumeric characters, -, _ and ., starting and ending with an alphanumeric
character) of at most 63 characters, as it is used to name the instance’s Kubernetes resources.A Bundle must contain at least one instance with the following required fields:
The instance.module is a required field that specifies the OCI URL, version and/or digest
of the instance’s module.
URL
The instance.module.url is a required field that specifies the source of the module.
It can be either an OCI repository address (preferred) or a local path to a module (useful during development).When using an OCI repository, the url field must be in the format oci://<registry-host>/<repo-name>.When using a Local path, the url field must be in the format file://path/to/module.
Relative pathsRelative paths are always computed relatively to the path of the bundle file containing the value.
Version
The instance.module.version is an optional field that specifies the version number of the module.
The version number must follow Timoni’s semantic versioning.
When not specified, the version defaults to latest, which pulls the module OCI artifact tagged as latest.
Default versionWhen not specified, the version defaults to latest, which pulls the module OCI artifact tagged as latest.
Note that using version: "latest" is not recommended for production system, unless you also specify a digest.
Digest
The instance.module.digest is an optional field that specifies the OCI digest of the module.
When both the version number and the digest are specified, Timoni will verify that the
digest of the pulled module matches the specified instance.module.digest.
The digest is computed from the artifact manifest that Timoni pulled, so the check fails
if the registry serves any content other than the pinned one for that version.
If the version is set to latest and a digest is specified, Timoni will ignore the version
and will pull the module by its OCI digest.
Instance Namespace
The instance.namespace is a required field that specifies the Kubernetes namespace where the instance is created.The namespace must be a lowercase identifier (alphanumeric characters, -, _ and .,
starting and ending with an alphanumeric character) of at most 63 characters.If the specified namespace does not exist, Timoni will first create the namespace,
then it will apply the instance’s resources in that namespace.
Instance Values
The instance.values is an optional field that specifies custom values used to configure the instance.At apply time, Timoni merges the custom values with the defaults,
validates the final values against the config schema and creates the instance.
Values from runtime
The @timoni(runtime:[string|number|bool]:[VAR_NAME]) CUE attribute can be placed next
to a field to set its value from the Runtime.
The Runtime values can come from Kubernetes API and/or from the environment variables,
for more details please see the Bundle Runtime documentation.
Working with Bundles
Install and Upgrade
To install or upgrade the instances defined in a Bundle file,
you can use the timoni bundle apply command.Example:
timoni bundle apply -f bundle.cue
The apply command performs the following actions for each instance:
Pulls the module version from the specified container registry.
If the registry is private, uses the credentials found in ~/.docker/config.json.
If the registry credentials are specified with --creds, these take priority over the docker ones.
Merges the custom values supplied in the Bundle with the default values found in the module.
Builds the module by passing the instance name, namespace and values.
Labels the resulting Kubernetes resources with the instance name and namespace.
Creates the instance namespace if it doesn’t exist.
Applies the Kubernetes resources on the cluster.
Creates or updates the instance inventory with the last applied resources IDs.
Before applying an instance, Timoni validates its custom resources against the
CRD schemas vendored in the module and the CRDs rendered by the instance and by
the earlier instances of the bundle. A violation fails the apply before the
instance is written to the cluster. Use --validate=false to disable the validation.
Diff Upgrade
After editing a bundle file, you can review the changes that will
be made on the cluster with timoni bundle apply --diff.Example:
The values of the Kubernetes Secrets data entries are masked in the diff
output: changed entries are printed as *** (before) and *** (after).When the cluster state is in sync with the bundle definition, the command
exits with code 0. When drift is detected, it exits with code 1, and when
the dry run fails, it exits with code 2. This allows using
timoni bundle apply --diff as a drift check in CI.
Force Upgrade
If an upgrade contains changes to immutable fields, such as changing the image
tag of a Kubernetes Job, you need to set the --force flag.Example:
timoni bundle apply --force -f bundle.cue
With --force, Timoni will recreate only the resources that contain changes
to immutable fields.
Transfer ownership
If an install or upgrade involves Instances already created, either separately or as a part of another Bundle,
the operation will fail.
To transfer ownership to the current Bundle, you need to set the --overwrite-ownership flag.Example:
To list the current status of the managed resources for each
instance including the last applied date, the module url and digest,
you can use the timoni bundle status.Example using the bundle name:
timoni bundle status my-bundle
Example using a bundle CUE file:
timoni bundle status -f bundle.cue
Build
To build the instances defined in a Bundle file and print the resulting Kubernetes resources,
you can use the timoni bundle build command.Example:
timoni bundle build -f bundle.cue
Validation
The custom resources of every instance are validated against the CRD schemas
vendored in the modules and the CRDs rendered by any instance of the bundle, with
the same checks as the Kubernetes API server, see
custom resource validation.
A violation fails the build before anything is written to stdout or to the output
directory. Use --validate=false to disable the validation.To print the manifests without exposing credentials, for example when sharing
the output or reviewing it in a CI log, use the --mask-secrets flag which
replaces the values of Kubernetes Secrets with ***:
timoni bundle build -f bundle.cue --mask-secrets
To write the generated manifests to disk as a directory tree instead of printing them
to stdout, see Export manifests to directory.
Use values from JSON and YAML files
A bundle can be defined in multiple files of different formats:
Timoni extracts the CUE values from the JSON and YAML files,
and unifies them with the bundle value. Note that setting the
same field in multiple files is not supported.Timoni supports the following extensions: .cue, .json, .yml, .yaml.
Uninstall
To uninstall all the instances belonging to a Bundle,
you can use the timoni bundle delete command.Example using the bundle name:
timoni bundle delete my-bundle
Example using a bundle CUE file:
timoni bundle delete -f bundle.cue
Timoni will search the cluster and delete all the instances having
the bundle.timoni.sh/name: <name> label matching the given bundle name.
The instances are uninstalled in reverse order,
first created instance is last to be deleted.
Garbage collection
Timoni’s garbage collector keeps track of the applied resources and prunes the Kubernetes
objects that were previously applied but are missing from the current revision.Example:
timoni bundle apply -f bundle.cue
To prevent the garbage collector from deleting certain
resources such as Kubernetes Persistent Volumes,
these resources can be annotated with action.timoni.sh/prune: "disabled".
Readiness checks
By default, Timoni applies the instances in order, and will wait for
each instance’s resources to become ready, before moving to the next instance.The readiness check is performed for the Kubernetes resources with the following types:
With --timeout, Timoni will retry the readiness checks until the specified
timeout period expires. If an instance’s resource fails to become ready,
the apply command will exit with an error.The readiness check is enabled by default, to opt-out set --wait=false.
Vetting
To verify that one or more CUE files contain a valid Bundle definition,
you can use the timoni bundle vet command.Example:
timoni bundle vet -f bundle.cue -f extras.cue
If the validation passes, Timoni will list all the instances found in the computed bundle.
The command runs without cluster access unless the selected Runtime declares values
that read from Kubernetes resources.With --offline, Timoni does not connect to the clusters and takes the Runtime values
from the environment variables with the same names.
export DB_PASSWORD=dummytimoni bundle vet -f bundle.cue -r runtime.cue --offline --print-value
When a value declared by the Runtime is missing from the environment, Timoni reports it
and uses the Bundle default. The validation fails if the value has no default.
The clusters declared in the Runtime are still evaluated one by one, with
TIMONI_CLUSTER_NAME and TIMONI_CLUSTER_GROUP set for each of them.When --print-value is specified, Timoni will write the Bundle computed value to stdout.
Printing the computed value is particularly useful when debugging runtime attributes.Note that the vet command does not fetch the modules, so the instance values are
not validated against the module schemas. Use timoni bundle build for that.
Update module versions
To update the module versions and digests referenced in a bundle,
you can use the timoni bundle update command. The update policy
is declared per module reference with the @timoni(update:...) attribute:
For the update policies, the --level flag and the CI integration,
see Bundle updates.
Format
To format Bundle files, you can use the timoni fmt command.Example:
timoni fmt bundle.cue
To verify formatting without rewriting the file, e.g. in CI,
use timoni fmt --diff bundle.cue, which prints the pending changes
and exits with a non-zero status if the file is not well formatted.
Referencing local modules
When developing and testing Timoni Modules, you can reference them
from a Bundle file using relative local paths.Example repo structure:
When using local paths, the url field must be in the format file://path/to/module
and the module path is computed relatively to the path of the bundle file location.Note that when using local modules, the module’s version and digest are ignored, as these
are only relevant when pulling modules from a container registry.
All instances created from modules referenced with local paths have
the module version set to 0.0.0-devel.
Export manifests to directory
By default, timoni bundle build prints the resulting Kubernetes resources of all
instances to stdout. To write the manifests as files on disk, use the --output-dir flag.
The files always contain the Secret values, the --mask-secrets flag applies to stdout only.Stdout mode is render-only: every instance is built and marshalled in memory first,
and the complete result is written to stdout in one pass only after all instances
succeed. If the build of any instance fails, no output is written. The exit status
also reflects the final stdout write, so a failed or incomplete write cannot be
reported as success.The instances are built concurrently, with the number of concurrent builds set by the
--concurrency flag. It defaults to the number of CPU cores capped at 8; raising it
can speed up large bundles at the cost of a higher peak memory usage.For example, given a bundle with two instances:
The file names follow the same convention as kustomize build -o <dir>:
<group>_<version>_<kind>_<name>.yaml, lowercased, with the group omitted for
core resources (e.g. v1_service_backend.yaml). When an instance’s resources
span more than one namespace, the file name is prefixed with the namespace
(<namespace>_<group>_<version>_<kind>_<name>.yaml) to avoid collisions.The output directory is created if it does not exist. Existing files with the same
name are overwritten, but files that are no longer generated are not removed,
so you may want to point --output-dir at a clean directory.
Was this page helpful?
{"docsConfig":{"theme":"aspen","$schema":"https://mintlify.com/docs.json","name":"Timoni","description":"Timoni is a package manager for Kubernetes powered by CUE lang.","colors":{"primary":"#7e56c2","light":"#a98be0","dark":"#6500b0"},"logo":{"light":"https://mintcdn.com/timoni/8xOqj2ulwazG1u2D/images/logo_text_black.svg?fit=max\u0026auto=format\u0026n=8xOqj2ulwazG1u2D\u0026q=85\u0026s=85ffbf62ec541a621a19255513199222","dark":"https://mintcdn.com/timoni/8xOqj2ulwazG1u2D/images/logo_text_white.svg?fit=max\u0026auto=format\u0026n=8xOqj2ulwazG1u2D\u0026q=85\u0026s=89788f7e520a7c81896a693804eb502d","href":"/"},"favicon":"https://mintcdn.com/timoni/8xOqj2ulwazG1u2D/images/favicon.png?fit=max\u0026auto=format\u0026n=8xOqj2ulwazG1u2D\u0026q=85\u0026s=214f9ea61f808abf055c6211a83d221c","appearance":{"default":"system"},"background":{"decoration":"gradient"},"navbar":{"links":[{"icon":"download","href":"/install","label":"Install"},{"icon":"github-alt","href":"https://github.com/stefanprodan/timoni","label":"GitHub"}]},"footer":{"socials":{"github":"https://github.com/stefanprodan/timoni","slack":"https://cloud-native.slack.com/team/ULPRMFH38","x":"https://x.com/stefanprodan","linkedin":"https://linkedin.com/in/stefanprodan"}},"seo":{"metatags":{"twitter:site":"@stefanprodan","twitter:creator":"@stefanprodan","twitter:card":"summary_large_image"},"indexing":"navigable"},"styling":{"eyebrows":"breadcrumbs","codeblocks":"system","latex":false},"errors":{"404":{"redirect":false,"title":"Page not found","description":"The page you are looking for does not exist or has moved.\n\n\u003cCardGroup cols={2}>\n \u003cCard title=\"Quickstart\" icon=\"rocket\" href=\"/quickstart\">Deploy your first module in minutes.\u003c/Card>\n \u003cCard title=\"Installation\" icon=\"download\" href=\"/install\">Get the Timoni CLI for your OS.\u003c/Card>\n \u003cCard title=\"CUE Reference\" icon=\"code\" href=\"/cue/module/initialization\">Author Timoni modules with CUE.\u003c/Card>\n \u003cCard title=\"CLI Reference\" icon=\"terminal\" href=\"/cmd/timoni\">Every timoni command and flag.\u003c/Card>\n\u003c/CardGroup>\n\nFollowed a broken link? [Open an issue](https://github.com/stefanprodan/timoni/issues) so we can fix it."}},"contextual":{"options":["copy","mcp","view","cursor","vscode"],"display":"header"},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"timoni","hasAudioNarration":false,"actualSubdomain":"timoni","customDomains":["timoni.sh"],"gitSource":{"type":"github","owner":"stefanprodan","repo":"timoni","deployBranch":"website","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae489bca3eed560d7e508f5","clientVersion":"0.0.4131","searchFilterCounts":[{"language":"default","tag":"CLI Reference","count":49},{"language":"default","tag":"Documentation","count":16},{"language":"default","tag":"CUE Reference","count":14},{"language":"default","tag":"Module","count":13},{"language":"default","tag":"Instance","count":9},{"language":"default","tag":"Module Development","count":9},{"language":"default","tag":"Artifact","count":7},{"language":"default","tag":"Bundle","count":7},{"language":"default","tag":"App Delivery","count":6},{"language":"default","tag":"Integrations","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true,"deflection":{"enabled":true,"email":"[email protected]"}},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":"body:has(#timoni-home) #navbar div:has(>.nav-tabs){display:none}#body-content,#navbar>div.mx-auto{max-width:100rem!important}@media (min-width: 1024px){#content-container{max-width:none!important;padding-left:3rem!important}}#header>.text-lg.prose{display:none}body:has(#timoni-home) #body-content{max-width:none!important}.tm-gradient{background:linear-gradient(135deg, #7e56c2 0%, #6500b0 60%, #2b1a4a 100%)}.tm-on-gradient{color:rgba(255, 255, 255, 0.8)}.tm-outline-light{color:#fff;border:1px solid rgba(255, 255, 255, 0.5)}.tm-outline-light:hover{border-color:#fff;background:rgba(255, 255, 255, 0.1)}.tm-band{background:#faf8fd;border-top:1px solid #ebe6f4;border-bottom:1px solid #ebe6f4}html.dark .tm-band{background:rgba(255, 255, 255, 0.025);border-color:rgba(255, 255, 255, 0.07)}.tm-check{display:inline-flex;flex:none;align-items:center;justify-content:center;width:1.25rem;height:1.25rem;margin-top:0.1rem;border-radius:9999px;background:rgba(126, 86, 194, 0.12);color:#7e56c2}.tm-check svg{width:0.65rem!important;height:0.65rem!important}html.dark .tm-check{background:rgba(169, 139, 224, 0.18);color:#a98be0}.tm-diagram-frame{padding:1.25rem;border:1px solid #ebe6f4;border-radius:1rem;background:#fff}html.dark .tm-diagram-frame{border-color:rgba(255, 255, 255, 0.08);background:rgba(255, 255, 255, 0.02)}.tm-footer{border-top:1px solid #ebe6f4}html.dark .tm-footer{border-color:rgba(255, 255, 255, 0.07)}.tm-footer ul a{color:#4b5563}html.dark .tm-footer ul a{color:#9ca3af}.tm-footer ul a:hover{color:#7e56c2}html.dark .tm-footer ul a:hover{color:#a98be0}.tm-footer-bottom{border-top:1px solid #ebe6f4}html.dark .tm-footer-bottom{border-color:rgba(255, 255, 255, 0.07)}.tm-footer-socials{display:inline-flex;gap:1rem}.tm-footer-socials a{color:#6b7280}.tm-footer-socials a:hover{color:#7e56c2}.tm-footer-socials svg{width:1.1rem!important;height:1.1rem!important}#navbar .navbar-link>a{width:30px;height:30px;padding:0;justify-content:center;border-radius:9999px;background:rgba(31, 41, 55, 0.04)}html.dark #navbar .navbar-link>a{background:rgba(255, 255, 255, 0.1)}#navbar .navbar-link>a>span{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0, 0, 0, 0);white-space:nowrap}#navbar .navbar-link>a>svg{width:1rem;height:1rem;background-color:#4b5563}#navbar .navbar-link>a:hover>svg{background-color:#1f2937}html.dark #navbar .navbar-link>a>svg{background-color:#d1d5db}html.dark #navbar .navbar-link>a:hover>svg{background-color:#f3f4f6}.not-found-container{max-width:44rem!important;padding-top:8rem!important}.not-found-description .card-group{width:100%;text-align:left}.not-found-description .card-group .card{text-align:left}#navbar img.nav-logo{height:30px}[data-component-part=\"card-icon\"] img[src*=\"/images/icons/\"]{object-fit:none;object-position:-9999px -9999px;background-color:rgb(var(--primary));mask-repeat:no-repeat;mask-position:center;mask-size:contain}html.dark [data-component-part=\"card-icon\"] img[src*=\"/images/icons/\"]{background-color:rgb(var(--primary-light))}[data-component-part=\"card-icon\"] img[src*=\"/images/icons/kubernetes.svg\"]{mask-image:url(\"/images/icons/kubernetes.svg\")}[data-component-part=\"card-icon\"] img[src*=\"/images/icons/helm.svg\"]{mask-image:url(\"/images/icons/helm.svg\")}[data-component-part=\"card-icon\"] img[src*=\"/images/icons/cue.svg\"]{mask-image:url(\"/images/icons/cue.svg\")}[data-component-part=\"card-icon\"] img[src*=\"/images/icons/flux.svg\"]{mask-image:url(\"/images/icons/flux.svg\")}img.tm-hero-logo{object-fit:none;object-position:-9999px -9999px;background-color:#111827;mask-image:url(\"/images/logo_icons.svg\");mask-repeat:no-repeat;mask-position:center;mask-size:contain}html.dark img.tm-hero-logo{background-color:#fff}"}],"page":{"pagePath":"bundle","slug":"/bundle","pageMetadata":{"title":"Bundle","sidebarTitle":"Bundle files","description":"Declare groups of module instances and their values in a single CUE file.","href":"/bundle"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Declare groups of module instances and their values in a single CUE file.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Tab,Tabs,Tip}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Tab)_missingMdxReference(`Tab`,true);if(!Tabs)_missingMdxReference(`Tabs`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsx(_components.p,{children:`Timoni bundles offer a declarative way of managing the lifecycle\nof applications and their infra dependencies.`}),`\n`,_jsx(_components.p,{children:`A Timoni bundle is a CUE file for defining a group of instances\ntogether with their values and module references.`}),`\n`,_jsx(Heading,{level:`2`,id:`example`,children:`Example`}),`\n`,_jsx(_components.p,{children:`The following is an example of a Bundle that defines a Redis\nmaster-replica cluster and a podinfo instance connected to the Redis instance.`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`23`,language:`cue`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`cue`,children:_jsxs(_components.code,{language:`cue`,numberOfLines:`23`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`bundle`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tapiVersion`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`v1alpha1`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tname`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`podinfo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tinstances`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\tredis`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tmodule`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\t\turl`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`oci://ghcr.io/stefanprodan/modules/redis`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\t\tversion`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`8.10.1`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\t\t\t}`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tnamespace`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`podinfo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tvalues`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`maxmemory`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`256`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\t\t}`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\tpodinfo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tmodule`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`url`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`oci://ghcr.io/stefanprodan/modules/podinfo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tmodule`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`version`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`6.14.0`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tnamespace`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`podinfo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tvalues`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`caching`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\t\tenabled`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\t\tredisURL`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`tcp://redis:6379`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\t\t\t}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\t\t}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\t}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`For the above example, Timoni performs the following actions at apply time:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`Validates that the Bundle definition is in conformance with the API version specified by `,_jsx(_components.code,{children:`apiVersion`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`For each instance, it fetches the module version from the registry using the `,_jsx(_components.code,{children:`module.url`}),`\nas the artifact repository address and the `,_jsx(_components.code,{children:`module.version`}),` as the artifact tag.`]}),`\n`,_jsx(_components.li,{children:`Creates the Kubernetes namespaces if they don’t exist.`}),`\n`,_jsxs(_components.li,{children:[`For each instance, it builds, validates and creates the Kubernetes resources using the specified `,_jsx(_components.code,{children:`values`}),`.`]}),`\n`,_jsx(_components.li,{children:`The list of managed resources along with the module reference and values are stored in the cluster in a\nKubernetes Secret, in the same namespace with the instance.`}),`\n`,_jsx(_components.li,{children:`If an instance already exists, Timoni performs a server-side apply dry-run to detect changes and\napplies only the resources with divergent state.`}),`\n`,_jsx(_components.li,{children:`If previously applied resources are missing from the current revision, these\nresources are deleted from the cluster.`}),`\n`,_jsx(_components.li,{children:`Waits for each instance’s resources to become ready.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`You can run this example by saving the Bundle into `,_jsx(_components.code,{children:`podinfo.bundle.cue`}),`.`]}),`\n`,_jsx(_components.p,{children:`Apply the Bundle on the cluster:`}),`\n`,_jsxs(Tabs,{sync:false,children:[_jsx(Tab,{title:`command`,id:`command`,children:_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni bundle apply -f podinfo.bundle.cue`})}),`\n`]})})})}),_jsx(Tab,{title:`output`,id:`output`,children:_jsx(CodeBlock,{filename:``,numberOfLines:`28`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`28`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`applying instance redis`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`pulling oci://ghcr.io/stefanprodan/modules/redis:8.10.1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`using module timoni.sh/redis version 8.10.1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`installing redis in namespace podinfo`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Namespace/podinfo created`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`applying master`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`ServiceAccount/podinfo/redis created`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`ConfigMap/podinfo/redis created`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Service/podinfo/redis created`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Deployment/podinfo/redis-master created`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`PersistentVolumeClaim/podinfo/redis-master created`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`waiting for 5 resource(s) to become ready...`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`resources are ready`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`applying replica`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Service/podinfo/redis-readonly created`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Deployment/podinfo/redis-replica created`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`waiting for 2 resource(s) to become ready...`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`resources are ready`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`applying instance podinfo`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`pulling oci://ghcr.io/stefanprodan/modules/podinfo:6.14.0`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`using module timoni.sh/podinfo version 6.14.0`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`installing podinfo in namespace podinfo`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`ServiceAccount/podinfo/podinfo created`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Service/podinfo/podinfo created`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Deployment/podinfo/podinfo created`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`waiting for 3 resource(s) to become ready...`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`resources are ready`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})})})]}),`\n`,_jsx(_components.p,{children:`Build the Bundle and print the resulting Kubernetes resources for all the Bundle’s instances:`}),`\n`,_jsxs(Tabs,{sync:false,children:[_jsx(Tab,{title:`command`,id:`command-2`,children:_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni bundle build -f podinfo.bundle.cue`})}),`\n`]})})})}),_jsx(Tab,{title:`output`,id:`output-2`,children:_jsx(CodeBlock,{filename:``,numberOfLines:`26`,language:`yaml`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`yaml`,children:_jsxs(_components.code,{language:`yaml`,numberOfLines:`26`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`---`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Instance: redis`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`---`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`apiVersion`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`v1`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`kind`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`ServiceAccount`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`metadata`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` labels`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` app.kubernetes.io/part-of`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`redis`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` app.kubernetes.io/version`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`8.10.1`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`redis`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` namespace`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`podinfo`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`---`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Redis deployments omitted for brevity`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`---`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Instance: podinfo`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`---`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`apiVersion`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`v1`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`kind`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`ServiceAccount`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:`metadata`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` labels`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` app.kubernetes.io/name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`podinfo`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` app.kubernetes.io/version`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`6.14.0`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` name`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`podinfo`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#116329`,\"--shiki-dark\":`#569CD6`},children:` namespace`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`podinfo`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`---`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# Podinfo deployment omitted for brevity`})}),`\n`]})})})})]}),`\n`,_jsx(_components.p,{children:`List the managed resources from a bundle and their rollout status:`}),`\n`,_jsxs(Tabs,{sync:false,children:[_jsx(Tab,{title:`command`,id:`command-3`,children:_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni bundle status -f podinfo.bundle.cue`})}),`\n`]})})})}),_jsx(Tab,{title:`output`,id:`output-3`,children:_jsx(CodeBlock,{filename:``,numberOfLines:`18`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`18`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`last applied 2024-03-03T20:21:19Z`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`module oci://ghcr.io/stefanprodan/modules/redis:8.10.1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`digest: sha256:4f377b66fd6d608f6a347bbef5b4fcd1aaff3dfa253b1c8437ae8e11fa08b70a`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`ServiceAccount/podinfo/redis Current Resource is current`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`ConfigMap/podinfo/redis Current Resource is always ready`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Service/podinfo/redis Current Service is ready`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Service/podinfo/redis-readonly Current Service is ready`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Deployment/podinfo/redis-master Current Deployment is available. Replicas: 1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Deployment/podinfo/redis-replica Current Deployment is available. Replicas: 1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`PersistentVolumeClaim/podinfo/redis-master Current PVC is Bound`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`last applied 2024-03-03T20:21:19Z`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`module oci://ghcr.io/stefanprodan/modules/podinfo:6.14.0`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`digest: sha256:32082e8ac0bba9ee2a3f95534f52c94f5a41dc642bb396c73b04fa18aff147d7`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`ServiceAccount/podinfo/podinfo Current Resource is always ready`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Service/podinfo/podinfo Current Service is ready`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`Deployment/podinfo/podinfo Current Deployment is available. Replicas: 1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})})})]}),`\n`,_jsxs(_components.p,{children:[`List the instances in Bundle `,_jsx(_components.code,{children:`podinfo`}),` across all namespaces:`]}),`\n`,_jsxs(Tabs,{sync:false,children:[_jsx(Tab,{title:`command`,id:`command-4`,children:_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni list --bundle podinfo -A`})}),`\n`]})})})}),_jsx(Tab,{title:`output`,id:`output-4`,children:_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`4`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`NAME NAMESPACE MODULE VERSION LAST APPLIED BUNDLE`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`podinfo podinfo oci://ghcr.io/stefanprodan/modules/podinfo 6.14.0 2024-03-03T16:20:07Z podinfo`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`redis podinfo oci://ghcr.io/stefanprodan/modules/redis 8.10.1 2024-03-03T16:20:00Z podinfo`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})})})]}),`\n`,_jsx(Heading,{level:`2`,id:`writing-a-bundle-spec`,children:`Writing a Bundle spec`}),`\n`,_jsx(_components.p,{children:`A Bundle file must contain a definition that matches the following schema:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`13`,language:`cue`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`cue`,children:_jsxs(_components.code,{language:`cue`,numberOfLines:`13`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`#Bundle`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tapiVersion`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`string`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tname`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`string`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tinstances`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`]: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\tmodule`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\turl`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`string`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tdigest`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`?: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`string`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tversion`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`*`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`latest`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` string`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\t\t}`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\tnamespace`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`string`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\tvalues`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {...}`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\t}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Bundle files can contain arithmetic\n`,_jsx(_components.a,{href:`https://cuelang.org/docs/tutorials/tour/expressions/operators/`,children:`operations`}),`,\n`,_jsx(_components.a,{href:`https://cuelang.org/docs/tutorials/tour/expressions/interpolation/`,children:`string interpolation`}),`\nand everything else that CUE `,_jsx(_components.a,{href:`https://cuelang.org/docs/references/spec/`,children:`std lib`}),` supports.`]}),`\n`,_jsx(Heading,{level:`3`,id:`api-version`,children:`API version`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`apiVersion`}),` is a required field that specifies the version of the Bundle schema.`]}),`\n`,_jsxs(_components.p,{children:[`Currently, the only supported value is `,_jsx(_components.code,{children:`v1alpha1`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`name`,children:`Name`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`name`}),` is a required field used to track the ownership of instances deployed to a Kubernetes cluster.`]}),`\n`,_jsxs(_components.p,{children:[`The name must be a lowercase identifier (alphanumeric characters, `,_jsx(_components.code,{children:`-`}),`, `,_jsx(_components.code,{children:`_`}),` and `,_jsx(_components.code,{children:`.`}),`,\nstarting and ending with an alphanumeric character) of at most 63 characters.`]}),`\n`,_jsxs(_components.p,{children:[`Note that Bundles should have unique names per cluster, using the same name for different bundles\nwill result in `,_jsx(_components.a,{href:`#transfer-ownership`,children:`ownership conflict`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`instances`,children:`Instances`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`instances`}),` array is a required field that specifies the list of Instances part of this Bundle.`]}),`\n`,_jsxs(_components.p,{children:[`Each instance name (the `,_jsx(_components.code,{children:`instances`}),` map key) must be a lowercase identifier\n(alphanumeric characters, `,_jsx(_components.code,{children:`-`}),`, `,_jsx(_components.code,{children:`_`}),` and `,_jsx(_components.code,{children:`.`}),`, starting and ending with an alphanumeric\ncharacter) of at most 63 characters, as it is used to name the instance’s Kubernetes resources.`]}),`\n`,_jsx(_components.p,{children:`A Bundle must contain at least one instance with the following required fields:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`10`,language:`cue`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`cue`,children:_jsxs(_components.code,{language:`cue`,numberOfLines:`10`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`bundle`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tapiVersion`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`v1alpha1`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tname`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`podinfo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tinstances`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\tpodinfo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tmodule`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`url`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`oci://ghcr.io/stefanprodan/modules/podinfo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tnamespace`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`podinfo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\t\t}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\t}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`instance-module`,children:`Instance Module`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`instance.module`}),` is a required field that specifies the OCI URL, version and/or digest\nof the instance’s module.`]}),`\n`,_jsx(Heading,{level:`4`,id:`url`,children:`URL`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`instance.module.url`}),` is a required field that specifies the source of the module.\nIt can be either an OCI repository address (preferred) or a local path to a module (useful during development).`]}),`\n`,_jsxs(_components.p,{children:[`When using an OCI repository, the `,_jsx(_components.code,{children:`url`}),` field must be in the format `,_jsx(_components.code,{children:`oci://\u003cregistry-host>/\u003crepo-name>`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`When using a Local path, the `,_jsx(_components.code,{children:`url`}),` field must be in the format `,_jsx(_components.code,{children:`file://path/to/module`}),`.`]}),`\n`,_jsxs(Tip,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Relative paths`})}),_jsx(_components.p,{children:`Relative paths are always computed relatively to the path of the bundle file containing the value.`})]}),`\n`,_jsx(Heading,{level:`4`,id:`version`,children:`Version`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`instance.module.version`}),` is an optional field that specifies the version number of the module.\nThe version number must follow `,_jsx(_components.a,{href:`/cue/module/publishing#version-format`,children:`Timoni’s semantic versioning`}),`.\nWhen not specified, the version defaults to `,_jsx(_components.code,{children:`latest`}),`, which pulls the module OCI artifact tagged as latest.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`cue`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`cue`,children:_jsxs(_components.code,{language:`cue`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`module`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\turl`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`oci://ghcr.io/stefanprodan/modules/podinfo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tversion`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`6.14.1`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(Tip,{children:[_jsx(_components.p,{children:_jsx(_components.strong,{children:`Default version`})}),_jsxs(_components.p,{children:[`When not specified, the version defaults to `,_jsx(_components.code,{children:`latest`}),`, which pulls the module OCI artifact tagged as latest.\nNote that using `,_jsx(_components.code,{children:`version: \"latest\"`}),` is not recommended for production system, unless you also specify a digest.`]})]}),`\n`,_jsx(Heading,{level:`4`,id:`digest`,children:`Digest`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`instance.module.digest`}),` is an optional field that specifies the OCI digest of the module.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`cue`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`cue`,children:_jsxs(_components.code,{language:`cue`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`module`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\turl`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`oci://ghcr.io/stefanprodan/modules/podinfo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tdigest`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`sha256:ddf8be195f69ad767b40d5c3fec3a8a85482bf6bf469d949a462cb4fd27df580`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`When both the version number and the digest are specified, Timoni will verify that the\ndigest of the pulled module matches the specified `,_jsx(_components.code,{children:`instance.module.digest`}),`.\nThe digest is computed from the artifact manifest that Timoni pulled, so the check fails\nif the registry serves any content other than the pinned one for that version.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`cue`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`cue`,children:_jsxs(_components.code,{language:`cue`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`module`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\turl`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`oci://ghcr.io/stefanprodan/modules/podinfo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tversion`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`6.14.1`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tdigest`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`sha256:ddf8be195f69ad767b40d5c3fec3a8a85482bf6bf469d949a462cb4fd27df580`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`If the version is set to `,_jsx(_components.code,{children:`latest`}),` and a digest is specified, Timoni will ignore the version\nand will pull the module by its OCI digest.`]}),`\n`,_jsx(Heading,{level:`3`,id:`instance-namespace`,children:`Instance Namespace`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`instance.namespace`}),` is a required field that specifies the Kubernetes namespace where the instance is created.`]}),`\n`,_jsxs(_components.p,{children:[`The namespace must be a lowercase identifier (alphanumeric characters, `,_jsx(_components.code,{children:`-`}),`, `,_jsx(_components.code,{children:`_`}),` and `,_jsx(_components.code,{children:`.`}),`,\nstarting and ending with an alphanumeric character) of at most 63 characters.`]}),`\n`,_jsx(_components.p,{children:`If the specified namespace does not exist, Timoni will first create the namespace,\nthen it will apply the instance’s resources in that namespace.`}),`\n`,_jsx(Heading,{level:`3`,id:`instance-values`,children:`Instance Values`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`instance.values`}),` is an optional field that specifies custom values used to configure the instance.`]}),`\n`,_jsx(_components.p,{children:`At apply time, Timoni merges the custom values with the defaults,\nvalidates the final values against the config schema and creates the instance.`}),`\n`,_jsx(Heading,{level:`4`,id:`values-from-runtime`,children:`Values from runtime`}),`\n`,_jsxs(_components.p,{children:[`The `,_jsx(_components.code,{children:`@timoni(runtime:[string|number|bool]:[VAR_NAME])`}),` CUE attribute can be placed next\nto a field to set its value from the `,_jsx(_components.a,{href:`/bundle-runtime`,children:`Runtime`}),`.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`cue`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`cue`,children:_jsxs(_components.code,{language:`cue`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`values`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\thost`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`example.com`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` @`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`timoni`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`runtime:string:MY_HOST`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tenabled`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`true`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` @`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`timoni`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`runtime:bool:MY_ENABLED`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tscore`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`1`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` @`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`timoni`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`runtime:number:MY_SCORE`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`To make a Runtime attribute required, the field value can be set to its type:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`cue`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`cue`,children:_jsxs(_components.code,{language:`cue`,numberOfLines:`5`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`values`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\thost`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`string`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` @`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`timoni`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`runtime:string:MY_HOST`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tenabled`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`bool`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` @`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`timoni`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`runtime:bool:MY_ENABLED`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tscore`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`int`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` @`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`timoni`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`runtime:number:MY_SCORE`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The Runtime values can come from Kubernetes API and/or from the environment variables,\nfor more details please see the `,_jsx(_components.a,{href:`/bundle-runtime`,children:`Bundle Runtime documentation`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`working-with-bundles`,children:`Working with Bundles`}),`\n`,_jsx(Heading,{level:`3`,id:`install-and-upgrade`,children:`Install and Upgrade`}),`\n`,_jsxs(_components.p,{children:[`To install or upgrade the instances defined in a Bundle file,\nyou can use the `,_jsx(_components.code,{children:`timoni bundle apply`}),` command.`]}),`\n`,_jsx(_components.p,{children:`Example:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni bundle apply -f bundle.cue`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`The apply command performs the following actions for each instance:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Pulls the module version from the specified container registry.`}),`\n`,_jsxs(_components.li,{children:[`If the registry is private, uses the credentials found in `,_jsx(_components.code,{children:`~/.docker/config.json`}),`.`]}),`\n`,_jsxs(_components.li,{children:[`If the registry credentials are specified with `,_jsx(_components.code,{children:`--creds`}),`, these take priority over the docker ones.`]}),`\n`,_jsx(_components.li,{children:`Merges the custom values supplied in the Bundle with the default values found in the module.`}),`\n`,_jsx(_components.li,{children:`Builds the module by passing the instance name, namespace and values.`}),`\n`,_jsx(_components.li,{children:`Labels the resulting Kubernetes resources with the instance name and namespace.`}),`\n`,_jsx(_components.li,{children:`Creates the instance namespace if it doesn’t exist.`}),`\n`,_jsx(_components.li,{children:`Applies the Kubernetes resources on the cluster.`}),`\n`,_jsx(_components.li,{children:`Creates or updates the instance inventory with the last applied resources IDs.`}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Before applying an instance, Timoni validates its custom resources against the\nCRD schemas vendored in the module and the CRDs rendered by the instance and by\nthe earlier instances of the bundle. A violation fails the apply before the\ninstance is written to the cluster. Use `,_jsx(_components.code,{children:`--validate=false`}),` to disable the validation.`]}),`\n`,_jsx(Heading,{level:`3`,id:`diff-upgrade`,children:`Diff Upgrade`}),`\n`,_jsxs(_components.p,{children:[`After editing a bundle file, you can review the changes that will\nbe made on the cluster with `,_jsx(_components.code,{children:`timoni bundle apply --diff`}),`.`]}),`\n`,_jsx(_components.p,{children:`Example:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni bundle apply --dry-run --diff -f bundle.cue`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`The values of the Kubernetes Secrets `,_jsx(_components.code,{children:`data`}),` entries are masked in the diff\noutput: changed entries are printed as `,_jsx(_components.code,{children:`*** (before)`}),` and `,_jsx(_components.code,{children:`*** (after)`}),`.`]}),`\n`,_jsxs(_components.p,{children:[`When the cluster state is in sync with the bundle definition, the command\nexits with code 0. When drift is detected, it exits with code 1, and when\nthe dry run fails, it exits with code 2. This allows using\n`,_jsx(_components.code,{children:`timoni bundle apply --diff`}),` as a drift check in CI.`]}),`\n`,_jsx(Heading,{level:`3`,id:`force-upgrade`,children:`Force Upgrade`}),`\n`,_jsxs(_components.p,{children:[`If an upgrade contains changes to immutable fields, such as changing the image\ntag of a Kubernetes Job, you need to set the `,_jsx(_components.code,{children:`--force`}),` flag.`]}),`\n`,_jsx(_components.p,{children:`Example:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni bundle apply --force -f bundle.cue`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`With `,_jsx(_components.code,{children:`--force`}),`, Timoni will recreate only the resources that contain changes\nto immutable fields.`]}),`\n`,_jsx(Heading,{level:`3`,id:`transfer-ownership`,children:`Transfer ownership`}),`\n`,_jsxs(_components.p,{children:[`If an install or upgrade involves Instances already created, either separately or as a part of another Bundle,\nthe operation will fail.\nTo transfer ownership to the current Bundle, you need to set the `,_jsx(_components.code,{children:`--overwrite-ownership`}),` flag.`]}),`\n`,_jsx(_components.p,{children:`Example:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni bundle apply --overwrite-ownership -f bundle.cue`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`status`,children:`Status`}),`\n`,_jsxs(_components.p,{children:[`To list the current status of the managed resources for each\ninstance including the last applied date, the module url and digest,\nyou can use the `,_jsx(_components.code,{children:`timoni bundle status`}),`.`]}),`\n`,_jsx(_components.p,{children:`Example using the bundle name:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni bundle status my-bundle`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Example using a bundle CUE file:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni bundle status -f bundle.cue`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`build`,children:`Build`}),`\n`,_jsxs(_components.p,{children:[`To build the instances defined in a Bundle file and print the resulting Kubernetes resources,\nyou can use the `,_jsx(_components.code,{children:`timoni bundle build`}),` command.`]}),`\n`,_jsx(_components.p,{children:`Example:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni bundle build -f bundle.cue`})}),`\n`]})})}),`\n`,_jsx(Heading,{level:`4`,id:`validation`,children:`Validation`}),`\n`,_jsxs(_components.p,{children:[`The custom resources of every instance are validated against the CRD schemas\nvendored in the modules and the CRDs rendered by any instance of the bundle, with\nthe same checks as the Kubernetes API server, see\n`,_jsx(_components.a,{href:`/cue/module/custom-resources#custom-resource-validation`,children:`custom resource validation`}),`.\nA violation fails the build before anything is written to stdout or to the output\ndirectory. Use `,_jsx(_components.code,{children:`--validate=false`}),` to disable the validation.`]}),`\n`,_jsxs(_components.p,{children:[`To print the manifests without exposing credentials, for example when sharing\nthe output or reviewing it in a CI log, use the `,_jsx(_components.code,{children:`--mask-secrets`}),` flag which\nreplaces the values of Kubernetes Secrets with `,_jsx(_components.code,{children:`***`}),`:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni bundle build -f bundle.cue --mask-secrets`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`To write the generated manifests to disk as a directory tree instead of printing them\nto stdout, see `,_jsx(_components.a,{href:`#export-manifests-to-directory`,children:`Export manifests to directory`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`use-values-from-json-and-yaml-files`,children:`Use values from JSON and YAML files`}),`\n`,_jsx(_components.p,{children:`A bundle can be defined in multiple files of different formats:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni bundle build -f bundle.cue -f extras1.json -f extras2.yaml`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Timoni extracts the CUE values from the JSON and YAML files,\nand unifies them with the bundle value. Note that setting the\nsame field in multiple files is not supported.`}),`\n`,_jsxs(_components.p,{children:[`Timoni supports the following extensions: `,_jsx(_components.code,{children:`.cue`}),`, `,_jsx(_components.code,{children:`.json`}),`, `,_jsx(_components.code,{children:`.yml`}),`, `,_jsx(_components.code,{children:`.yaml`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`uninstall`,children:`Uninstall`}),`\n`,_jsxs(_components.p,{children:[`To uninstall all the instances belonging to a Bundle,\nyou can use the `,_jsx(_components.code,{children:`timoni bundle delete`}),` command.`]}),`\n`,_jsx(_components.p,{children:`Example using the bundle name:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni bundle delete my-bundle`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Example using a bundle CUE file:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni bundle delete -f bundle.cue`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`Timoni will search the cluster and delete all the instances having\nthe `,_jsx(_components.code,{children:`bundle.timoni.sh/name: \u003cname>`}),` label matching the given bundle name.\nThe instances are uninstalled in reverse order,\nfirst created instance is last to be deleted.`]}),`\n`,_jsx(Heading,{level:`3`,id:`garbage-collection`,children:`Garbage collection`}),`\n`,_jsx(_components.p,{children:`Timoni’s garbage collector keeps track of the applied resources and prunes the Kubernetes\nobjects that were previously applied but are missing from the current revision.`}),`\n`,_jsx(_components.p,{children:`Example:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni bundle apply -f bundle.cue`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`To prevent the garbage collector from deleting certain\nresources such as Kubernetes Persistent Volumes,\nthese resources can be annotated with `,_jsx(_components.code,{children:`action.timoni.sh/prune: \"disabled\"`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`readiness-checks`,children:`Readiness checks`}),`\n`,_jsx(_components.p,{children:`By default, Timoni applies the instances in order, and will wait for\neach instance’s resources to become ready, before moving to the next instance.`}),`\n`,_jsx(_components.p,{children:`The readiness check is performed for the Kubernetes resources with the following types:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Kubernetes built-in kinds: Deployment, DaemonSet, StatefulSet,\nPersistentVolumeClaim, Pod, PodDisruptionBudget, Job, CronJob, Service,\nSecret, ConfigMap, CustomResourceDefinition`}),`\n`,_jsxs(_components.li,{children:[`Custom resources that are compatible\nwith `,_jsx(_components.a,{href:`https://github.com/fluxcd/cli-utils`,children:`Flux kstatus`})]}),`\n`,_jsxs(_components.li,{children:[`Custom resources that are not kstatus-compliant, for which the module\ndefines `,_jsx(_components.a,{href:`/cue/module/health-checks`,children:`custom health checks`})]}),`\n`]}),`\n`,_jsx(_components.p,{children:`Example:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni bundle apply --wait --timeout=5m -f bundle.cue`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`With `,_jsx(_components.code,{children:`--timeout`}),`, Timoni will retry the readiness checks until the specified\ntimeout period expires. If an instance’s resource fails to become ready,\nthe apply command will exit with an error.`]}),`\n`,_jsxs(_components.p,{children:[`The readiness check is enabled by default, to opt-out set `,_jsx(_components.code,{children:`--wait=false`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`vetting`,children:`Vetting`}),`\n`,_jsxs(_components.p,{children:[`To verify that one or more CUE files contain a valid Bundle definition,\nyou can use the `,_jsx(_components.code,{children:`timoni bundle vet`}),` command.`]}),`\n`,_jsx(_components.p,{children:`Example:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni bundle vet -f bundle.cue -f extras.cue`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`If the validation passes, Timoni will list all the instances found in the computed bundle.\nThe command runs without cluster access unless the selected Runtime declares `,_jsx(_components.code,{children:`values`}),`\nthat read from Kubernetes resources.`]}),`\n`,_jsxs(_components.p,{children:[`With `,_jsx(_components.code,{children:`--offline`}),`, Timoni does not connect to the clusters and takes the Runtime values\nfrom the environment variables with the same names.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`2`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`export`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` DB_PASSWORD=dummy`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni bundle vet -f bundle.cue -r runtime.cue --offline --print-value`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`When a value declared by the Runtime is missing from the environment, Timoni reports it\nand uses the Bundle default. The validation fails if the value has no default.\nThe clusters declared in the Runtime are still evaluated one by one, with\n`,_jsx(_components.code,{children:`TIMONI_CLUSTER_NAME`}),` and `,_jsx(_components.code,{children:`TIMONI_CLUSTER_GROUP`}),` set for each of them.`]}),`\n`,_jsxs(_components.p,{children:[`When `,_jsx(_components.code,{children:`--print-value`}),` is specified, Timoni will write the Bundle computed value to stdout.\nPrinting the computed value is particularly useful when debugging runtime attributes.`]}),`\n`,_jsxs(_components.p,{children:[`Note that the vet command does not fetch the modules, so the instance values are\nnot validated against the module schemas. Use `,_jsx(_components.code,{children:`timoni bundle build`}),` for that.`]}),`\n`,_jsx(Heading,{level:`3`,id:`update-module-versions`,children:`Update module versions`}),`\n`,_jsxs(_components.p,{children:[`To update the module versions and digests referenced in a bundle,\nyou can use the `,_jsx(_components.code,{children:`timoni bundle update`}),` command. The update policy\nis declared per module reference with the `,_jsx(_components.code,{children:`@timoni(update:...)`}),` attribute:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`cue`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`cue`,children:_jsxs(_components.code,{language:`cue`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`module`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\turl`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`oci://ghcr.io/stefanprodan/modules/redis`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tversion`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`8.9.0`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` @`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`timoni`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`update:semver:8.x`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Example:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni bundle update -f bundle.cue`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`For the update policies, the `,_jsx(_components.code,{children:`--level`}),` flag and the CI integration,\nsee `,_jsx(_components.a,{href:`/bundle-update`,children:`Bundle updates`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`format`,children:`Format`}),`\n`,_jsxs(_components.p,{children:[`To format Bundle files, you can use the `,_jsx(_components.code,{children:`timoni fmt`}),` command.`]}),`\n`,_jsx(_components.p,{children:`Example:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni fmt bundle.cue`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`To verify formatting without rewriting the file, e.g. in CI,\nuse `,_jsx(_components.code,{children:`timoni fmt --diff bundle.cue`}),`, which prints the pending changes\nand exits with a non-zero status if the file is not well formatted.`]}),`\n`,_jsx(Heading,{level:`3`,id:`referencing-local-modules`,children:`Referencing local modules`}),`\n`,_jsx(_components.p,{children:`When developing and testing Timoni Modules, you can reference them\nfrom a Bundle file using relative local paths.`}),`\n`,_jsx(_components.p,{children:`Example repo structure:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`5`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`5`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`├── modules`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`│\\xA0\\xA0 ├── app1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`│\\xA0\\xA0 └── app2`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`└── bundles`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` └── apps-test.cue`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Example Bundle file:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`16`,language:`cue`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`cue`,children:_jsxs(_components.code,{language:`cue`,numberOfLines:`16`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`bundle`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tapiVersion`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`v1alpha1`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tname`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`apps-test`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tinstances`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\t\t\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`app1`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tmodule`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`url`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`file://../modules/app1`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tnamespace`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`app1`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tvalues`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {...}`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\t\t}`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\t\t\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`app2`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tmodule`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`url`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`file://../modules/app2`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tnamespace`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`app2`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tvalues`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {...}`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\t\t}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\t}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsxs(_components.p,{children:[`When using local paths, the `,_jsx(_components.code,{children:`url`}),` field must be in the format `,_jsx(_components.code,{children:`file://path/to/module`}),`\nand the module path is computed relatively to the path of the bundle file location.`]}),`\n`,_jsxs(_components.p,{children:[`Note that when using local modules, the module’s version and digest are ignored, as these\nare only relevant when pulling modules from a container registry.\nAll instances created from modules referenced with local paths have\nthe module version set to `,_jsx(_components.code,{children:`0.0.0-devel`}),`.`]}),`\n`,_jsx(Heading,{level:`3`,id:`export-manifests-to-directory`,children:`Export manifests to directory`}),`\n`,_jsxs(_components.p,{children:[`By default, `,_jsx(_components.code,{children:`timoni bundle build`}),` prints the resulting Kubernetes resources of all\ninstances to stdout. To write the manifests as files on disk, use the `,_jsx(_components.code,{children:`--output-dir`}),` flag.\nThe files always contain the Secret values, the `,_jsx(_components.code,{children:`--mask-secrets`}),` flag applies to stdout only.`]}),`\n`,_jsx(_components.p,{children:`Stdout mode is render-only: every instance is built and marshalled in memory first,\nand the complete result is written to stdout in one pass only after all instances\nsucceed. If the build of any instance fails, no output is written. The exit status\nalso reflects the final stdout write, so a failed or incomplete write cannot be\nreported as success.`}),`\n`,_jsxs(_components.p,{children:[`The instances are built concurrently, with the number of concurrent builds set by the\n`,_jsx(_components.code,{children:`--concurrency`}),` flag. It defaults to the number of CPU cores capped at 8; raising it\ncan speed up large bundles at the cost of a higher peak memory usage.`]}),`\n`,_jsx(_components.p,{children:`For example, given a bundle with two instances:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`14`,language:`cue`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`cue`,children:_jsxs(_components.code,{language:`cue`,numberOfLines:`14`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`bundle`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tapiVersion`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`v1alpha1`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tname`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`podinfo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\tinstances`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\tfrontend`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tmodule`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`url`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`oci://ghcr.io/stefanprodan/modules/podinfo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tnamespace`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`frontend`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\t\t}`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\tbackend`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tmodule`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`url`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`oci://ghcr.io/stefanprodan/modules/podinfo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`\t\t\tnamespace`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`backend`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\"`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\t\t}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`\t}`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Build the bundle to a directory:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`1`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`1`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`timoni bundle build -f podinfo.cue --output-dir ./manifests`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Timoni writes the manifests as a directory tree with one subdirectory per instance,\nand inside each, one file per Kubernetes resource:`}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`10`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`10`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`manifests`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`├── backend`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`│ ├── apps_v1_deployment_backend.yaml`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`│ ├── v1_service_backend.yaml`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`│ └── v1_serviceaccount_backend.yaml`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`└── frontend`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ├── apps_v1_deployment_frontend.yaml`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ├── v1_service_frontend.yaml`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` └── v1_serviceaccount_frontend.yaml`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`The file names follow the same convention as `,_jsx(_components.code,{children:`kustomize build -o \u003cdir>`}),`:\n`,_jsx(_components.code,{children:`\u003cgroup>_\u003cversion>_\u003ckind>_\u003cname>.yaml`}),`, lowercased, with the group omitted for\ncore resources (e.g. `,_jsx(_components.code,{children:`v1_service_backend.yaml`}),`). When an instance’s resources\nspan more than one namespace, the file name is prefixed with the namespace\n(`,_jsx(_components.code,{children:`\u003cnamespace>_\u003cgroup>_\u003cversion>_\u003ckind>_\u003cname>.yaml`}),`) to avoid collisions.`]}),`\n`,_jsxs(_components.p,{children:[`The output directory is created if it does not exist. Existing files with the same\nname are overwritten, but files that are no longer generated are not removed,\nso you may want to point `,_jsx(_components.code,{children:`--output-dir`}),` at a clean directory.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"codeStyling":"system","config":{},"pageMetadata":{"title":"Bundle","sidebarTitle":"Bundle files","description":"Declare groups of module instances and their values in a single CUE file.","href":"/bundle"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Example","slug":"example","depth":2,"children":[]},{"title":"Writing a Bundle spec","slug":"writing-a-bundle-spec","depth":2,"children":[{"title":"API version","slug":"api-version","depth":3,"children":[]},{"title":"Name","slug":"name","depth":3,"children":[]},{"title":"Instances","slug":"instances","depth":3,"children":[]},{"title":"Instance Module","slug":"instance-module","depth":3,"children":[]},{"title":"URL","slug":"url","depth":4,"children":[]},{"title":"Version","slug":"version","depth":4,"children":[]},{"title":"Digest","slug":"digest","depth":4,"children":[]},{"title":"Instance Namespace","slug":"instance-namespace","depth":3,"children":[]},{"title":"Instance Values","slug":"instance-values","depth":3,"children":[]},{"title":"Values from runtime","slug":"values-from-runtime","depth":4,"children":[]}]},{"title":"Working with Bundles","slug":"working-with-bundles","depth":2,"children":[{"title":"Install and Upgrade","slug":"install-and-upgrade","depth":3,"children":[]},{"title":"Diff Upgrade","slug":"diff-upgrade","depth":3,"children":[]},{"title":"Force Upgrade","slug":"force-upgrade","depth":3,"children":[]},{"title":"Transfer ownership","slug":"transfer-ownership","depth":3,"children":[]},{"title":"Status","slug":"status","depth":3,"children":[]},{"title":"Build","slug":"build","depth":3,"children":[]},{"title":"Validation","slug":"validation","depth":4,"children":[]},{"title":"Use values from JSON and YAML files","slug":"use-values-from-json-and-yaml-files","depth":3,"children":[]},{"title":"Uninstall","slug":"uninstall","depth":3,"children":[]},{"title":"Garbage collection","slug":"garbage-collection","depth":3,"children":[]},{"title":"Readiness checks","slug":"readiness-checks","depth":3,"children":[]},{"title":"Vetting","slug":"vetting","depth":3,"children":[]},{"title":"Update module versions","slug":"update-module-versions","depth":3,"children":[]},{"title":"Format","slug":"format","depth":3,"children":[]},{"title":"Referencing local modules","slug":"referencing-local-modules","depth":3,"children":[]},{"title":"Export manifests to directory","slug":"export-manifests-to-directory","depth":3,"children":[]}]}],"codeExamples":{}},"jsLinks":[],"subdomain":"timoni","siteName":"Timoni","title":"Bundle - Timoni","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-28T13:19:37.011Z","originalFileLocation":"bundle.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Declare groups of module instances and their values in a single CUE file.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Timoni\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/timoni/wBHd5XBsu-JLPEJB/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/timoni/wBHd5XBsu-JLPEJB/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/timoni/wBHd5XBsu-JLPEJB/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/timoni/wBHd5XBsu-JLPEJB/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/timoni/wBHd5XBsu-JLPEJB/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/timoni/wBHd5XBsu-JLPEJB/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/timoni/wBHd5XBsu-JLPEJB/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/timoni/wBHd5XBsu-JLPEJB/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/timoni/wBHd5XBsu-JLPEJB/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Bundle - Timoni\">\u003cmeta data-mint-head property=\"og:description\" content=\"Declare groups of module instances and their values in a single CUE file.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Timoni\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://timoni.sh/bundle\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://timoni.mintlify.site/_mintlify/api/og/v2?division=App+Delivery\u0026amp;title=Bundle\u0026amp;description=Declare+groups+of+module+instances+and+their+values+in+a+single+CUE+file.\u0026amp;theme=75f94fd67070bb6be2c4d855\u0026amp;signature=f31e8fd180d15aee86c5d1e447ba9b9d363d89812d1d41aa27190c502306db43\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Bundle - Timoni\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Declare groups of module instances and their values in a single CUE file.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://timoni.mintlify.site/_mintlify/api/og/v2?division=App+Delivery\u0026amp;title=Bundle\u0026amp;description=Declare+groups+of+module+instances+and+their+values+in+a+single+CUE+file.\u0026amp;theme=75f94fd67070bb6be2c4d855\u0026amp;signature=f31e8fd180d15aee86c5d1e447ba9b9d363d89812d1d41aa27190c502306db43\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/timoni/wBHd5XBsu-JLPEJB/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Timoni\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#7e56c2\">\u003cmeta data-mint-head name=\"twitter:creator\" content=\"@stefanprodan\">\u003clink data-mint-head rel=\"canonical\" href=\"https://timoni.sh/bundle\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/bundle.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://timoni.sh/#organization\",\"name\":\"Timoni\",\"url\":\"https://timoni.sh\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/timoni/8xOqj2ulwazG1u2D/images/logo_text_black.svg?fit=max\u0026auto=format\u0026n=8xOqj2ulwazG1u2D\u0026q=85\u0026s=85ffbf62ec541a621a19255513199222\"}},{\"@type\":\"WebSite\",\"@id\":\"https://timoni.sh#website\",\"name\":\"Timoni\",\"url\":\"https://timoni.sh\",\"publisher\":{\"@id\":\"https://timoni.sh/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://timoni.sh/bundle#webpage\",\"url\":\"https://timoni.sh/bundle\",\"name\":\"Bundle\",\"description\":\"Declare groups of module instances and their values in a single CUE file.\",\"dateModified\":\"2026-09-28T13:19:37.011Z\",\"isPartOf\":{\"@id\":\"https://timoni.sh#website\"},\"breadcrumb\":{\"@id\":\"https://timoni.sh/bundle#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://timoni.sh/bundle#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Timoni\",\"item\":\"https://timoni.sh\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Bundle\",\"item\":\"https://timoni.sh/bundle\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://timoni.sh/bundle#article\",\"headline\":\"Bundle\",\"name\":\"Bundle\",\"description\":\"Declare groups of module instances and their values in a single CUE file.\",\"url\":\"https://timoni.sh/bundle\",\"mainEntityOfPage\":{\"@id\":\"https://timoni.sh/bundle#webpage\"},\"dateModified\":\"2026-09-28T13:19:37.011Z\",\"publisher\":{\"@id\":\"https://timoni.sh/#organization\"},\"isPartOf\":{\"@id\":\"https://timoni.sh#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Timoni\",\"publisher\":{\"@type\":\"Organization\",\"name\":\"Timoni\"},\"provider\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","agentPointerHref":"/bundle.md","siteName":"Timoni","nav":{"global":null,"tabs":[{"tab":"Documentation","icon":"book-open","groups":[{"group":"Get Started","pages":[{"title":"Quickstart Guide","sidebarTitle":"Quickstart","href":"/quickstart"},{"title":"Concepts","href":"/concepts"},{"title":"Installation Guide","sidebarTitle":"Installation","href":"/install"},{"title":"Timoni compared to other tools","sidebarTitle":"Compared to other tools","description":"How Timoni compares to Helm, Kustomize and other Kubernetes packaging tools.","href":"/comparison"}]},{"group":"App Delivery","pages":[{"title":"Bundle","sidebarTitle":"Bundle files","href":"/bundle"},{"title":"Bundle Runtime","sidebarTitle":"Bundle runtime","description":"Fetch values at apply time from Kubernetes Secrets, ConfigMaps and other resources.","href":"/bundle-runtime"},{"title":"Bundle Update Automation","sidebarTitle":"Bundle updates","href":"/bundle-update"},{"title":"Bundle Distribution","sidebarTitle":"Bundle distribution","href":"/bundle-distribution"},{"title":"Bundle Secrets Injection","sidebarTitle":"Bundle secrets injection","href":"/bundle-secrets"},{"title":"Multi-cluster Deployments","sidebarTitle":"Multi-cluster deployments","href":"/bundle-multi-cluster"}]},{"group":"App Packaging","pages":[{"title":"Module Specification","sidebarTitle":"Module specification","href":"/module"}]},{"group":"Integrations","pages":[{"title":"AI Agents","href":"/ai-agents"},{"title":"GitHub Actions","href":"/github-actions"},{"title":"Flux AIO Distribution","href":"/flux-aio"},{"title":"Helm interoperability with Flux","sidebarTitle":"Helm Interoperability","href":"/flux-helm-interop"},{"title":"GitOps Guide","sidebarTitle":"GitOps with Flux","href":"/gitops-flux"}]}]},{"tab":"CUE Reference","icon":"code","pages":[{"title":"CUE Reference","href":"/cue/introduction"}]},{"tab":"CLI Reference","icon":"terminal","pages":[{"title":"CLI Reference","href":"/cmd/timoni"}]}]},"basePath":"","title":"Bundle - Timoni","buildId":"dpl_5joLUXmnJgwqjrHAS4dxZrQTdxgh","deploymentId":"dpl_5joLUXmnJgwqjrHAS4dxZrQTdxgh","dynamics":[],"chunks":[]}