DevOps Tools

Helm Values Diff, Merge & Convert

Compare two values.yaml files key by key, preview the values Helm will actually use when you layer an override on a chart's defaults, and translate between values.yaml and --set / --set-string flags with correct escaping.

Private by design: anything you enter is processed in your browser only. It is never uploaded to or logged on our servers. Values files are compared and merged in your browser, so credentials in them stay on your device unless you create a share link, which stores the inputs in the link itself.

Added 0 Removed 0 Changed 0 Unchanged 0

Keys that exist only on the left are listed as removed. To see what an override file actually produces on top of the defaults, use the Merge tab.

Key path Change Left Right

About Helm values

A Helm chart ships a values.yaml with defaults, and every install or upgrade layers your own values on top: files passed with -f / --values and individual overrides passed with --set. The chart's templates read the combined result through .Values. Most "why didn't my setting apply?" problems come from how that combination works, so this tool shows it explicitly.

Diff compares two values files key by key and lists every added, removed and changed setting by its dotted path, e.g. image.tag or ingress.annotations.cert-manager\.io/cluster-issuer (dots inside a key are escaped, exactly as you would write them for --set). Use it to review an upgrade by diffing the old and new chart defaults, or to see what an environment's override actually changes.

Merge applies Helm's coalescing rules: maps are merged recursively, while lists and scalar values are replaced as a whole. Setting a key to null in an override deletes it from the defaults, which is the documented way to remove a default such as an annotation. The result is what helm get values --all would report for a release installed with these two files, minus any parent-chart or --set layers.

Convert turns a values file into --set flags for CI scripts and back again. It escapes dots in keys and commas in values, writes list items as name[0]=…, and switches to --set-string where plain --set would change a string's type, such as an image tag of "1234" or a label of "true". Pasting a full helm upgrade command into the reverse direction shows the YAML those flags produce. Validate the rendered manifests with the Kubernetes YAML linter, or convert values to JSON for --set-json with the data format converter.

Reference Guide

Value precedence, lowest to highest (later sources win):

#SourceNotes
1Subchart's own values.yamlDefaults of a dependency chart
2Parent chart's values.yamlOverrides a subchart under its key, e.g. postgresql.auth.database, or via global
3-f / --values filesApplied left to right: in -f base.yaml -f prod.yaml, prod wins
4--set, --set-string, --set-json, --set-fileApplied after all files, by kind: --set-json, then --set, then --set-string, then --set-file. Repeated flags of the same kind apply left to right, so the last one wins

On helm upgrade, previous release values are not reused unless you pass --reuse-values (or --reset-then-reuse-values); otherwise the chart defaults plus the values on the current command line are used.

--set syntax:

FlagYAML result
--set name=valuename: value
--set a=b,c=da: b and c: d
--set outer.inner=valueouter: { inner: value }
--set name={a,b,c}name: [a, b, c] (quote the argument in your shell)
--set servers[0].port=80servers: [ { port: 80 } ]
--set name=value1\,value2name: "value1,value2"
--set 'nodeSelector.kubernetes\.io/role=master'nodeSelector: { kubernetes.io/role: master }
--set name=nullRemoves name from the defaults
--set port=8080 / --set debug=trueInteger / boolean. Floats such as 0.5 stay strings
--set-string tag=1234tag: "1234" (always a string)
--set-json 'resources={"limits":{"memory":"256Mi"}}'Any JSON value, including floats, {} and []
--set-file config=./app.tomlconfig: set to the file's contents

In templates, read values as {{ .Values.image.tag }}. For keys with dashes or dots use {{ index .Values.podAnnotations "prometheus.io/scrape" }}.

Useful commands:

  • helm show values bitnami/nginx > values.yaml: download a chart's defaults to start an override file.
  • helm template my-release ./chart -f values-prod.yaml --set image.tag=1.4.2: render the manifests locally without installing.
  • helm get values my-release: the user-supplied values of a release; add --all for the full computed values and --revision N for an older revision.
  • helm upgrade my-release ./chart -f values-prod.yaml --dry-run=server: see what an upgrade would apply.
  • helm diff upgrade my-release ./chart -f values-prod.yaml: manifest-level diff (requires the helm-diff plugin).

Example input

# values.yaml (chart defaults)
replicaCount: 1
image:
  repository: nginx
  tag: "1.25.3"
ingress:
  enabled: false
  annotations:
    kubernetes.io/ingress.class: nginx

# values-prod.yaml (override)
replicaCount: 3
image:
  tag: "1.27.0"
ingress:
  enabled: true
  annotations:
    kubernetes.io/ingress.class: null
    cert-manager.io/cluster-issuer: letsencrypt

This sample loads automatically when you open the tool. Use Load Sample to bring it back.

Frequently Asked Questions

Maps are merged key by key, while lists and scalar values are replaced entirely by the later file. A key set to null removes it. Files passed with -f are applied left to right, then --set flags override everything.

Use dots for nesting and brackets for list items, for example --set image.tag=1.2.3 or --set ingress.hosts[0].host=example.com. Escape literal dots or commas in keys with a backslash.

Use it when a value looks like a number or boolean but must stay a string, such as a version 1.10 or a zip code with a leading zero.