CookLang: The Plain Text Recipe Format Developers Love

7 min read

There is a certain kind of person who stores everything in plain text files. Notes, tasks, journal entries, documentation -- all in simple text files, organized in folders, tracked in Git. When this kind of person looks at recipe apps with proprietary databases and cloud sync requirements, they feel a familiar itch: this should just be a text file.

CookLang is the answer to that itch. It is an open-source plain text recipe markup language created by Alexey Dubovskoy and maintained by the community at cooklang.org. It lets you write recipes as readable text while embedding structured data -- ingredients, cookware, and timers -- directly in the instruction steps.

MoveMyRecipes.com supports both importing CookLang .cook files and exporting your recipes to CookLang format.

The Syntax in Three Characters

CookLang's entire ingredient model rests on three special characters:

  • @ marks an ingredient
  • # marks a piece of cookware
  • ~ marks a timer

That is the whole system. Here is what a CookLang recipe looks like:

>> servings: 4
>> prep time: 10 mins
>> cook time: 25 mins

Place @potatoes{2%lb} into a #large pot{} and cover with cold water.

Bring to a boil and cook for ~{15%minutes} until fork-tender.

Drain and return to pot. Add @butter{3%tbsp} and @milk{1/4%cup}.

Mash until smooth with a #potato masher{}. Season with @salt{} and @pepper{} to taste.

Read that out loud. It is a recipe. You could cook from it right now. But it is also structured data: a parser can extract that you need 2 pounds of potatoes, 3 tablespoons of butter, 1/4 cup of milk, a large pot, a potato masher, and that one step takes 15 minutes.

The {} braces contain quantity and unit information. The % separates quantity from unit inside the braces. Metadata like servings and timing goes at the top with >> prefixes. Comments use -- and are ignored by parsers.

Why Developers Love It

CookLang resonates with developers for the same reasons Markdown does: it is plain text with minimal syntax that stays readable.

Version control. A folder of .cook files works perfectly with Git. You can track changes to recipes over time, branch to experiment with modifications, diff to see exactly what changed between versions, and merge family members' contributions. Try doing that with a proprietary recipe database.

No vendor lock-in. A .cook file is a text file. It will open in any text editor on any operating system made in the last forty years. No app required. No account required. No cloud service required. If every piece of recipe software disappeared tomorrow, your .cook files would still be readable.

Composability. CookLang files are just files. You can write scripts to process them, generate shopping lists, calculate nutrition, build static websites from them, or do anything else you might do with text data. The CookLang community has built command-line tools, a mobile app, and a static site generator around the format.

Inline ingredients. This is the design choice that sets CookLang apart from every other format. Instead of listing ingredients separately from instructions, CookLang embeds them in context. When you read "Add @butter{3%tbsp} and @milk{1/4%cup}", you see the ingredient exactly where it is used. No scrolling back and forth between the ingredient list and step 4.

How CookLang Compares to Other Plain Text Formats

Markdown recipes are readable but unstructured. A parser cannot reliably distinguish "2 cups flour" in a Markdown ingredients section from any other line of text without guessing.

Open Recipe Format (YAML) gives you structured ingredient data with explicit fields for amount, unit, and name -- but it separates ingredients from instructions. You get precision at the cost of narrative flow.

CookLang splits the difference. The ingredients are structured (amount, unit, name) but embedded in the instructions. You can extract a clean shopping list and follow a step-by-step cooking narrative from the same file.

The tradeoff is that CookLang's inline approach can feel cluttered if a single step involves many ingredients. A step with eight ingredients marked up with @ and {} is harder to read than a clean sentence. For simple recipes, the syntax disappears into the text. For complex ones, it becomes more visible.

How MoveMyRecipes Handles CookLang

Importing: Upload a .cook file to movemyrecipes.com/convert. Our CookLang parser reads the metadata (>> lines for servings, prep time, cook time, source), extracts ingredients from @ markup, identifies cookware from # markup, and captures each instruction step with the CookLang syntax cleaned out for readable display. Everything gets converted to our internal Schema.org representation.

Exporting: Upload recipes in any supported format -- Paprika, Cook'n, CopyMeThat, JSON-LD, Open Recipe Format, plain text, or even images via OCR -- and export as CookLang. Our exporter generates proper .cook files with >> metadata headers, ingredients listed as comments (since we are converting from formats where ingredients are listed separately), and the original instruction steps.

A practical use case: you have 200 recipes locked in Paprika's proprietary .paprikarecipes format. Upload that file to movemyrecipes.com/paprika, export as CookLang, and you now have a folder of plain text recipe files you own completely. Put them in a Git repository. Edit them in your text editor. Build a personal recipe website from them. The data is yours.

The CookLang Ecosystem

CookLang is not just a file format. The community at cooklang.org has built tools around it:

  • CookLang CLI: A command-line tool for parsing .cook files, generating shopping lists, and serving a local recipe website
  • CookLang Apps: Mobile and desktop apps for browsing and cooking from .cook file collections
  • Syntax Highlighting: Editor plugins for VS Code and other text editors that make CookLang markup visually distinct

The ecosystem is still growing, but the foundation is solid: a well-documented spec, an active open-source community, and a design philosophy that prioritizes simplicity and text-file portability.

When CookLang Makes Sense

You already live in plain text. If your notes are in Markdown, your tasks are in text files, and your projects live in Git repositories, CookLang fits naturally into your workflow.

You want version-controlled recipes. Experimenting with a sourdough recipe over months? Git plus CookLang lets you track every modification, revert to a previous version, and see exactly what changed when the bread finally came out right.

You value offline-first, app-independent storage. CookLang files require no internet connection, no cloud service, and no specific application. They are files on your disk.

You want to build something. CookLang's structured-yet-simple format makes it easy to write scripts, build websites, or create tools around your recipe collection.

When CookLang Might Not Be the Best Choice

For non-technical users. The @ingredient{qty%unit} syntax, while not complicated, is unfamiliar. If you are sharing recipes with family members who do not use text editors, PDF or Markdown is friendlier.

For web publishing. Google does not recognize CookLang. If you want rich recipe cards in search results, you need JSON-LD with Schema.org markup.

For nutrition-heavy workflows. CookLang does not have native fields for calorie counts, macronutrient data, or detailed nutritional information. If nutrition tracking is central to your recipe management, JSON-LD or a dedicated recipe app may serve you better.

A Format That Respects Ownership

The reason CookLang matters beyond developer preferences is this: it represents a philosophy about data ownership. Your recipes are text files on your computer. No company controls them. No service can take them away. No format change can make them unreadable.

That is not a small thing. Recipe apps shut down. Companies get acquired. Proprietary formats become obsolete. Ziplist disappeared in 2014. MasterCook.com is sunsetting at the end of 2026. It keeps happening.

A folder of .cook files on your hard drive, backed up wherever you keep your important files, is a recipe collection that will outlast any company.

You can try CookLang right now. Upload any recipe file to movemyrecipes.com/convert, choose CookLang as your export format, and see your recipes as the plain text files they were always meant to be.

Ready to move your recipes?

Export and convert your recipe collection for free. No account required.

Convert My Recipes