• Drop support for versions of Python below 3.6.


  • Add support for reading configuration values from environment variables (see EnvSource).
  • Resolve a possible race condition when creating configuration directories.


  • A new Configuration.reload method makes it convenient to reload and re-parse all YAML files from the file system.


  • A new MappingValues template behaves like Sequence but for mappings with arbitrary keys.
  • A new Optional template allows other templates to be null.
  • Filename templates now have an option to resolve relative to a specific directory. Also, configuration sources now have a corresponding global option to resolve relative to the base configuration directory instead of the location of the specific configuration file.
  • There is a better error message for Sequence templates when the data from the configuration is not a sequence.


  • pathlib.PurePath objects can now be converted to Path templates.
  • AttrDict now properly supports (over)writing attributes via dot notation.


  • Break up the confuse module into a package. (All names should still be importable from confuse.)
  • When using None as a template, the result is a value whose default is None. Previously, this was equivalent to leaving the key off entirely, i.e., a template with no default. To get the same effect now, use confuse.REQUIRED in the template.


  • float values (like 4.2) can now be used in templates (just like 42 works as an int template).
  • The Filename and Path templates now correctly accept default values.
  • It’s now possible to provide custom PyYAML Loader objects for parsing config files.


  • A new Path template produces a pathlib Path object.
  • Drop support for Python 3.4 (following in the footsteps of PyYAML).
  • String templates support environment variable expansion.


The first stable release, and the first that beets depends on externally.