Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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.

ConfigurationMSRV
the engine, any feature set — formats, watch, schema, age, tokio, tracing, telemetry, ini, properties1.88
dynamic-config-cli, dynamic-config-embedded1.88
every store crate incl. dynamic-config-store-core and the config server1.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, -actix1.88
dynamic-config-loco1.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 setcrates in treeclean check (s)
--no-default-features --features json350
json,toml,yaml520
full2373