What changed, and what it costs
Versions here are spec versions, and every runtime publishes the same number:
1.2.0 on npm, PyPI, pkg.go.dev, RubyGems and Packagist is the same spec and the
same bytes out. Only released versions appear — what sits unreleased in the repository is not a
changelog entry.
Each entry is a behaviour change with its cost stated: a rule that starts firing where it did
not before also fires somewhere you may not want it, and both sides are pinned by fixtures. In
the tables below, ⍽ stands for U+00A0 NO-BREAK SPACE and is not in the output
itself — showing it is the only way a changelog can say what the nbsp rule actually
did.
17 September 2026
Three fixes from production reports: file extensions keep their space, French spacing survives an inline element, and an elision before a quotation mark is set.
spaces — A space before a token that begins with a dot is kept. Before 1.2.0 it was deleted, so Requires .NET 8 came back as Requires.NET 8 and a .gitignore file lost its space too. The rule now looks at the code point after the dot: a letter or a digit means the dot starts a token, not ends a sentence. The accepted cost is that a stray space before a real sentence stop followed by a capitalised word, end .Next, is now kept rather than removed.nbsp — In html and markdown modes, French spacing survives an inline element boundary. <strong>Label :</strong> kept its space before 1.2.0 only if the colon sat in the middle of a text run; at the end of a span the space was dropped entirely. The accepted cost is that a colon immediately followed by an opening tag, 12:<b>30</b>, now gains a no-break space before it.apostrophe — An elision apostrophe directly before an opening quotation mark becomes U+2019. d'«idée» and l'“idée” kept a straight mark before 1.2.0, in French and Italian the commonest shape there is. Brackets stay excluded, so a prime in f'(x) is still left alone.| Locale | Mode | In | Before | After |
|---|---|---|---|---|
| en-US | text | Requires .NET 8 and a .gitignore file. | Requires.NET 8 and a.gitignore file. | Requires .NET 8 and a .gitignore file. |
| fr | html | <strong>Label :</strong> oui | <strong>Label:</strong> oui | <strong>Label⍽:</strong> oui |
| fr | text | d'«idée» | d'«⍽idée⍽» | d’«⍽idée⍽» |
9 September 2026
Short quotations convert again, and rock 'n' roll is elided in every locale.
apostrophe — Up to 1.0.0 the rule refused to convert any one-to-three-letter run between straight single quotes, because it could not tell the 'n' idiom from an ordinary short quotation. That declined both: He said 'no' to me. kept straight marks, and so did «это 'моё' дело». The test is now exactly one code point, n or N, and the outcome inverts: that one shape becomes U+2019 on both sides in every locale, and every other short quotation converts like any other quotation.apostrophe — The accepted cost, pinned by fixtures: a genuine quotation of the letter n, The letter 'n' is common., is elided. The class it replaces — every short quotation in every locale — was larger.| Locale | Mode | In | Before | After |
|---|---|---|---|---|
| en-US | text | He said 'no' to me. | He said 'no' to me. | He said “no” to me. |
| fi | text | rock 'n' roll | rock 'n' roll | rock ’n’ roll |
7 September 2026
The first frozen spec, and the first published runtime.
transform over its own output returns the same bytes. Everything after this entry is a change against that baseline.Patch releases carry no behaviour change and no spec change. polytypo-js 1.0.1 moved npm publishing to trusted publishing (OIDC) and rewrote its README; 1.0.2, along with polytypo-python 1.0.1, polytypo-go 1.0.1 and polytypo-ruby 1.0.1, dropped the word “microtypography” from the published package description. The spec stayed at 1.0.0 throughout, and output was byte-identical.
Two lines, same shape as any other embeddable badge — a script tag and a span. No per-embed network call: the whole render table ships in that one script. Pick a language and a theme, then copy the code into your footer, About page, or credits section. Embedding notes cover what a Content Security Policy has to allow and how to re-render on a theme switch. Sites with the badge are listed on Sites using polytypo.