# Changelog
All notable changes to `nbformat` will be documented in this file.
## [Unreleased]
## [3.0.0] - 2026-04-26
## [2.2.0] - 2026-04-25
## [2.1.0] - 2026-04-25
### Changed
- `serialize_notebook` now sorts object keys alphabetically at every depth, matching Python `nbformat.write`'s `json.dumps(sort_keys=True)` output. This removes workspace-feature-flag sensitivity: before, output order depended on whether downstream crates enabled `serde_json/preserve_order`. Notebooks saved through this serializer will produce smaller and more stable git diffs.
### Added
- `tests/regenerate_expected.py` writes canonical Python `nbformat.write` output to `tests/notebooks/expected/` for a subset of fixtures. The new `test_matches_python_oracle_output` conformance test asserts byte-for-byte parity against those files.
## [2.0.0] - 2026-04-12
### Breaking
- Add `Notebook::V4QuirksMode` variant for v4.5 notebooks with missing cell IDs. (#295)
- Mark `Notebook` enum as `#[non_exhaustive]`.
### Added
- `V4Quirks` wrapper with `repair()` method to surface and fix spec violations via the type system.
- `Quirk` enum (also `#[non_exhaustive]`) with `MissingCellId` variant.
## [1.2.2] - 2026-03-14
## [1.2.1] - 2026-03-06
## [1.2.0] - 2026-02-23
### Added
- Support for v3 notebook parsing and upconversion to v4. (#275)
## [1.1.0] - 2026-02-20
### Fixed
- Accept both string and array for cell source.
- Trailing newline bug in MultilineString and media serialization. (#271)
## [1.0.0] - 2026-01-07
Stable release of the Jupyter notebook format parser. See git history for earlier changes.