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.

elapsed
3:30
water in
300g
60 g120 g180 g240 g300 g
Pour schedule: 5 pours to 300 g over 3:30

Drag a pour: its line of the file changes with it.

tetsu-kasuya-4-6-basic.json the whole file · brew it at real speed

{"coffeejson": "1.1","recipes": [{"title": "Tetsu Kasuya 4:6 Method (basic)","description": "Tetsu Kasuya's World Brewers Cup-winning 4:6 pour-over: five equal pours — the first 40% of the water tunes taste, the last 60% sets strength.","method": "pour_over","coffee": { "value": 20, "unit": "gram" },"water": { "value": 300, "unit": "gram" },"ratio": 15,"water_temp": { "value": 93, "unit": "celsius" },"grind": { "size": "medium_coarse" },"steps": [{ "at_s": 0, "to_water": { "value": 60, "unit": "gram" }, "instruction": "first pour — sweetness phase" },{ "at_s": 45, "to_water": { "value": 120, "unit": "gram" }, "instruction": "second pour" },{ "at_s": 90, "to_water": { "value": 180, "unit": "gram" }, "instruction": "third pour — strength phase" },{ "at_s": 130, "to_water": { "value": 240, "unit": "gram" }, "instruction": "fourth pour" },{ "at_s": 160, "to_water": { "value": 300, "unit": "gram" }, "instruction": "fifth pour" }],"finish_s": 210,"lang": "en","notes": "The original specifies a grind between medium-coarse and coarse; size carries the finer end of that range. Philocoffea publishes this method on a Japanese page and an English one, and they disagree on two pours: the Japanese original cues the fourth at 2:10 and the fifth at 2:40, the English translation at 2:15 and 2:45. This document follows the Japanese, which is the language the method was published in first.","author": { "name": "Tetsu Kasuya", "type": "person" },"based_on": "https://philocoffea.com/?mode=f3"}]}

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.

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

Every pour schedule in the corpus, each drawn from its own steps and all to one scale — the longest brew is the full width, the largest the full height. 24 of the 64 recipes state one. One implementer so far, and more are wanted — tell us what you are building, or where the format is wrong.

Early. CoffeeJSON 1.1 is settled in shape and still being polished — tell us where the model 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.

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.

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.

Questions

Read the spec

Write it in one app, open it in the next.