BUSL-1.1 · source available

Compile scattered configuration into one validated model — then resolve an exact, reproducible config for any product or deployment.

The same inputs always produce the same bytes. Built for teams shipping many variants of a system from shared building blocks — and for anyone who needs configuration to be auditable and bit-for-bit reproducible.

configflux · compile → resolve
$ configflux-compiler compile \
    --source .../00_definitions.json \
    --source .../10_components.json --out build
$ cfx resolve --model build/cmp.manifest.json \
    --select cooling_brand=hydra --select cooling_model=x200 \
    --select pump_type=dual --select region=eu --out snapshot
model_hash: f8a6f2fb…
selection_state_hash: d8412156…
resolve_hash: 8eda451d…
resolved_output_hash: c2a0142a…
wrote: generated/config.hpp
wrote: resolve_result.all.hydra-x200-dual-eu.json
same inputs → same bytes
The problem

Managing many configuration variants by hand drifts, and can't be reproduced. ConfigFlux makes configuration deterministic and auditable: a typed model you validate once, and resolve into an exact config — the same bytes, every time.

01 / How it works

One pipeline — from CUE chunks to a live runtime

Every stage is typed and deterministic. Nothing is resolved twice the same way by accident — it's the same way by construction.

ConfigFlux pipeline: author, compile, resolve, serve CUE chunks are compiled into a 150 percent model, resolved into a strict 100 percent model, and served by the runtime, which delivers resolved configuration to consumers over a stable CLI, a first-party C++ SDK, ROS 2 adapters, and a versioned C ABI for any language or your own stack. Compile Resolve Serve CUEchunks 150%model 100%model Runtimelive system CLI C++ ROS 2 any language · your stack
C++ headers build flags artifact manifests software BOM runtime config
01 — Author

Decentralized CUE configuration chunks — your shared, typed building blocks.

02 — Compile

Merge and validate into the 150% model (a typed graph); emit a hash-addressable Compiled Model Package (CMP).

03 — Resolve

Apply late-binding selections to resolve the strict 100% model; export generated C++ headers, build flags, manifests, and a software BOM.

04 — Serve / Run

The runtime delivers resolved config to a live system — deterministic delta-first sync, a layered store, commit/rollback, and an event bus.

02 / Key features

Rigorous where it matters, honest about the rest

Deterministic by construction

Outputs are canonicalized and hashed. The same inputs always produce the same bytes — and the same hashes.

Scenario packs

Reusable product families for robotics, industrial automation and building systems — a starting point, not a blank page.

Bazel-only, hermetic build

One command, fully sandboxed and reproducible. No surprise dependencies leaking in from your host.

Staged pipeline

Compiler → interpreter → runtime, driven by the one-shot cfx CLI, with a first-party C++ SDK and ROS 2 adapters for embedding in real systems.

Integrate from anywhere

Resolved configuration ships as plain files, a stable CLI (JSON in/out), and a versioned C ABI — read it from any language, subprocess the CLI, or bind the ABI. First-party C++ and ROS 2 SDKs included.

Auditable outputs

Resolved models, generated headers, build flags, manifests, and a first-party software BOM — all inspectable.

Constraints you can question

cfx options lists what a deployment may still choose. cfx explain names the rule behind a refused choice in the author's own words — the requirement and the entries it accepts, or the binding that fixed a value.

Typed catalogues and bindings

Declare a typed table once, as data; a binding is one shared choice from it per deployment. Components declare what they requires and may narrow it to what they accepts — two components naming the same binding receive the same entry by construction, and an empty intersection is refused at compile time.

Environments state only free decisions

The constraints decide the rest, reported as implied: choices. One manifest resolves every environment (cfx resolve --manifest … --all), resolved_output_hash separates a real configuration change from an unrelated model edit, and cfx diff exits non-zero exactly when a running service would receive different values.

Compose across repositories

compile-object compiles one unit into a content-addressed object against the interfaces it depends on, and link assembles objects into the same package the one-shot compiler produces. A lockfile pins the object hashes an integration expects, and unchanged units are reused byte for byte.

Signed releases

Release binaries are cryptographically signed, so you can verify exactly what you're running.

Requirement traceability

Behavior maps back to tracked requirements, so your guarantees are auditable — not just asserted.

03 / Quickstart

Up and running in one command

Grab a signed release, or build from source. Either way it's hermetic and reproducible.

$ git clone https://github.com/configflux/configflux
$ cd configflux
$ bazel build //...
$ bazel test //...
Requires Bazel (via Bazelisk), a C++20 toolchain, and Git. Rust is fetched hermetically.
Browse the worked examples in the repo →
04 / Concepts

A small glossary

SPL

Software product line — a family of related systems built from shared, configurable building blocks.

150% model

The superset model containing every option and variant, before any resolution is applied.

100% model

The fully resolved configuration for one specific product or deployment.

CUE

The typed configuration language used to author and constrain chunks.

CMP

Compiled Model Package — the hash-addressable artifact the compiler emits from the validated 150% model.

CCM

Compiled Constraint Model — the compiled solver form emitted alongside the CMP, in the package's ccm/ directory: a symbol table plus a reduced ordered binary decision diagram the solver queries to decide which options remain valid.

Catalogue / binding

A typed table of named entries, declared once as data. A binding is one shared choice of an entry from it — chosen per deployment, and explained like any other facet.

05 / Who it's for

Built for variants you can't afford to get wrong

If you ship many configurations of the same system — and someone needs to prove which one shipped — this is for you.

Device fleets

Many units, many firmware and feature combinations, one source of truth.

Industrial automation

Cells and lines configured per site, with an audit trail for each.

Building systems

HVAC and controls tuned per building from shared, validated blocks.

Multi-environment deploys

Dev, staging and production resolved from one model — no drift.

SCENARIO PACKS — same engine, increasing complexity
water pump → wind turbine → automation cell → mobile robot → building HVAC
Status — early and source-available

ConfigFlux is validated for small to mid-size models today: deterministic compilation, validation, resolution, and signed, hashed outputs all work end to end.

Very large or densely-constrained models are an area of active research — we don't claim to handle arbitrarily large problems yet. The measured performance benchmarks report exactly the workloads validated for this release. Licensed BUSL-1.1 (source available).

See what's shipped →
06 / Docs

Learn more

Design overview↗
How the compiler, interpreter and runtime fit together.
Model spec↗
The 150% / 100% model and how resolution is defined.
Worked examples↗
End-to-end runnable examples, from a minimal model to a fleet composed across four repositories.
Interface contracts↗
The frozen compiler / interpreter / runtime API envelopes, diagnostics, and hash semantics.
Toolchain image↗
Run the toolchain from a signed container: invocation contract and verification recipe.
Model explorer↗
A local, read-only web UI for compiled models, resolved snapshots and explain reports.
Security policy↗
Reporting, signed releases and disclosure.

Make configuration reproducible.

Build from source in one command, or grab a signed binary. Source-available under BUSL-1.1; free for production use under the license grant.

Get started → View on GitHub