NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #3565 most downloaded on crates.io
YAML (de)serializer for Serde, emphasizing panic-free parsing, fast builds and good error reporting. Supports properties, include, tag and comment capture
Last release 22 days ago
16 Sep 2026
Ships on a steady schedule
a new release about every 2 weeks
Some releases are documented
notes for 11 of 33 stable releases
2 versions withdrawn
withdrawn after publishing
1 years old
37 releases · first in 2025
Integer mapping keys now compare by their parsed numeric value for duplicate detection and merge resolution, including inside composite keys ( 0xB and
0xB and 11 compare equal). Deserializing to stringsFirstWins and LastWins retain the selected key's spelling{{"null": 1}: 2} now round-trips correctly.!!str null, including when deserializing to Option<String>.!!int and !!float) now deserialize correctly through deserialize_any,from_str::<f64>("!!str 1.5") now returns an error.\uFFFE and \uFFFF.LitStr and LitString, by using keep chomping and retaining every empty line.Input for performance improvements. As serde-saphyr re-exports it,One column per month.
1.3.0 Maintenance and performance release Latest
Latest
Compare
This release focuses on enhanced tag support.
This release focuses on enhanced tag support.
Tagged<T> wrapper that is similar to Commented<T>.ruamel.yaml that rejects tags for which it has no constructor (serde-saphyr does not construct this way) that caused discussion on prek.Budget; property resource-limit
failures are now reported through Error::Budget and BudgetBreach.Options::reject_unsupported_tags strict mode. It rejects explicitly tagged
scalar, sequence, and mapping nodes when their tag is unknown to serde-saphyr; the default remains
permissive for compatibility with custom tagged enums. YAML 1.1 !!merge and !!value are
accepted in this mode only as the exact scalar mapping keys << and =, respectively, while
robotics-only !degrees and !radians require both the robotics crate feature and
angle_conversions, and !include requires both the include crate feature and a configured
resolver.reject_unsupported_tags is disabled.indent_step is now limited to 1..=64, all
serializer entry points validate it, and indentation arithmetic returns an error instead of
overflowing. We do not consider this breaking because values outside this range does not look sane.#, such as
a#b, while retaining quotes for leading or whitespace-separated hashes. Borrowed from
commit 1119a54
under the terms of the Apache/MIT licenses. When property interpolation is configured,
newly plain values such as ${NAME}#fragment can interpolate; use quote_all to preserve
literal values.!!merge keys, including verbatim tags and %TAG-expanded
handles, everywhere implicit << merge keys are supported.!!value tag while intentionally treating it as a no-op annotation.#-prefixed content lines.typetag trait-object deserialization by consuming the closing mapping
event when a Serde map visitor returns after its final key/value pair, preventing a false
"multiple YAML documents" error.Added granit-parser resource limits to Budget ( #172 ):
Added granit-parser resource limits to Budget (#172):
max_buffered_comment_events (default: 32)simple_key_max_lookahead (default: 1,024 characters)flow_nesting_limit (default: 255)The limits are applied to parsers created for strings, readers, standalone budget checks, and
included YAML sources. When the serde_derived_types feature is enabled, deserializing an older
Budget representation that omits these fields uses the documented defaults.
Fix #170 regression on local type tags
This means that API changes will be clearly reflected in the version number: the major version indicates breaking changes, the minor version indicates…
From this release onward, we are adopting the 1.x.x semantic versioning (SemVer) scheme. This means that API changes will be clearly reflected in the version number: the major version indicates breaking changes, the minor version indicates backward-compatible additions, and the patch version indicates backward-compatible fixes. The current compatibility status is indicated by the accompanying badge.
This release adds some #[track_caller] and #[must_use] annotations where looks reasonable. There are not many other changes that is exactly the point: the crate seems serving community well enough.
Nothing published for this version
This means that API changes will be clearly reflected in the version number: the major version indicates breaking changes, the minor version indicates…
From this release onward, we are adopting the 1.x.x semantic versioning (SemVer) scheme. This means that API changes will be clearly reflected in the version number: the major version indicates breaking changes, the minor version indicates backward-compatible additions, and the patch version indicates backward-compatible fixes. The current compatibility status is indicated by the accompanying badge.
Some breaking changes were made at this point because this is the last good time to streamline the API. Please raise any issues you find with the API changes, or if you would like to propose something. The goal of the release preview is exactly not to go 2.x.x next week after release.
Options, SerializerOptions, Budget, and AliasLimits are now #[non_exhaustive]. Construct them with options!, ser_options!, budget!, and alias_limits!.to_writer and to_writer_with_options APIs. Use to_fmt_writer* for fmt::Write or to_io_writer* for io::Write.Also
!!str 42 is accepted as i32(42), and !!int true is accepted as bool(true). Core tag handling is now hardened, and such constructs no longer pass.1.0.0-rc.1 release preview Pre-release
Pre-release
Compare
Summarizing results of automated fuzzing and static analysis, robustness against malformed (bad intent) YAML input was further hardened.
serde-saphyr emulates, supports property nesting, so implemented nesting support for serde-saphyr as well. In the previous release, "${SET:-${B}}" with SET=value resolves to "value}".inf/Infinity/nan). YAML 1.2 only recognizes the .inf/.nan forms.FoldStr wrapping now cares not to start a continuation line with a tabSignificant extension of property interpolation ( @CommanderStorm )
SingleQuoted<..> and DoubleQuoted<..> wrappers to emit quoted strings. SingleQuoted may provide additional safety, as control characters will be rejected (with error), rather than written as YAML escape sequences. NullableTilde<T> is like Option and emits tilde ( ~ ) rather than null.serde_coreserde-saphyr now avoids compiling serde_derive by default. The crate core uses serde_core instead that allows building serde-saphyr in parallel with serde_derive. However this also means that we needed to drop the previously built-in (de)serialization support for some serde-saphyr own configuration and reporting types like Options. (De)serialization support for these types can be re-enabled with the new feature serde_derived_types:
serde-saphyr = { version = "...", features = ["serde_derived_types"] }This does not affect normal use of serde-saphyr for user data, you can still serialize and deserialize your own structs as before.
0.0.28 Property interpolation extensions and even faster builds
Compare
The major extension of this release is comments support.
The major extension of this release is comments support.
The long existed wrapper Commented<..> was usable for serialization only until now. Since this release, Commented also captures a comment of the wrapped data structure:
struct DeploymentConfig {
name: Commented<String>,
image: Commented<String>,
ports: Commented<Vec<Commented<u16>>>,
labels: Commented<BTreeMap<String, Commented<String>>>,
}would capture all comments for the elements of the structure, like
# deployment manifest
name: checkout
image: registry.example.com/checkout:v1 # container image to deploy
ports: # sequence of exposed ports
- 80 # public HTTP
- 443 # public HTTPS
labels: # mapping of Kubernetes labels
app: checkout # stable app label
tier: frontend # routing tier
"#;while assigning them to the relevant YAML element. This became possible after migrating to granit parser 0.0.3, which now captures comments. Comments can be either on the right or above the item they describe.
This release also adds support for figment2 (figment is supported since v0.0.13).
UTF-16LE, UTF-16BE, UTF-8 with BOM and UTF-8 without BOM are all supported for the Reader - based methods (stabilized)
huge_documents mode, using 48 bits only for offsets. This silences Clippy warnings, due these some teams needed to box serde-saphyr Error. The maximal size of documents in huge_documents mode is now 256 Tb that is unlikely a problem (default limit is 4 Gb).Merge key handling is now configurable via MergeKeyPolicy. There may be communities that
<< as ordinary, and these are even not quoted, maybe in generated YAML. Handling of this case is supported via AsOrdinary variant.Error variant for this case.Merge)Fixed deserialization bug ( #100 ) where mixing tagged and #[serde(untagged)] enum variants caused YAML tags to be ignored, leading to incorrect or fa
100000 is valid and 1000_000 also, but _10, 10_ are no longer. This is consistent with the serializer's auto-quoting policies.0.0.24 - remove heavy regex crate
0.0.24 - remove heavy regex crate
Compare
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
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
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
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
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 →