Migration Guides¶
Quillmark evolves through deliberate, documented releases. When a release changes the document syntax, the plate-JSON wire format, or a public API in a way that is not backward compatible, it ships with a migration guide describing exactly what changed and how to update your documents, quills, and host code.
Many of these are hard cutovers — the old form stops parsing or compiling, so a guide is the path forward, not an optional read. Each guide is scoped to a single version step; to cross several versions, work through the relevant guides in order.
Available guides¶
- 0.90 → 0.91 — the closing
~~~of a card-yaml block must be at column zero (an indented~~~is payload, fixing silent truncation of block-scalar values containing tilde fences); data-field names ([a-z_][a-z0-9_]*) and the 100-level nesting limit are enforced on every input path (parse, storage, wire, mutators —set_extnow returnsResult); quill loading skips symlinks and caps file size; Python binding raisesValueErrorfor non-finite floats, out-of-64-bit integers, and over-deep values. Plus no-action round-trip/output fixes (YAML 1.2 comment handling, image alt text, nested-key quoting). - 0.89 → 0.90 —
Quillbecomes engine-free data: the engine no longer loads quills (Quill.fromTree/quillmark::quill_from_pathreplace the factory) and now owns rendering and capability (engine.render/open/supportedFormats/supportsCanvastake the quill). The WASM package exposes a single root@quillmark/wasmimport — the canonical layer over an internal Typst-less core build, with the Typst backend loaded lazily on first render;supportedFormatsleavesQuill.metadata; the backend is resolved at render time; andQuillSourcecollapses into a single coreQuill(Backend::open(&Quill)). - 0.88 → 0.89 —
$quillmismatches become hard errors: a document rendered against a quill whose name differs, or whose version falls outside the$quillselector, now fails (quill::name_mismatch/quill::version_mismatchvia the newRenderError::QuillMismatch) instead of warning. - 0.87 → 0.88 — the schema-aware form view (
quill.form,blankMain,blankCard) is removed in favor ofquill.validate(doc); the absence diagnostic is renamedmust_fill_absent→field_absent(cell axis "Must Fill" → Unendorsed); theexamplereference document folds intoseedDocument(); and a singleCardshape flows in and out — the flatCardInputis replaced byDocument.makeCard, andpushCard/insertCardaccept the shape they return. - 0.86 → 0.87 — array fields require an
itemselement schema,type: datefolds into a unifiedtype: datetime, and schema load rejects emptypropertiesmaps and deeper array nesting. - 0.85 → 0.86 — partial documents render without error, and
the canonical card-yaml fence becomes a bare
~~~. - 0.83 → 0.84 — the Must Fill / Endorsed schema model
replaces
required:, with Python ↔ WASM parity. - 0.82 → 0.83 —
$-prefixed plate JSON wire format retires the legacy uppercase reserved keys. - 0.81 → 0.82 — the card-yaml metadata syntax replaces the
---/QUILL:frontmatter and fenced cards. @quillmark/wasm0.77 → 0.80 — migration notes for WASM consumers crossing the card-syntax release.
Related¶
For how Quills themselves are versioned and how authors target a version, see Quill Versioning.