A coffee recipe that opens anywhere
Write it in one app, open it in the next. Print it on a bag, paste it in a message, keep it as a file. Dose, water, temperature and every timed pour arrive as numbers — in the reader’s own units and language.
A recipe that travels
A recipe here is a file, not a picture of one. It rides inside a link, prints as a QR code on a bag, and exports out of one app into the next — with the dose, the water, the temperature and every timed pour still readable as numbers.
So a roaster can put the brew guide on the bag. A creator can publish a routine a timer follows, instead of a viewer pausing the video to write it down. And a library outlives whichever app made it — including this one.
What a document looks like
Everything past the three required fields is whatever you happen to know — this one states its water both ways, as a weight and as a ratio.
{
"coffeejson": "1.1",
"recipes": [
{
"title": "Everyday V60",
"coffee": { "value": 15, "unit": "gram" },
"water": { "value": 250, "unit": "gram" },
"ratio": 16.7
}
]
}
It already ships
- 64
- recipes, each attributed to its source
- 51
- bags, from 20 roasters
- 3
- packages — TypeScript, React, Swift
- 1
- app on the App Store
One implementer so far, and more are wanted — tell us what you are building, or where the format is wrong.
What it takes
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 — and is required to, so what you write this month still reads next year.
Mapped field by field against Visualizer’s and BeanConqueror’s public models: on the bean side, one field in sixteen had no home. Either could read it tomorrow. No account, no endpoint, no SDK you have to take.
Why it’s safe to build on
The shape of the format is answering bugs that already happened, in public trackers: a value read in the wrong unit, a category compared as a display string, corruption nothing validated for months. Hence canonical units, machine ids, and a schema to fail against.
- Forward-compatible reads — valid today, valid as the format grows.
- Locale-neutral ids — every app renders its own language.
- CC0 spec, schema and corpus; Apache-2.0 packages, patent grant included.
- Nothing to join. Disagree and you fork it — that’s the guarantee.
What it doesn’t do
Dose, water, temperature and timing travel exactly; grind and espresso dialing still need your gear. There’s no cup-score field yet — a score without its scale is worse than no score.
Questions
What is CoffeeJSON?
CoffeeJSON is an open file format for coffee recipes and bean identity. One JSON document carries the dose, the water, the temperature, the grind and the timed pour schedule, together with the bean the coffee was made from — so an app can read a recipe another app wrote, instead of an importer written per vendor.
Where can I use a CoffeeJSON document?
Anywhere a file or a URL goes. A document moves between two apps, rides whole inside a share link, prints on a bag of coffee as a QR code, publishes on a web page as schema.org Recipe, and sits on your own disk as plain JSON. There is no server to call and no account to make.
How do I add CoffeeJSON to my app?
Validate documents against the published JSON Schema, then read them with a reference package or with your own code. Packages exist for TypeScript, React and Swift, and a document is plain JSON, so any language can read one. The integration guide carries the consumer and producer checklists.
Is CoffeeJSON free to use?
Yes. The specification, schema, fixtures and registries are CC0 — public domain, no attribution required and no conditions attached. The reference packages are Apache-2.0, patent grant included. There is nothing to sign up for and no organization to join: disagree with a decision and you can fork the format.
Who is using CoffeeJSON today?
One app on the App Store, and it is the author's own: BrewSmart, which has read and written the format since July 2026. More are wanted. If you build a coffee app, a roaster's site or a brewing service, get in touch — help writing the importer and exporter is yours for the asking, and so is a conversation about what the format gets wrong.
Read the spec
- Integration guide — the consumer and producer checklists
- Specification — envelope, Recipe, Bean, Tasting, vocabularies
- JSON Schema — draft 2020-12
- Transport — file, share URL, QR
- Fixture corpus — valid and invalid, checked in CI