flate — GitOps CLI tool screenshot
GitOps CLI

flate: Best GitOps CLI for Flux Maintainers in 2026

7 min read·

flate replaces the usual kind plus kubectl plus helm plus kustomize stack with one static Go binary that renders, diffs, and tests Flux repos offline, and changed-only mode can collapse single-file reviews to tens of milliseconds.

Pricing

Open-Source

Tech Stack

Go, Flux v2, Helm, Kustomize, go-git, oras-go, dyff

Target

Flux maintainers

Category

GitOps CLI

What Is flate?

flate is a Go-based offline renderer and diff engine for Flux GitOps repositories built by home-operations. flate is one of the best GitOps CLI tools for Flux maintainers because it replaces the usual kind plus helm plus kustomize plus kubectl stack with one static binary, no cluster access, and no shellouts. It parses Flux source and workload objects locally, and changed-only mode can shrink single-file diffs to tens of milliseconds on real home-ops repos.

Quick Overview

AttributeDetails
TypeGitOps CLI
Best ForFlux maintainers
Language/StackGo, Flux v2, Helm, Kustomize, go-git, oras-go, dyff
LicenseN/A
GitHub StarsN/A as of Feb 2026
PricingOpen-Source
Last ReleaseN/A

Who Should Use flate?

  • Flux maintainers who need to render Kustomization and HelmRelease changes before merge without booting a cluster.
  • Platform engineers managing nested Flux trees, shared components, and image automation that must be validated in CI.
  • CI owners who want deterministic exit codes, path-aware diffs, and output that is small enough to review in a pull request.
  • Home-ops operators who run GitOps from a laptop, a git worktree, or a GitHub Actions runner and do not want controller dependencies.

Not ideal for:

  • Teams that require live reconciliation, admission webhooks, or controller-runtime side effects from a real cluster.
  • Repos that depend on SOPS decryption, because spec.decryption is not implemented in flate.
  • Workflows that depend on provider-specific bucket auth or cloud secret backends instead of static credentials.

Key Features of flate

  • Static, single-binary execution — flate collapses the usual Flux validation stack into one executable, so CI does not need helm, kustomize, flux, or kubectl installed. That cuts dependency drift and removes shellouts entirely.
  • Offline reconcile pipelineget, build, diff, and test all run the same local reconciliation flow before they emit output. Git, OCI, Helm, Bucket, and remote kustomize sources must still be reachable, but the execution happens without a live Kubernetes API server.
  • Changed-only mode--path-orig diffs two trees, walks ownership backward through the longest matching Flux spec.path, and reconciles only the touched subtree plus content dependencies. The result is fast enough to make single-file reviews feel instant on small home-ops repos.
  • Kubernetes-aware diffsdiff uses dyff in GitHub output mode and matches list entries by identifier, not by raw array position. A reordered container or env var shows as an order change instead of a noisy wall of value churn.
  • Broad Flux source support — flate handles GitRepository, OCIRepository, HelmRepository, HelmChart, Bucket, and ExternalArtifact, with source-specific auth handling for HTTPS, SSH, Docker config, and static cloud-style credentials. Bucket intentionally rejects AWS, GCP, and Azure provider auth so failures are explicit.
  • Safety and filter controls--skip-secrets and --skip-crds default to true, which keeps manifest output focused on app logic instead of generated noise. --allow-missing-secrets soft-skips missing auth refs when offline CI cannot materialize them, while verify and TLS-related refs still fail loud.
  • Flux behavior parity where it matters — flate honors spec.suspend, spec.dependsOn[].readyExpr CEL evaluation, substitution opt-out labels and annotations, and signature verification paths for OCI and Git sources. That keeps the offline result close to what Flux controllers would do in-cluster.

flate vs Alternatives

ToolBest ForKey DifferentiatorPricing
flateOffline Flux repo rendering and diffingOne static binary, changed-only mode, no shelloutsOpen-Source
flux-localFlux repo inspection with the older implementationOriginal project that flate rewrites in GoOpen-Source
helm + kustomize + kubectl + fluxManual debugging on a workstationMaximum familiarity, minimum abstractionFree / Open-Source
Native Flux controllers in kindFull-fidelity controller behaviorReal reconciliation loop with a disposable clusterFree / Open-Source

