Skip to main content
akua still runs Helm charts and Kustomize overlays, but it changes two things about how they are rendered. This page explains why, for package authors and for anyone evaluating whether akua’s renders are safe to run on shared infrastructure.

Templates have no types

A Helm chart is a text template over an untyped values tree, and a Kustomize overlay patches YAML against a built-in schema from Kubernetes 1.21. Mistakes surface when the API server rejects a manifest, or never:
  • Most charts ship no values schema. Of the 300 most-starred Helm charts on Artifact Hub (queried October 12, 2026), 25.7% ship a values.schema.json, and most schemas that exist accept unknown keys, so a misspelled value is ignored.
  • Values are parsed as YAML 1.1. country: NO reaches the chart as false, and yes, on and y as true (helm#32504).
  • Structure comes from indentation. A wrong nindent can still be valid YAML, under the wrong key, and helm template does not validate its output against Kubernetes schemas.
In akua, a Package is a typed KCL program. Its inputs are a schema, its Kubernetes resources are typed against one pinned Kubernetes version, CustomResourceDefinitions become schemas too, and chart values are typed from the chart’s values.schema.json when it has one. A typo fails the render with the file and line:
Typed resources → shows how to get this for every Package.

Rendering runs someone else’s program

Helm and Kustomize include features that read host files (symlinks in directory charts, file:// dependencies), make network requests (schema $ref, remote bases, remote resources) and run executables (plugins, post-renderers, git, helm). They run with the authority of whatever renders them: a laptop, a CI runner, a GitOps repo server. These features have produced a steady stream of advisories, for example: akua compiles Helm and Kustomize to WebAssembly and runs them, and the KCL runtime, inside Wasmtime. The sandbox has no host filesystem, network, environment variables or process spawning, and each render runs under memory caps and a CPU budget. Dependencies are fetched outside the sandbox, only from sources the Package declares, and pinned by digest in akua.lock.

What the sandbox does not cover

  • The manifests themselves. A Package can still render a privileged Pod or a cluster-admin binding. Gate what reaches a cluster with policy and admission control.
  • The first fetch of a dependency. A digest pin proves you get the same bytes again, not that the first bytes were good. Cosign verification of dependencies is opt-in, through a [signing] key in akua.toml.
  • Wasmtime itself. Wasmtime and akua’s host code are the trusted computing base.
The upstream security model lists every guarantee and limit, and why.md has the full evidence and advisory list.

Typed resources

Kubernetes versions and CRDs as typed dependencies.

Package format

The Input schema, @ui annotations and composition.

Akua

What akua is and how the platform uses it.

Error codes

Every structured error, including the render budgets.