NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #792 most downloaded on crates.io
Layered configuration system for Rust applications.
Last release 8 days ago
30 Sep 2026
Release timing varies
gaps range from 8 days to 4 months
Most releases are documented
notes for 51 of 59 stable releases
Nothing withdrawn
no release was ever pulled
11 years old
59 releases · first in 2015
chore: Release config version 0.15.27
chore: Release config version 0.15.27
chore: Release config version 0.15.26
chore: Release config version 0.15.26
One column per quarter.
chore: Release config version 0.15.25
chore: Release config version 0.15.25
chore: Release config version 0.15.24
chore: Release config version 0.15.24
chore: Release config version 0.15.23
chore: Release config version 0.15.23
Environment::convert_case: correctly apply casing to each key segmentchore: Release config version 0.15.22
chore: Release config version 0.15.22
chore: Release config version 0.15.21
chore: Release config version 0.15.21
chore: Release config version 0.15.20
chore: Release config version 0.15.20
chore: Release config version 0.15.19
chore: Release config version 0.15.19
chore: Release config version 0.15.18
chore: Release config version 0.15.18
chore: Release config version 0.15.17
chore: Release config version 0.15.17
chore: Release config version 0.15.16
chore: Release config version 0.15.16
*(json5)* Correctly deserialize null (regressed in 0.15.14)
null (regressed in 0.15.14)*(json5)* Reduce overhead when loading json5 files
Skip UTF-8 BOMs when reading files
### Performance - Upgrade to toml v0.9
toml v0.9Deserialize YAML real keys as strings
Deserialize YAML boolean keys as strings
Provided more jumping off points in the documentation
yaml-rust2 0.10Don't panic on non-unicode env variable names and values
### Internal - Update a dependency
Fix regression from 0.15.3 with reading a table from an empty config
Include the key on all serde errors
key on all serde errors### Performance - Reduce TOML build times
### Internal - Clean ups
Provide an error message on path parsing errors (regression from 0.15.0)
Don't crash on get(arr[-1]) on empty arrays
get(arr[-1]) on empty arraysset_override(arr[-1]) on empty arraysConfigError is no longer exhaustive
ConfigError is no longer exhaustiveConfigError::Parses type changedFileFormat is no longer exhaustiveRemove dependency on lazy_static
lazy_static[#480] Hide and deprecate AsyncConfigBuilder
This is a maintenance release, mostly to get some dependency updates out, but also with some fixes and changes that have piled up over a rather long time.
Nothing published for this version
Please note that we had to update the MSRV for this crate from 1.56.0 to 1.59.0 for this patch release being possible, because a transitive dependency
Please note that we had to update the MSRV for this crate from 1.56.0 to 1.59.0 for this patch release being possible, because a transitive dependency did update its MSRV.
Clone trait derive to builder statesBackport of [#316] to be testing with temp_env. The backport was necessary to be able to backport the next change. This change shouldn't be user-visib
typo in doc comment for ConfigBuilder [#299]
Prefix-Separator support was added [#292]
HJSON support was removed [#230]
Format trait for (custom) file formats #219The Config type got a builder-pattern with_merged() method [#166].
Config type got a builder-pattern with_merged() method #166.Config::set_once() function was added, to set an value that can be
overwritten by Config::mergeing another configuration #172Allow enums as configuration keys [#119]
Remove lowercasing of keys (unless the key is coming from an environment variable).
Support deserializing to a struct with #[serde(default)] [#106]
#[serde(default)] #106Support reading enums from configuration. [#85]
Allow Environment variable collection to ignore empty values. [#78] `rust // Empty env variables will not be collected Environment::with_prefix("APP")
// Empty env variables will not be collected
Environment::with_prefix("APP").ignore_empty(true)
Breaking Change: Environment does not declare a separator by default. ```rust // 0.8.0 Environment::with_prefix("APP")
Update lazy_static and yaml_rust
Be compatible with nom's verbose_errors feature (#50)[https://github.com/rust-cli/config-rs/pull/50]
derive(PartialEq) for Value (#54)[https://github.com/rust-cli/config-rs/pull/54]Fix conflict with serde_yaml. [#39]
serde_yaml. #39Implement Source for Config.
Implement serde::de::Deserializer for Config. my_config.deserialize may now be called as either Deserialize::deserialize(my_config) or my_config.try_into().
Remove ConfigResult. The builder pattern requires either .try_into as the final step or the initial Config::new() to be bound to a slot. Errors must also be handled on each call instead of at the end of the chain.
let mut c = Config::new();
c
.merge(File::with_name("Settings")).unwrap()
.merge(Environment::with_prefix("APP")).unwrap();
let c = Config::new()
.merge(File::with_name("Settings")).unwrap()
.merge(Environment::with_prefix("APP")).unwrap()
// LLVM should be smart enough to remove the actual clone operation
// as you are cloning a temporary that is dropped at the same time
.clone();
let mut s: Settings = Config::new()
.merge(File::with_name("Settings")).unwrap()
.merge(Environment::with_prefix("APP")).unwrap()
.try_into();
Implement Source for Vec and Vec >
Implement Source for Vec<T: Source> and Vec<Box<Source>>
Config::new()
.merge(vec![
File::with_name("config/default"),
File::with_name(&format!("config/{}", run_mode)),
])
Implement From<&Path> and From<PathBuf> for File
Remove namespace option for File
Add builder pattern to condense configuration
Config::new()
.merge(File::with_name("Settings"))
.merge(Environment::with_prefix("APP"))
.unwrap()
Parsing errors even for non required files – @Anthony25 ( #33 )
Added config category to Cargo.toml
config.get has been changed to take a type parameter and to deserialize into that type using serde. Old behavior (get a value variant) can be used by
config.get has been changed to take a type parameter and to deserialize into that type using serde. Old behavior (get a value variant) can be used by passing config::Value as the type parameter: my_config.get::<config::Value>(".."). Some great help here from @impowski in #25.File. This is likely temporary. I do want this behavior but I can see how it should be optional. See #35File::with_name to get automatic file format detection instead of manual FileFormat::* – @JordiPolomy_config.refresh() will do a full re-read from the source so live configuration is possible with some work to watch the fileNothing published for this version
Remove global ( config::get ) API — It's now required to create a local configuration instance with config::Config::new() first.
Remove global ( config::get ) API — It's now required to create a local configuration instance with config::Config::new() first.
If you'd like to have a global configuration instance, use lazy_static! as follows:
use std::sync::RwLock;
use config::Config;
lazy_static! {
static ref CONFIG: RwLock<Config> = Default::default();
}
Nothing published for this version
Deep merging of sources (was shallow)
config::File::from_str to parse and merge a file from a stringconfig::get_table and config::get_array<!-- next-url --> [Unreleased]: https://github.com/rust-cli/config-rs/compare/v0.15.27...HEAD [0.15.27]: https://github.com/rust-cli/config-rs/compare
Initial release.
<!-- next-url --> [Unreleased]: https://github.com/rust-cli/config-rs/compare/v0.15.27...HEAD [0.15.27]: https://github.com/rust-cli/config-rs/compare/v0.15.26...v0.15.27 [0.15.26]: https://github.com/rust-cli/config-rs/compare/v0.15.25...v0.15.26 [0.15.25]: https://github.com/rust-cli/config-rs/compare/v0.15.24...v0.15.25 [0.15.24]: https://github.com/rust-cli/config-rs/compare/v0.15.23...v0.15.24 [0.15.23]: https://github.com/rust-cli/config-rs/compare/v0.15.22...v0.15.23 [0.15.22]: https://github.com/rust-cli/config-rs/compare/v0.15.21...v0.15.22 [0.15.21]: https://github.com/rust-cli/config-rs/compare/v0.15.20...v0.15.21 [0.15.20]: https://github.com/rust-cli/config-rs/compare/v0.15.19...v0.15.20 [0.15.19]: https://github.com/rust-cli/config-rs/compare/v0.15.18...v0.15.19 [0.15.18]: https://github.com/rust-cli/config-rs/compare/v0.15.17...v0.15.18 [0.15.17]: https://github.com/rust-cli/config-rs/compare/v0.15.16...v0.15.17 [0.15.16]: https://github.com/rust-cli/config-rs/compare/v0.15.15...v0.15.16 [0.15.15]: https://github.com/rust-cli/config-rs/compare/v0.15.14...v0.15.15 [0.15.14]: https://github.com/rust-cli/config-rs/compare/v0.15.13...v0.15.14 [0.15.13]: https://github.com/rust-cli/config-rs/compare/v0.15.12...v0.15.13 [0.15.12]: https://github.com/rust-cli/config-rs/compare/v0.15.11...v0.15.12 [0.15.11]: https://github.com/rust-cli/config-rs/compare/v0.15.10...v0.15.11 [0.15.10]: https://github.com/rust-cli/config-rs/compare/v0.15.9...v0.15.10 [0.15.9]: https://github.com/rust-cli/config-rs/compare/v0.15.8...v0.15.9 [0.15.8]: https://github.com/rust-cli/config-rs/compare/v0.15.7...v0.15.8 [0.15.7]: https://github.com/rust-cli/config-rs/compare/v0.15.6...v0.15.7 [0.15.6]: https://github.com/rust-cli/config-rs/compare/v0.15.5...v0.15.6 [0.15.5]: https://github.com/rust-cli/config-rs/compare/v0.15.4...v0.15.5 [0.15.4]: https://github.com/rust-cli/config-rs/compare/v0.15.3...v0.15.4 [0.15.3]: https://github.com/rust-cli/config-rs/compare/v0.15.2...v0.15.3 [0.15.2]: https://github.com/rust-cli/config-rs/compare/v0.15.1...v0.15.2 [0.15.1]: https://github.com/rust-cli/config-rs/compare/v0.15.0...v0.15.1 [0.15.0]: https://github.com/rust-cli/config-rs/compare/v0.14.1...v0.15.0 [0.14.1]: https://github.com/rust-cli/config-rs/compare/0.14.0...v0.14.1
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →