# Changelog

## [v3.9.1](https://github.com/Kyorai/cuttlefish/tree/v3.9.1) (2026-05-29)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v3.9.0...v3.9.1)

**Enhancements:**

 - Erlang/OTP 29 compatibility: replaced deprecated prefix-`catch` expressions with `try ... catch ... end`. CI matrix now covers Erlang 26 through 29

## [v3.9.0](https://github.com/Kyorai/cuttlefish/tree/v3.9.0) (2026-05-29)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v3.8.0...v3.9.0)

**Enhancements:**

 - `allow_infinity` shortcut atom in integer/float/bytesize/duration constraint lists: accepts the atom `infinity` (also the matching string a conf file produces) alongside the numeric form
 - Range constraints on `bytesize`: `{bytesize, [{min, N}, {max, N}, {gt, N}, {lt, N}]}`, plus the `non_negative` and `positive` shortcuts
 - Range constraints on durations: `{duration, Unit, [Constraints]}` mirroring the integer/float syntax, with the bound expressed in the declared unit
 - `{validator, Fun}` and `{validator, Name}` entries inside an integer/float/bytesize/duration constraint list. Constraints run left-to-right; first failure wins
 - 5-tuple validator form: `{validator, Name, Desc, Fun, Options}`. Options accept `{aliases, [Name]}` (rename a validator without breaking call sites) and `{deprecated, Since, Hint}` (emit a single warn line on first use per load cycle)
 - Built-in validators `"port"`, `"byte"`, `"valid_regex"` delegating to the matching 3.8.0 datatype. Injected on demand only when referenced; a user definition with the same name wins silently
 - Built-in marker validator `"uri"` (no-op by design) so a schema that historically declared a no-op `"uri"` validator inline can drop the declaration without rewriting call sites
 - New `cuttlefish_diff:render_normalised/1,2` library function that produces a deterministic, sorted, printable form of `cuttlefish_generator:map/2` output for line-diffing migration runs. Options: `{skip_funs, bool}`, `{atom_quoting, strict | loose}`

## [v3.8.0](https://github.com/Kyorai/cuttlefish/tree/v3.8.0) (2026-05-26)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v3.7.0...v3.8.0)

