About CKL
Every recipe on this site is written in CKL, the Culinary Knowledge Language — a small notation in which every quantity, time and temperature is a number, and a compiler checks the recipe before anyone cooks it.
Why a recipe language
Written recipes lean on judgement the reader may not have. “A pinch of salt”, “a hot pan”, “cook until done” — each is a decision the author made and did not write down.
CKL asks the author to write it down. A recipe declares what it needs, then states each step with real numbers, in a form a program can read and check. If the chicken is never brought to a safe temperature, the recipe does not build.
What the compiler checks
Real numbers
Every quantity, time and temperature carries a unit: 5g, 6min, 180C. There is no way to write “to taste”.
Declared before use
Ingredients and equipment are listed up front. A step that reaches for something never declared is an error.
Food safety
Poultry must be checked at 74 °C or above. A lower number fails the build, and there is no override.
Cooking sense
Warnings for steps that read fine but cook badly — food into a pan that was never heated, a cold pan deglazed.
A recipe in CKL
This is the method of pan-seared chicken breast. Each line is one statement, and each statement starts with a keyword.
servings 4
ingredient "chicken breast" 600g
ingredient "olive oil" 30ml
ingredient "salt" 5g
ingredient "black pepper" 2g
ingredient "butter" 20g
ingredient "garlic" 10g
ingredient "thyme" 3g
pan "cast iron skillet" 30cm
knife "chef's knife"
cut "garlic" style mince size 2mm
# Sear, then baste with butter, garlic and thyme
sear "chicken breast" in pan with "olive oil" "salt" "black pepper" at 180C for 6min
sear "chicken breast" in pan with "butter" "garlic" "thyme" for 6min
until internal_temp >= 74C
rest 5minChange 74C to 65C and the build stops with error E101. The homepage shows it happening.
From file to page
- Write. A recipe is a
.ckl.mdfile: a little frontmatter, notes in plain prose, and the method in acklblock. - Check. A lexer, parser and linter read the block. Errors stop the build, and CI runs the check on every recipe in the repository.
- Publish. The site generator turns each checked recipe into its page — steps with timers, links to techniques and ingredients, and the graph that connects them.
The Add a recipe page runs the same compiled linter in your browser, so a recipe that passes there passes in CI.