How to implement CoffeeJSON

Two functions: JSON in, your recipe type out, and back again. Required: a title, a dose, and either the water or the ratio. A reader ignores the rest.

The integration guide is the checklist. This page is what you lean on while you work it.

Reference SDKs

PackageLanguageWhat it covers
@coffeejson/core TypeScript Wire types, the share-link codec, and a total normalize() — an untrusted payload cannot crash a renderer.
@coffeejson/react TypeScript Renders a document. Frozen class names, replaceable leaves, no styling you cannot override.
coffeejson-swift Swift Wire types, codec and share-link transport for Apple platforms. Pure Foundation, no dependencies.

Conformance is something you can run

The transport ships as scan vectors — each a URL exactly as a scanner hands it over, with the document it must yield or the reason to refuse it.

The SDKs run them; so can yours. Rejection names come from the corpus, so two implementations describe the same failure the same way. Document shapes get the same treatment: a fixture corpus, each invalid document naming the rule it breaks.

When you have shipped it

An implementation is anything that reads or writes CoffeeJSON — an app, a service, a library, a machine. The two roles are independent.

Open a pull request adding yours to registries/implementations.json and it appears on the showcase. No approval step, nothing to sign.