**Enhancements:**

 - Support for partial (reusable) schema files. Helps reduce duplication [\#79](https://github.com/Kyorai/cuttlefish/pull/79)
 - New datatype `boolean`: accepts `true`/`false` (atom or string). Replaces the common `{enum, [true, false]}` [\#77](https://github.com/Kyorai/cuttlefish/pull/77)
 - New datatype `regex`: validates a regex and rejects patterns prone to excessive backtracking [\#75](https://github.com/Kyorai/cuttlefish/pull/75)
 - New datatype `uri` (and `{uri, [Scheme]}`): validates a parseable URI with an allowed scheme and a non-empty host [\#75](https://github.com/Kyorai/cuttlefish/pull/75)
 - Range constraints on `integer`: `{integer, [{min, N}, {max, N}, {gt, N}, {lt, N}]}`, plus shortcut atoms `non_negative` and `positive` [\#78](https://github.com/Kyorai/cuttlefish/pull/78)
 - Range constraints on `float`: `{float, [{min, N}, {max, N}, {gt, N}, {lt, N}]}`, plus shortcut atoms `non_negative` and `positive` [\#78](https://github.com/Kyorai/cuttlefish/pull/78)
 - New datatype alias `port` for `{integer, [{min, 0}, {max, 65535}]}` [\#78](https://github.com/Kyorai/cuttlefish/pull/78)
 - New datatype alias `byte` for `{integer, [{min, 0}, {max, 255}]}` [\#78](https://github.com/Kyorai/cuttlefish/pull/78)
 - New datatype alias `percent` for `{percent, integer}` (0-100) [\#78](https://github.com/Kyorai/cuttlefish/pull/78)
 - Improved validation of input schema files [\#76](https://github.com/Kyorai/cuttlefish/pull/76)

**Merged pull requests:**

- Introduce schema partials [\#79](https://github.com/Kyorai/cuttlefish/pull/79) ([michaelklishin](https://github.com/michaelklishin))
- Improve support for numerical data types [\#78](https://github.com/Kyorai/cuttlefish/pull/78) ([michaelklishin](https://github.com/michaelklishin))
- New first class data type: booleans [\#77](https://github.com/Kyorai/cuttlefish/pull/77) ([michaelklishin](https://github.com/michaelklishin))
- Improve validation of input schema files [\#76](https://github.com/Kyorai/cuttlefish/pull/76) ([michaelklishin](https://github.com/michaelklishin))
- New data types: `regex` and `uri` [\#75](https://github.com/Kyorai/cuttlefish/pull/75) ([michaelklishin](https://github.com/michaelklishin))

## [v3.7.0](https://github.com/Kyorai/cuttlefish/tree/v3.7.0) (2026-05-11)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v3.6.0...v3.7.0)

**Merged pull requests:**

- First class support for collections [\#73](https://github.com/Kyorai/cuttlefish/pull/73) ([michaelklishin](https://github.com/michaelklishin))
- Alias support for deprecated conf keys [\#70](https://github.com/Kyorai/cuttlefish/pull/70) ([michaelklishin](https://github.com/michaelklishin))
- Miscellaneous fixes: dialyzer, error propagation, test robustness [\#71](https://github.com/Kyorai/cuttlefish/pull/71) ([lukebakken](https://github.com/lukebakken))

## [v3.6.0](https://github.com/Kyorai/cuttlefish/tree/v3.6.0) (2025-10-29)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v3.5.0...v3.6.0)

**Closed issues:**

- Support multi-line values [\#60](https://github.com/Kyorai/cuttlefish/issues/60)
- 4.0.0 [\#55](https://github.com/Kyorai/cuttlefish/issues/55)
- Improve error reporting when an unsupported option is provided [\#44](https://github.com/Kyorai/cuttlefish/issues/44)
- Update EDoc usage [\#36](https://github.com/Kyorai/cuttlefish/issues/36)
- Consider detecting Unicode BOM marks in conf files [\#32](https://github.com/Kyorai/cuttlefish/issues/32)

**Merged pull requests:**

- Provide more informative output [\#66](https://github.com/Kyorai/cuttlefish/pull/66) ([lukebakken](https://github.com/lukebakken))
- Fix edoc warning [\#65](https://github.com/Kyorai/cuttlefish/pull/65) ([lukebakken](https://github.com/lukebakken))
- Handle conf files that start with unicode BOM [\#64](https://github.com/Kyorai/cuttlefish/pull/64) ([lukebakken](https://github.com/lukebakken))
- Support multiline configuration values [\#63](https://github.com/Kyorai/cuttlefish/pull/63) ([lukebakken](https://github.com/lukebakken))
- GitHub actions workflow updates [\#61](https://github.com/Kyorai/cuttlefish/pull/61) ([lukebakken](https://github.com/lukebakken))

## [v3.5.0](https://github.com/Kyorai/cuttlefish/tree/v3.5.0) (2025-08-11)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v3.4.0...v3.5.0)

**Closed issues:**

- Colons in generated values are not parsed the way the user expects them to be [\#56](https://github.com/Kyorai/cuttlefish/issues/56)
- \[bug\] Tag 2.0.1 conflicts with basho repo, obstructing synchronization [\#54](https://github.com/Kyorai/cuttlefish/issues/54)

**Merged pull requests:**

- Restrict what characters tagged value prefixes \(tags\) are allowed to have [\#58](https://github.com/Kyorai/cuttlefish/pull/58) ([michaelklishin](https://github.com/michaelklishin))
- Parse tagged value tag up to the first colon \#56 [\#57](https://github.com/Kyorai/cuttlefish/pull/57) ([michaelklishin](https://github.com/michaelklishin))

## [v3.4.0](https://github.com/Kyorai/cuttlefish/tree/v3.4.0) (2024-08-06)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v3.3.0...v3.4.0)

**Merged pull requests:**

- New data types: "plain" binary, tagged binary [\#52](https://github.com/Kyorai/cuttlefish/pull/52) ([michaelklishin](https://github.com/michaelklishin))

## [v3.3.0](https://github.com/Kyorai/cuttlefish/tree/v3.3.0) (2024-08-06)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v3.2.0...v3.3.0)

**Closed issues:**

- Proposal: Support for Secrets via Tagged or Term Values [\#40](https://github.com/Kyorai/cuttlefish/issues/40)
- Include statement lacks whitespace before path [\#38](https://github.com/Kyorai/cuttlefish/issues/38)
- \[Feature request\] Provide a way to do character/string escaping [\#37](https://github.com/Kyorai/cuttlefish/issues/37)

**Merged pull requests:**

- Bump getopt to 1.0.3 [\#50](https://github.com/Kyorai/cuttlefish/pull/50) ([michaelklishin](https://github.com/michaelklishin))
- Require Erlang/OTP 24.x [\#49](https://github.com/Kyorai/cuttlefish/pull/49) ([michaelklishin](https://github.com/michaelklishin))
- Support for 'escaped values' [\#48](https://github.com/Kyorai/cuttlefish/pull/48) ([michaelklishin](https://github.com/michaelklishin))
- Grammar: require a space after the "include" directive [\#47](https://github.com/Kyorai/cuttlefish/pull/47) ([michaelklishin](https://github.com/michaelklishin))
- New data type: tagged string [\#46](https://github.com/Kyorai/cuttlefish/pull/46) ([michaelklishin](https://github.com/michaelklishin))
- Don't fail with an 'undefined' log level [\#45](https://github.com/Kyorai/cuttlefish/pull/45) ([michaelklishin](https://github.com/michaelklishin))
- Actions: use Rebar 3.23, drop testing on Erlang 23 [\#43](https://github.com/Kyorai/cuttlefish/pull/43) ([michaelklishin](https://github.com/michaelklishin))
- Re-arrange some tests [\#41](https://github.com/Kyorai/cuttlefish/pull/41) ([michaelklishin](https://github.com/michaelklishin))

## [v3.2.0](https://github.com/Kyorai/cuttlefish/tree/v3.2.0) (2023-02-13)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v3.1.0...v3.2.0)

**Merged pull requests:**

- GHA updates [\#34](https://github.com/Kyorai/cuttlefish/pull/34) ([lukebakken](https://github.com/lukebakken))
- Add new domain\_socket data type [\#33](https://github.com/Kyorai/cuttlefish/pull/33) ([codeadict](https://github.com/codeadict))

## [v3.1.0](https://github.com/Kyorai/cuttlefish/tree/v3.1.0) (2022-10-06)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v3.0.1...v3.1.0)

**Merged pull requests:**

- Support unicode throughout [\#31](https://github.com/Kyorai/cuttlefish/pull/31) ([lukebakken](https://github.com/lukebakken))
- Update GitHub actions [\#30](https://github.com/Kyorai/cuttlefish/pull/30) ([lukebakken](https://github.com/lukebakken))
- Fix typos [\#27](https://github.com/Kyorai/cuttlefish/pull/27) ([kianmeng](https://github.com/kianmeng))
- Update GH actions [\#26](https://github.com/Kyorai/cuttlefish/pull/26) ([lukebakken](https://github.com/lukebakken))

## [v3.0.1](https://github.com/Kyorai/cuttlefish/tree/v3.0.1) (2021-03-26)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v3.0.0...v3.0.1)

**Closed issues:**

- Config for unix socket listeners [\#23](https://github.com/Kyorai/cuttlefish/issues/23)
- List datatype [\#21](https://github.com/Kyorai/cuttlefish/issues/21)

**Merged pull requests:**

- Fix regex to include file [\#25](https://github.com/Kyorai/cuttlefish/pull/25) ([ansd](https://github.com/ansd))
- new datatype 'fqdn' [\#24](https://github.com/Kyorai/cuttlefish/pull/24) ([hmmr](https://github.com/hmmr))
- Add new list datatype [\#22](https://github.com/Kyorai/cuttlefish/pull/22) ([lrascao](https://github.com/lrascao))

## [v3.0.0](https://github.com/Kyorai/cuttlefish/tree/v3.0.0) (2021-03-13)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v2.7.0...v3.0.0)

**Closed issues:**

- Switch to built-in Erlang logger [\#19](https://github.com/Kyorai/cuttlefish/issues/19)

**Merged pull requests:**

- Replace Lager with OTP logger [\#20](https://github.com/Kyorai/cuttlefish/pull/20) ([michaelklishin](https://github.com/michaelklishin))
- Erlang 24 compatibility [\#18](https://github.com/Kyorai/cuttlefish/pull/18) ([michaelklishin](https://github.com/michaelklishin))

## [v2.7.0](https://github.com/Kyorai/cuttlefish/tree/v2.7.0) (2021-03-07)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v2.6.0...v2.7.0)

## [v2.6.0](https://github.com/Kyorai/cuttlefish/tree/v2.6.0) (2021-01-25)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v2.5.0...v2.6.0)

**Closed issues:**

- Read conf variables from the environment [\#16](https://github.com/Kyorai/cuttlefish/issues/16)

**Merged pull requests:**

- Allow environment variable config substitutions [\#17](https://github.com/Kyorai/cuttlefish/pull/17) ([lrascao](https://github.com/lrascao))

## [v2.5.0](https://github.com/Kyorai/cuttlefish/tree/v2.5.0) (2020-12-04)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v2.4.1...v2.5.0)

**Closed issues:**

- Update getopt to 1.0.2 when published [\#11](https://github.com/Kyorai/cuttlefish/issues/11)
- Environment vars [\#7](https://github.com/Kyorai/cuttlefish/issues/7)

**Merged pull requests:**

- Bump getopt to 1.0.2 [\#15](https://github.com/Kyorai/cuttlefish/pull/15) ([lrascao](https://github.com/lrascao))
- Allow shell expanded .conf values [\#14](https://github.com/Kyorai/cuttlefish/pull/14) ([lrascao](https://github.com/lrascao))
- Allow inclusion of other .conf files [\#13](https://github.com/Kyorai/cuttlefish/pull/13) ([lrascao](https://github.com/lrascao))
- Feature/standalone vm args generation [\#12](https://github.com/Kyorai/cuttlefish/pull/12) ([lrascao](https://github.com/lrascao))
- Add Windows and GitHub action status [\#10](https://github.com/Kyorai/cuttlefish/pull/10) ([lukebakken](https://github.com/lukebakken))
- Enable Github CI check on pull requests to master [\#9](https://github.com/Kyorai/cuttlefish/pull/9) ([lrascao](https://github.com/lrascao))
- Feature/standalone config generation [\#8](https://github.com/Kyorai/cuttlefish/pull/8) ([lrascao](https://github.com/lrascao))

## [v2.4.1](https://github.com/Kyorai/cuttlefish/tree/v2.4.1) (2020-08-20)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v2.4.0...v2.4.1)

## [v2.4.0](https://github.com/Kyorai/cuttlefish/tree/v2.4.0) (2020-07-22)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v2.3.0...v2.4.0)

**Merged pull requests:**

- Upgrade to lager 3.8.0 [\#6](https://github.com/Kyorai/cuttlefish/pull/6) ([lukebakken](https://github.com/lukebakken))

## [v2.3.0](https://github.com/Kyorai/cuttlefish/tree/v2.3.0) (2019-08-07)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v2.2.1...v2.3.0)

**Merged pull requests:**

- Repurpose -a to mean --advanced\_conf\_file as --app\_config is unused [\#5](https://github.com/Kyorai/cuttlefish/pull/5) ([michaelklishin](https://github.com/michaelklishin))

## [v2.2.1](https://github.com/Kyorai/cuttlefish/tree/v2.2.1) (2019-08-07)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v2.2.0...v2.2.1)

**Fixed bugs:**

- Ignore whitespace-only lines [\#2](https://github.com/Kyorai/cuttlefish/pull/2) ([lukebakken](https://github.com/lukebakken))

**Closed issues:**

- Cuttlefish chokes on lines with only whitespace characters in the config file [\#1](https://github.com/Kyorai/cuttlefish/issues/1)

**Merged pull requests:**

- Add appvoyer badge [\#4](https://github.com/Kyorai/cuttlefish/pull/4) ([Licenser](https://github.com/Licenser))
- Enable build on Windows [\#3](https://github.com/Kyorai/cuttlefish/pull/3) ([lukebakken](https://github.com/lukebakken))

## [v2.2.0](https://github.com/Kyorai/cuttlefish/tree/v2.2.0) (2019-07-12)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v2.1.4...v2.2.0)

## [v2.1.4](https://github.com/Kyorai/cuttlefish/tree/v2.1.4) (2018-07-08)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v2.1.3...v2.1.4)

## [v2.1.3](https://github.com/Kyorai/cuttlefish/tree/v2.1.3) (2018-05-31)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v2.1.2...v2.1.3)

## [v2.1.2](https://github.com/Kyorai/cuttlefish/tree/v2.1.2) (2018-05-31)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v2.1.1...v2.1.2)

## [v2.1.1](https://github.com/Kyorai/cuttlefish/tree/v2.1.1) (2018-05-23)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/v2.1.0...v2.1.1)

## [v2.1.0](https://github.com/Kyorai/cuttlefish/tree/v2.1.0) (2018-05-21)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/2.0.11...v2.1.0)

## [2.0.11](https://github.com/Kyorai/cuttlefish/tree/2.0.11) (2017-02-06)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/2.0.10...2.0.11)

## [2.0.10](https://github.com/Kyorai/cuttlefish/tree/2.0.10) (2016-10-12)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/2.0.9...2.0.10)

## [2.0.9](https://github.com/Kyorai/cuttlefish/tree/2.0.9) (2016-09-29)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/2.0.8...2.0.9)

## [2.0.8](https://github.com/Kyorai/cuttlefish/tree/2.0.8) (2016-09-22)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/2.0.7...2.0.8)

## [2.0.7](https://github.com/Kyorai/cuttlefish/tree/2.0.7) (2016-07-06)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/2.0.2p2...2.0.7)

## [2.0.2p2](https://github.com/Kyorai/cuttlefish/tree/2.0.2p2) (2016-03-03)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/2.0.6...2.0.2p2)

## [2.0.6](https://github.com/Kyorai/cuttlefish/tree/2.0.6) (2016-02-03)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/2.0.2p1...2.0.6)

## [2.0.2p1](https://github.com/Kyorai/cuttlefish/tree/2.0.2p1) (2016-01-29)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/2.0.5...2.0.2p1)

## [2.0.5](https://github.com/Kyorai/cuttlefish/tree/2.0.5) (2015-08-04)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/2.0.4...2.0.5)

## [2.0.4](https://github.com/Kyorai/cuttlefish/tree/2.0.4) (2015-07-21)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/2.0.3...2.0.4)

## [2.0.3](https://github.com/Kyorai/cuttlefish/tree/2.0.3) (2015-06-27)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/2.0.2...2.0.3)

## [2.0.2](https://github.com/Kyorai/cuttlefish/tree/2.0.2) (2015-06-10)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/2.0.0rc2...2.0.2)

## [2.0.0rc2](https://github.com/Kyorai/cuttlefish/tree/2.0.0rc2) (2014-08-13)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/2.0.0...2.0.0rc2)

## [2.0.0](https://github.com/Kyorai/cuttlefish/tree/2.0.0) (2014-08-13)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/2.0.0rc1...2.0.0)

## [2.0.0rc1](https://github.com/Kyorai/cuttlefish/tree/2.0.0rc1) (2014-05-20)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/0.1.0...2.0.0rc1)

## [0.1.0](https://github.com/Kyorai/cuttlefish/tree/0.1.0) (2013-10-16)

[Full Changelog](https://github.com/Kyorai/cuttlefish/compare/b43aa2d590727f6e7a0e2a330758161b296760f3...0.1.0)
