* docs: add Python (C++ backend) implementation to ecosystem list
Added a new entry for the Python implementation with a C++ backend (ctoon) to the ecosystem documentation, ensuring it appears alongside other language implementations.
* docs: add Matlab implementation to ecosystem implementations list
Add Matlab entry (ctoon) to the ecosystem implementations table, acknowledging the new community implementation and providing its repository link and author.
- bump @toon-format/spec to ^3.3.0; update SPEC.md pointer and badges
- docs: align number-form prose with §2 carve-out (canonical in [1e-6, 1e21) or zero; exponent form permitted outside)
- docs/reference/spec.md: add lowercase booleans/null to encoder checklist; add Java to Appendix F language list
- docs/reference/efficiency-formalization.md: drop overstated "matching TOON's requirement" claim
- packages/toon/README.md: drop "What's New in v3.2" section (now stale)
All 593 tests pass (packages/toon: 497, packages/cli: 96). Encoder remains conformant by default under the v3.3 §2 carve-out via String(value).
Two regrade fixes surfaced by a post-v3.2 verification swarm:
* llm-prompts.md and api.md had ISO-8601 timestamps as unquoted TOON
values, violating §7.2 (strings containing a colon MUST be quoted).
The spec repo's examples and packages/toon/README.md already quote
timestamps; the docs repo had drifted.
* docs/cli/index.md is the docs-site twin of packages/cli/README.md.
The prior v3.2 swarm (dd856fe) updated the README's --no-strict
options row and Lenient Decoding prose to cite "header delimiter"
but did not propagate to the parallel paragraphs in docs/cli/index.md
(lines 159 and 234).
- packages/toon/README.md: drop two v3.1 bullets that crept into the
"What's new in v3.2" list (canonical empty-array form and \uXXXX
escape both landed in v3.1).
- docs/reference/api.md: rename "Delimiter mismatches" entry to
"Header delimiter mismatch" and cite §14.2 – the previous wording
invited the false reading that non-active delimiter chars in row
data are an error. Add §14.4 cross-ref to the duplicate-key entry.
- docs/reference/spec.md: include \uXXXX in the §7 escape list; soften
the charset MUST claim to match §17; en-dash the §-ranges in the
glance table.
- docs/reference/syntax-cheatsheet.md: rename "Strings with Active
Delimiter" to "Strings Containing Delimiters" and distinguish
active-delim (array scope) from document-delim (object field
values) per §11.1.
- docs/guide/format-overview.md: same active-vs-document distinction
in the delimiter paragraph; drop incorrect "strict mode" qualifier
from the unknown-escape error claim (§7.1 rejects unconditionally);
trim redundant "with leading zeros" parenthetical.
- docs/guide/llm-prompts.md: fix two broken anchors
(/reference/api#decode → #decode-input-options, similar for
encodelines); use -o instead of --output for CLI example
consistency.
- packages/cli/README.md: enumerate what --no-strict actually skips
in the options table; replace "delimiter consistency" with the
more specific "header delimiter mismatches" in the Lenient Decoding
prose to avoid the same false reading the api.md fix addresses.
In v3.2, --no-strict no longer just skips count/indent/delimiter
validation - it also applies last-write-wins on duplicate sibling
keys and tolerates malformed array headers as plain key-value lines.
The previous "faster processing" framing didn't reflect any of this.
- Lenient Decoding sections in cli docs and packages/cli/README spell
out which checks the decoder stops enforcing
- Options table description shifts from "Disable strict validation"
to "Skip decode validation; last-write-wins on duplicate keys"
- --strict help text in the CLI reads "Strict decode validation
(disable with --no-strict)"
- §17 IANA anchor fix in the cli docs media-type note
- Canonical empty-array form (`key: []` / root `[]`) replaces `key[0]:`
in format-overview, syntax-cheatsheet, and the efficiency-formalization
worked example. Legacy form still decodes.
- Escape tables grow a `\uXXXX` row covering U+0000-U+001F outside
\n/\r/\t, with a note rejecting lone-surrogate \uXXXX values.
- "Special characters" lists widened to "any control character (U+0000-U+001F)"
instead of the LF/HTAB/CR triplet.
- Tabular eligibility note adds the "at least one key" rule so arrays
containing an empty {} fall back to the expanded list.
- New short example for nested arrays-of-objects as list items (`- [N]:`).
- API reference: Date row gets an info callout noting it's an
implementation choice the spec leaves open; strict-mode bullet list
picks up header structure, duplicate sibling keys, path-expansion
conflicts, and lone-surrogate escapes; Expansion Conflict Resolution
notes the matching duplicate-key policy.
- §17 IANA anchor fix in getting-started media-type paragraph.
- Drop the removed §17 Interoperability and §19 Core Profile bullets
- Renumber §18 IANA -> §17, add §18 Versioning and §19 IP entries
- Appendix G -> F (Host Type Normalization Examples)
- Update the Sections-at-a-Glance table to the v3.2 layout
- §14.5 -> §14.3 path-expansion reference in the Decoder Checklist
- §14 enumeration covers count/width, syntax/structural, expansion, dup keys
- Encoder Checklist mentions \uXXXX escapes alongside the five base escapes
- Major-version example swapped to v2 -> v3 / v3.1 -> v3.2
- Working Draft date updated to 2026-05-20
Adds the [Tooner](https://github.com/chaindead/tooner) MCP proxy entry to the Tools & Integration list in the package README and to docs/ecosystem/tools-and-playgrounds.md.
* feat(docs): add YAML input to Playground with tests
- Add input format selector and YAML parsing (YAML 1.2, merge keys off)
- Extract parse/stringify helpers for testability and SPEC-aligned encoding
- Add Vitest for docs package and playground parse tests
- Update Playground copy in package README and ecosystem docs
* refactor(docs): simplify Playground YAML support
- Inline parse/stringify helpers into the component, drop the separate
parse-input module and its tests
- Rename input state from `jsonInput`/`formattedJson`/`jsonTokens` to
`inputText`/`formattedInput`/`inputTokens` so names no longer lie when
YAML is selected
- Hide the JSON Baseline selector in YAML mode and make the token-count
tooltip conditional on input format
- Store input under `state.input` with a fallback read of legacy
`state.json` so existing share URLs keep working
- Drop redundant YAML parse options (merge/version match library
defaults); use lineWidth: 0 for editor display so long scalars do not
fold mid-sentence
- Remove the duplicated vitest devDep, docs vitest.config.ts, and `test`
script – the playground is verified through the dev server
* chore(docs): tighten Playground wording and drop empty-string fallback
- "in real-time" → "in real time" (real-time only hyphenates as a
compound modifier before a noun)
- Header copy now matches the ecosystem page: "Convert JSON or YAML to
TOON in real time"
- Token-count tooltip unified across input formats; the JSON baseline
selector is right next to it and already communicates the format
- Drop `?? ''` fallback on state.input — decodeState already gates on
successful JSON parse; the chain falls through to the legacy
state.json field
---------
Co-authored-by: Sweta <sweta@Swetas-MacBook-Air.local>
Co-authored-by: Johann Schopplich <johann@schopplich.com>
json-io is a comprehensive Java library for TOON serialization that supports:
- 60+ built-in types (vs ~15 in other Java implementations)
- Any serializable type as Map keys (not just strings)
- EnumSet support
- Cyclic reference handling
- Zero external dependencies (except java-util)
Repository: https://github.com/jdereg/json-io
* docs: add ToonStore to community implementations
* docs: add ToonStore to community implementations
* docs: add TORM to community implementations
* chore: revert sace
---------
Co-authored-by: Johann Schopplich <mail@johannschopplich.com>