What Is a Recipe Markup Language? (And Why You'd Want One)

You already use markup languages. When you write **bold** in a message, that's markup — plain text with annotations that a renderer interprets. Markdown, HTML, LaTeX — they all work the same way: take readable text, add markers, and let software do something useful with the structure.

Recipes need the same thing. And they don't have it.

The Problem with Unstructured Recipes

A recipe on a blog or in a notes app is just text. A human can read it and cook from it. A computer cannot do much more than display it.

Ask software to extract the ingredients from a typical recipe and it hits a wall immediately. Is "2 large eggs, beaten" one ingredient or two? Is "salt and pepper to taste" two ingredients with no quantities? Is "one 400g can of crushed tomatoes" 1 can or 400 grams?

Without structure, every recipe is an ambiguous blob of text. That means no automated shopping lists. No reliable scaling. No nutritional calculation. No smart kitchen integration. The recipe is trapped in prose.

What a Markup Language Does

A markup language solves this by adding lightweight annotations to the text — markers that tell software what each piece of text is without making the text unreadable to humans.

HTML does this for web pages. <h1>Title</h1> tells a browser "this is a heading." The text is still readable, but now software knows its structure.

Cooklang does the same thing for recipes. Three symbols — @, #, ~ — mark ingredients, cookware, and timers within natural recipe text:

Heat @olive oil{2%tbsp} in a #frying pan over medium heat.

Add @garlic{3%cloves}, minced, and cook for ~{1%minute} until fragrant.

Add @cherry tomatoes{200%g}, halved, and @salt{1/4%tsp}. Cook ~{5%minutes}.

A human reads: "Heat olive oil in a frying pan over medium heat."

A computer reads: ingredient olive oil, quantity 2 tbsp; cookware frying pan; and so on.

Same text, two levels of information.

Why Recipes Specifically Need This

Most structured data formats — JSON, XML, YAML — are designed for machines. They work, but nobody wants to write a recipe in JSON:

{
  &#34;recipeIngredient&#34;: [&#34;2 tbsp olive oil&#34;, &#34;3 cloves garlic&#34;],
  &#34;recipeInstructions&#34;: [{&#34;text&#34;: &#34;Heat olive oil in a pan&#34;}]
}

And purely human formats — blog posts, handwritten cards, notes apps — can't be computed on.

Recipes sit in an unusual position: they need to be readable by the cook standing in the kitchen and parseable by software that generates shopping lists, scales portions, or runs timers. A recipe markup language bridges both sides.

That's what makes Cooklang different from formats like Schema.org JSON-LD (machine-first) or plain Markdown (human-first). Cooklang is both — a recipe you can read and cook from, with structure that software can extract and use.

What Structure Enables

Once your recipes have structure, tools can do things that are impossible with plain text:

Shopping lists. Parse three recipes, extract all ingredients, merge duplicates, group by store department. What takes 15 minutes by hand takes one command:

cook shopping-list monday.cook tuesday.cook wednesday.cook

Scaling. A recipe for 4 servings, scaled to 7? Every ingredient quantity is structured data — multiply by 7/4 and convert units. No manual calculator, no errors.

Validation. An ingredient listed but never used in any step? A timer with no associated action? Structured recipes can be checked for consistency the same way a compiler checks code.

Interoperability. A .cook file can be read by the mobile app, rendered by a web server, processed by CookCLI, or parsed by any tool that implements the open specification. The same file works everywhere because the structure is in the text itself, not in a proprietary database.

How It Compares

There have been other attempts at recipe formats. MealMaster used column-based formatting from the BBS era. RecipeML tried XML in 2000. Schema.org's JSON-LD powers Google's recipe rich snippets.

Each solved a different problem. MealMaster was for sharing recipes over dial-up. RecipeML was for data interchange between applications. JSON-LD is for SEO.

Cooklang solves the everyday problem: you want to write recipes that you can read, edit, share, and also compute on. You don't want to learn XML or write JSON. You want to write a recipe, add a few annotations, and have software handle the rest.

For a detailed side-by-side comparison, see Recipe File Formats Compared.

Getting Started

The full syntax has three markers and takes about five minutes to learn:

MarkerPurposeExample
@Ingredient@flour{500%g}
#Cookware#mixing bowl
~Timer~{30%minutes}

Convert one recipe you know well. If it reads naturally and you can generate a shopping list from it, you'll probably convert the rest.

-Alexey