MSRV & Features
What each feature unlocks, and why it is a choice, is the Cargo Features chapter's subject. What follows is the cost side — the compiler floor, and how it is kept honest.
Minimum supported Rust version
Rust 1.88, one number, org-wide. The engine, the macros, the CLI,
the no_std crate, every store crate, both binding crates and the web
adapters all declare 1.88; the single exception is the Loco adapter,
which follows Loco itself at 1.94. The
Compatibility Contract makes the standing
promise: the floor moves only in a release whose changelog announces
it.
| Configuration | MSRV |
|---|---|
the engine, any feature set — formats, watch, schema, age, tokio, tracing, telemetry, ini, properties | 1.88 |
dynamic-config-cli, dynamic-config-embedded | 1.88 |
every store crate incl. dynamic-config-store-core and the config server | 1.88 |
dynamic-config-python / -python-remote (build from source) | 1.88, and CPython 3.9+ through abi3 — plus 3.14t, which is not abi3 (see below) |
dynamic-config-node / -node-remote (build from source) | 1.88, Node 18+ |
dynamic-config-web-core, -tower, -axum, -actix | 1.88 |
dynamic-config-loco | 1.94 (Loco's own floor) |
Why one number
Until 0.7.0 the floor was a ladder — 1.71 core, 1.74 schema, 1.85
watch/age, 1.80–1.88 across the companions — and the ladder had a
real cost: three security advisories (time, serde_with, the AWS
SDK) had reachable fixes that the lowest rungs could not take, so the
fixes lived in ignore ledgers instead of lockfiles. The 1.88 raise
turned every one of those ledger entries into an ordinary dependency
update. That trade — a higher floor for real fixes instead of recorded
exceptions — is the security-first policy the
Compatibility Contract commits to.
Older toolchains are not stranded: the workspace sets
resolver.incompatible-rust-versions = "fallback" in
.cargo/config.toml, so a pre-1.88 cargo resolves the last release
published under the old floor. Those versions are end-of-life —
they build, they are not supported. Generating a fresh lockfile needs
cargo 1.84+ either way.
The Python floor's second dimension
The interpreter. One abi3 wheel per platform covers CPython 3.9
upwards, which is why the wheel carries no per-version matrix — but a
free-threaded interpreter has no stable ABI, so dynamic-config-py
also ships a cp314t manylinux wheel, built against that interpreter
specifically. abi3 is a default Cargo feature the build switches
off; what selects the ABI is which interpreter maturin is pointed
at. 3.14t and not 3.13t: PyO3 0.29 dropped 3.13t when CPython promoted
free-threading to supported in 3.14.
Free-Threaded CPython
is the audit behind the declaration.
How the floor is kept honest
The CI msrv matrix compiles every feature set — and the CLI and
embedded crates — at exactly 1.88 with --locked; a dependency that
quietly demands more fails the row that names it. MSRV movement is a
breaking change in spirit whatever semver says about it, and the
changelog treats it as one.
What each feature weighs
Generated by scripts/dependency-weight.sh; regenerate after any
dependency change and commit the diff — a column that drifts silently
is a cost nobody agreed to.
| feature set | crates in tree | clean check (s) |
|---|---|---|
--no-default-features --features json | 35 | 0 |
json,toml,yaml | 52 | 0 |
full | 237 | 3 |