Pick djevops if the problem is broader deployment automation instead of repo rendering. Pick awsim if your tests need AWS-shaped local dependencies alongside GitOps diffs.

Use flate instead of flux-local when you want a Go-native binary that is easier to vendor in CI and less dependent on external CLIs. Use the raw CLI stack when you are debugging one broken manifest and want every command exactly as the controller ecosystem expects it. Use a kind cluster when you need admission, reconciliation timing, or controller side effects that offline rendering cannot model.

How flate Works

flate builds a local Flux object graph, resolves sources through native libraries, and then runs the same reconcile pipeline that powers get, build, diff, and test. Helm, Kustomize, go-git, and oras-go are linked as libraries, so the process stays in-process instead of spawning subprocesses for every render step. That design keeps the binary small enough for CI and predictable enough for repeatable diffs.

The core abstraction is a path-scoped reconcile rooted at --path, with --path-orig enabling a second tree for change detection. flate computes the touched subtree, walks backward through Flux ownership, and keeps only the resources that influence the changed path. Immutable refs can reuse cache entries, while mutable refs refresh on their Flux interval, which makes the offline result deterministic without pretending the source graph never changes.

git worktree add ../baseline main
flate diff ks --path ./kubernetes --path-orig ../baseline/kubernetes

That sequence creates a baseline tree and asks flate to compare the current kubernetes subtree against it. The command emits a Flux-aware diff instead of a raw file diff, so the output shows rendered resources, not just YAML text. If the repo uses remote sources, those sources must still be reachable because flate renders the full graph before filtering.

Pros and Cons of flate

Pros:

  • Removes the kind cluster dependency for most repo validation workflows.
  • Speeds up pull request review by reconciling only the changed subtree in --path-orig mode.
  • Emits K8s-aware diffs that reduce reorder noise in lists, maps, and generated manifests.
  • Supports the major Flux source kinds and their common auth paths without requiring shellouts.
  • Works well in GitHub Actions, local terminals, and containerized CI because the distribution options are simple.
  • Gives explicit skip and strip controls, so reviewers can tune signal versus noise per command.

Cons:

  • Does not implement SOPS decryption, so encrypted Secret values are wiped to placeholders instead of being decrypted.
  • Cannot reproduce live-cluster behavior such as admission webhooks, finalizers, or controller race conditions.
  • Requires reachable remote sources for Git, OCI, Helm, and other external inputs, so it is not fully air-gapped by default.
  • Treats some source kinds conservatively, such as Bucket provider auth, which fails loud instead of guessing cloud credentials.
  • Default secret and CRD stripping can hide output if you forget to disable the filters for a full manifest review.

Getting Started with flate

The fastest path is to install the binary, point it at a Flux tree, and compare it against a baseline checkout. flate supports Homebrew, go install, Docker, and a GitHub Actions workflow, so you can adopt it without changing the rest of your pipeline.

brew install --cask home-operations/tap/flate
flate get ks --path ./kubernetes
flate diff all --path ./kubernetes --path-orig ../baseline/kubernetes

After the install, get gives you a summary of the Flux resources in the tree and diff shows the rendered delta against a baseline path. If you want changed-only mode to be meaningful, create the baseline with git worktree add ../baseline main or another clean reference branch, then run flate test all to fail the job on any resource-level regression.

Verdict

flate is the strongest option for offline Flux repo validation when you need CI-speed diffs without a cluster. Its biggest strength is the changed-only reconcile path backed by native Helm and Kustomize libraries, but SOPS decryption and live-controller behavior are still out of scope. Use flate when render fidelity matters more than cluster execution, and pair it with a real cluster only for the cases it cannot model.

Frequently Asked Questions

Looking for alternatives?

Compare flate with other GitOps CLI tools.

See Alternatives →

You Might Also Like