Chris Collins

Tools · containers

Helm and Kustomize renderer

Render a Helm chart or a Kustomize overlay to plain YAML in the browser — with Helm's and Kustomize's own code compiled to WebAssembly — and see which values file or --set won each key, errors pointing at the template line, NOTES.txt, and what differs between two overlays.

Added

Works with

How to use it

Paste or drop a chart, add your values files and --set flags, and get exactly what helm template prints. Or drop a Kustomize tree and build any overlay, then compare it with another. Nothing is sent anywhere: the renderer is Helm’s and Kustomize’s own Go code compiled to WebAssembly and run in the page.

How to use it

Helm

  1. Load a chart. Example chart loads a small web-service chart with a Redis subchart, a migration hook, a test, a values schema and a NOTES.txt. Open .tgz or files takes a packaged chart (helm package / helm pull output) or loose files; Open chart folder or dropping a folder on the page takes a chart directory as it is on disk. Edit any file in place; the .helmignore is honoured.

  2. Values and flags. Add values files on the right, then write the command as you would run it — helm template shop ./webapp -n prod -f values-prod.yaml --set replicaCount=4 — or just the flags. -f names one of the values files (or a file inside the chart). --set, --set-string, --set-json, --set-literal and --set-file parse exactly as Helm parses them (escaped commas, a[0].b=…, JSON values); so do -n, --kube-version, --api-versions, --is-upgrade, --include-crds, --skip-tests, --no-hooks and --skip-schema-validation. The chips under the command show the order Helm merges them in: every -f file first, then --set-json, --set, --set-string, --set-file, --set-literal — the command-line order only matters within each kind.

  3. Render (or ⌘/Ctrl+Enter; after the first render it re-renders as you type).

    • Output is byte for byte what helm template prints: manifests sorted in Helm’s install order, # Source: lines, then hooks.

    • By template lists each document with its template, kind, name and hook.

    • Values is the final .Values with, for each key, the file or flag that won and what it overrode. Keys that no values.yaml declares are flagged, with the closest declared key when it looks like a typo (replicaCuont → replicaCount).

    • NOTES.txt is what helm install would print.

  4. Errors show Helm’s message and a link to each template location it names (templates/job-migrate.yaml:20:45); the link opens the file at that line. For YAML errors Helm’s line number counts lines of the rendered template, not the source.

Functions work as in Helm 4: Sprig, include, tpl, required, toYaml, fromYaml, toToml, .Files.Get, .Files.Glob, AsConfig, AsSecrets, .Capabilities (Kubernetes v1.36 by default — change it with --kube-version and add APIs with --api-versions), values.schema.json validation, dependency conditions, tags, aliases and import-values, library charts. lookup returns an empty map, as it does in helm template. Dependencies must already be in charts/ (as after helm dependency build); nothing is downloaded from a chart repository.

Kustomize

  1. Load files. Example overlays loads a base, a metrics component and dev and prod overlays. Open folder (or drop one) takes your repository’s kustomize tree; paths are kept relative to the folder you pick.

  2. Build any directory with a kustomization.yaml. The output matches kubectl kustomize (v5.8.1): resources, patches (strategic merge and JSON 6902, by path or inline, with target selectors), namePrefix/nameSuffix, namespace, labels/commonLabels, commonAnnotations, images (tags and digests), replicas, configMapGenerator and secretGenerator with their hash suffixes (and the references to them rewritten), replacements, components and sortOptions. Output order can force legacy or no reordering, like --reorder.

  3. Layers shows the chain the overlay builds — overlay, bases, components — and what each one sets, with notes on deprecated fields.

  4. Compare builds a second directory (say overlays/dev against overlays/prod) and lists the resources that differ, with a line diff for each. Resources are paired by kind and name, and then by the closest name, so dev-shop and prod-shop-eu line up even though prefixes, suffixes and generator hashes differ.

Remote bases (URLs and git), helmCharts and KRM function plugins are not supported — they need the network or other programs.

Hand-offs

Lint in devops-yaml opens the output in the Kubernetes checker (Secret values are replaced with REDACTED first). Check scheduling sends the first Deployment, StatefulSet, DaemonSet, Job or Pod to the scheduling explainer. To write manifests from scratch use the manifest builder; for the commands that apply them, the kubectl helper.

How it was checked

The tests render a set of charts and overlays (this page’s examples, a chart with a library chart, aliased and conditional subcharts, import-values, .Files globs, CRDs, hooks and tests, a packaged .tgz, and Kustomize trees with file and env generators, replacements, label-selector patches and FIFO ordering) and compare the result with what Helm v4.2.3 and kubectl kustomize v5.8.1 print for the same input — byte for byte — and Helm’s error messages word for word for missing required values, schema violations, nil pointers, template and YAML parse errors and an incompatible kubeVersion.

Browser support

Any current browser with WebAssembly (Chrome, Edge, Firefox, Safari). The renderer is about 8 MB compressed (36 MB once unpacked), downloaded the first time you render and cached by the browser after that. Rendering takes milliseconds.

Privacy

Charts, values and overlays stay in your browser: they are saved in this browser’s local storage so the page reopens where you left it, and nothing is uploaded. The only download is the renderer itself, from this site (/wasm/k8s-render/). A share link carries the chart or overlay files in the link itself, so don’t share one that contains secrets.

Licences

Helm and Kustomize are © The Helm Authors and The Kubernetes Authors, under the Apache License 2.0. The WebAssembly build uses Helm v4.2.3 and Kustomize API v0.21.1 with three small changes so that it does not link the Kubernetes client: the default API version list is compiled in, the client-go version is a constant, and the cluster-backed lookup is removed (it returns an empty result, as in helm template). The build script, the patch and the wrapper are published at /wasm/k8s-render/.

Runs entirely in your browser; nothing you type leaves this page.