Prompt
You are helping me write a recipe for the Smakko app. Reply with ONE JSON code block only: a valid Smakko Recipe Language (SRL 1.0) document. No prose before or after.
My preferences:
- language for title and free text: German (de)
- units: metric
- usual portions: 2
SRL 1.0 in short:
- Top level: srl "1.0", id, meta { title, tagline (one restaurant-style sentence), description?, cuisine[], course[], tags[], yield { portions, basePortionMass? }, source? }, ingredients[], equipment[], lanes[] (parallel workflows such as pasta / sauce / topping), steps[], serve { step }, storage?.
- Free text is always { "lang": "de"|"en", "text": "..." }.
- Ingredient line: id (i1, i2 ...), ref ("ing:<slug>" from the catalog, or "custom:<slug>" plus "name" when unknown), qty { value, unit } (ranges: { min, max, unit }), mass { value, unit: "g" } when you can estimate it, optional, scale ("linear" default, "sqrt" for salt and spices, "step" with stepSize for whole items like eggs, "fixed"), group (component), role (main | aromatic | liquid | fat | seasoning | garnish), pantry (true for salt, oil, flour ...), substitutes[], spec { variety, attributes[], state, origin, product { brand, name }, detail, strictness: required | preferred | any } when a specific product or state matters.
- Step: id (s1 ...), lane, op (from the list below, or "custom" with "verb" and a fallback "text"), inputs (ingredient ids or intermediates "x:<slug>" produced by earlier steps, optionally { ref, fraction }), outputs (intermediates with a label), equipment ("eq:<slug>" or "custom:<slug>"), params, until { cue }, duration { active, passive } as ISO-8601 (PT9M), attention (active | monitor | passive), timer { duration, autoStart, alertBefore }, dependsOn[], method { technique, detail, why, precision, strictness } when the exact technique matters, phases[] (sequential appliance or heat changes with duration), interventions[] ({ at | every, action, inputs?, text?, alert }), note, tips[], safety.
- params: appliance { device, mode (fan | top-bottom | grill | steam | air), temp { value, unit }, preheat, rack }, heat (off | low | medium-low | medium | medium-high | high), cut { shape (cube | slice | ring | half-moon | wedge | strip | julienne | chunk | mince | rough | fine | shred | ribbon), size { value, unit: "mm"|"cm" }, thickness }, fat { ref }, liquid { ref, qty }, container (bowl-small | bowl-medium | bowl-large | pot | pot-large | pan | tray | jar), stir (none | occasional | constant), salt (none | pinch | light | normal | generous), garnish[], with[], qty, what (cooking-liquid | fat | marinade | juice | zest | stock), parts, times.
- cues: golden, golden-brown, translucent, soft, tender, al-dente, crispy, fragrant, thickened, reduced-by-half, boiling, simmering, melted, dissolved, doubled, set, smooth, creamy, combined, cooked-through, internal-temp, custom (internal-temp carries value { value, unit }).
- units: g, kg, oz, lb, ml, l, tsp, tbsp, cup, fl-oz, piece, clove, slice, leaf, sprig, stalk, can, pack, pinch, dash, handful, mm, cm, in, C, F.
- intervention actions: shake, flip, turn, stir, rotate-tray, baste, add, remove, set-temp, set-heat, cover, uncover, check, vent, release-pressure, tent, swap-racks, drain-fat, custom.
- catalog ingredient ids (use these exact ids when they fit): ing:flatbread, ing:gnocchi-fresh, ing:tortellini-fresh, ing:tagliatelle-fresh, ing:berries-frozen, ing:raspberries-frozen, ing:ricotta, ing:parmesan, ing:pecorino, ing:feta, ing:mozzarella, ing:butter, ing:milk-whole, ing:cream, ing:yogurt-greek, ing:egg, ing:chicken-thigh, ing:chicken-breast, ing:beef-minced, ing:salmon-fillet, ing:tofu-firm, ing:quark, ing:guanciale, ing:pancetta, ing:sour-cream, ing:mascarpone, ing:kefir, ing:yogurt-plain, ing:egg-yolk, ing:egg-white, ing:beef-rumpsteak, ing:beef-strips, ing:pasta-rigatoni, ing:spaghetti, ing:rice-basmati, ing:breadcrumbs, ing:flour-wheat, ing:oats, ing:chickpeas-canned, ing:tomatoes-canned, ing:coconut-milk, ing:lentils-red, ing:olive-oil, ing:sunflower-oil, ing:soy-sauce, ing:vinegar-white-wine, ing:honey, ing:mustard-dijon, ing:tahini, ing:salt, ing:black-pepper, ing:smoked-paprika, ing:cumin-ground, ing:chili-flakes, ing:sugar, ing:baking-powder, ing:almonds, ing:pine-nuts, ing:stock-vegetable, ing:water, ing:vegetable-oil, ing:cardamom-ground, ing:cinnamon-ground, ing:raisins, ing:pistachios, ing:almond-slivers, ing:lentils-brown, ing:harissa, ing:orzo, ing:couscous, ing:chocolate-dark, ing:semolina, ing:stock-beef, ing:stock-chicken, ing:saffron, ing:sugar-powdered, ing:shawarma-spice, ing:sea-salt-flakes, ing:mustard-medium, ing:onion-yellow, ing:onion-red, ing:shallot, ing:garlic, ing:tomato, ing:tomato-cherry, ing:carrot, ing:potato, ing:bell-pepper-red, ing:zucchini, ing:cucumber, ing:lemon, ing:lime, ing:apple, ing:avocado, ing:spinach, ing:mushroom-button, ing:leek, ing:celery, ing:ginger, ing:chili-red, ing:broccoli, ing:basil, ing:parsley, ing:coriander, ing:thyme, ing:rosemary, ing:mint, ing:rocket, ing:pomegranate-seeds, ing:dill, ing:radish, ing:orange, ing:grapefruit, ing:peach
- catalog equipment ids: eq:knife-chef, eq:board, eq:peeler, eq:grater-fine, eq:grater-coarse, eq:zester, eq:mandoline, eq:pot-small, eq:pot-medium, eq:pot-large, eq:pan-small, eq:pan-medium, eq:pan-large, eq:wok, eq:dutch-oven, eq:sheet-pan, eq:baking-dish, eq:loaf-tin, eq:oven, eq:hob, eq:air-fryer, eq:microwave, eq:blender, eq:immersion-blender, eq:food-processor, eq:stand-mixer, eq:kettle, eq:pressure-cooker, eq:sous-vide, eq:grill, eq:rice-cooker, eq:toaster, eq:whisk, eq:tongs, eq:sieve, eq:colander, eq:scale, eq:thermometer, eq:mortar, eq:spatula, eq:dough-scraper, eq:ladle, eq:rolling-pin, eq:citrus-press, eq:bowl-small, eq:bowl-medium, eq:bowl-large, eq:shaker, eq:jar, eq:jigger, eq:strainer-bar, eq:muddler, eq:contact-grill, eq:pasta-machine, eq:cookie-cutter, eq:freezer, eq:fridge, eq:storage-container, eq:garlic-press, eq:hand-mixer, eq:slotted-spoon, eq:fork, eq:spoon, eq:plate
- ops:
- knife and prep: dice, slice, julienne, chop, mince, grate, peel, crush, zest, juice, halve, quarter, core, deseed, trim, tear, wash, pat-dry, shred, shave, segment, fillet, debone, butterfly, score
- mix and measure: combine, stir, whisk, fold, knead, beat, cream, season, marinate, coat, bread, stuff, shape, roll, divide, toss, blend, puree, mash, sift, dissolve, soak, drain, rinse, strain, squeeze, emulsify, measure
- passive and timing: rest, chill, freeze, thaw, proof, cool, steep, wait, set-aside, reserve
- heat: preheat, boil, simmer, blanch, poach, steam, fry, saute, sear, deep-fry, stir-fry, roast, bake, grill, broil, air-fry, braise, stew, pressure-cook, sous-vide, microwave, toast, caramelize, reduce, deglaze, melt, temper, flambe, smoke, reheat, keep-warm
- finish and plate: plate, garnish, layer, assemble, drizzle, sprinkle, serve
- bar: shake, stir-bar, muddle, build, strain-fine, double-strain, rim, infuse, top-up, pour, express
- meta: custom, check, transfer, repeat, split, note
Rules:
1. Use only ops from the list; anything untyped becomes op "custom" with a short verb and a one-sentence "text".
2. Every ingredient is used by at least one step; outputs (x:...) feed later steps; label every output.
3. dependsOn forms a DAG; use lanes for work that happens in parallel.
4. Durations are ISO-8601; add a timer for anything hands-off longer than 1 minute; use attention "passive" for waiting steps.
5. Quantities in g/ml where sensible, counts where natural (1 lemon, 2 cloves); add "mass" in grams when you can.
6. tagline = one restaurant-style sentence; title and free text in the requested language.
7. scale "sqrt" for salt and spices, "step" for eggs and whole items.
8. Prefer supermarket pack sizes (250 g ricotta, 400 g pasta, 1 lemon) so nothing is wasted.
9. If an ingredient, tool or technique is not in the catalog, use "custom:<slug>" with a name; never drop it.
10. When a specific product, ripeness or temperature matters, fill ingredient "spec" with a strictness; when the exact way of doing something matters, fill step "method" with detail and why.
11. For long cooking steps add "phases" (temperature or heat changes) and "interventions" (shake, flip, stir every n minutes, add at minute m, check internal temperature).
12. Respect my preferences above (diet, avoided ingredients, allergens, equipment); offer substitutes instead of silently dropping things.
Example:
```json
{
"srl": "1.0", "id": "rcp_new",
"meta": { "title": { "lang": "de", "text": "Knusprige Kichererbsen" }, "tagline": { "lang": "de", "text": "Rauchig, salzig, in 25 Minuten" },
"cuisine": ["levantine"], "course": ["snack"], "tags": ["quick"], "yield": { "portions": 2 } },
"ingredients": [
{ "id": "i1", "ref": "ing:chickpeas-canned", "qty": { "value": 1, "unit": "can" }, "mass": { "value": 240, "unit": "g" }, "role": "main" },
{ "id": "i2", "ref": "ing:olive-oil", "qty": { "value": 1, "unit": "tbsp" }, "mass": { "value": 13, "unit": "g" }, "role": "fat", "pantry": true },
{ "id": "i3", "ref": "ing:smoked-paprika", "qty": { "value": 1, "unit": "tsp" }, "mass": { "value": 2, "unit": "g" }, "role": "seasoning", "scale": "sqrt" },
{ "id": "i4", "ref": "custom:zaatar", "name": { "lang": "de", "text": "Zaatar" }, "qty": { "value": 1, "unit": "tsp" }, "mass": { "value": 2, "unit": "g" }, "role": "seasoning", "scale": "sqrt" }
],
"equipment": [{ "ref": "eq:oven", "required": true, "alternatives": ["eq:air-fryer"] }],
"steps": [
{ "id": "s1", "op": "preheat", "equipment": "eq:oven", "params": { "appliance": { "device": "oven", "mode": "fan", "temp": { "value": 200, "unit": "C" }, "preheat": true } }, "duration": { "passive": "PT10M" }, "attention": "passive" },
{ "id": "s2", "op": "pat-dry", "inputs": ["i1"], "outputs": [{ "id": "x:chickpeas-dry", "label": { "lang": "de", "text": "Kichererbsen" } }], "duration": { "active": "PT2M" } },
{ "id": "s3", "op": "toss", "inputs": ["x:chickpeas-dry", "i2", "i3"], "outputs": [{ "id": "x:chickpeas-seasoned", "label": { "lang": "de", "text": "Kichererbsen" } }], "params": { "container": "bowl-medium" }, "duration": { "active": "PT1M" }, "dependsOn": ["s2"] },
{ "id": "s4", "op": "roast", "inputs": ["x:chickpeas-seasoned"], "outputs": [{ "id": "x:chickpeas-crispy", "label": { "lang": "de", "text": "Kichererbsen" } }], "equipment": "eq:sheet-pan",
"params": { "appliance": { "device": "oven", "mode": "fan", "temp": { "value": 200, "unit": "C" }, "preheat": true } }, "until": { "cue": "crispy" },
"duration": { "active": "PT1M", "passive": "PT22M" }, "attention": "passive", "timer": { "duration": "PT22M", "autoStart": true },
"interventions": [{ "id": "v1", "at": "PT11M", "action": "shake", "alert": true }], "dependsOn": ["s1", "s3"] },
{ "id": "s5", "op": "sprinkle", "inputs": ["x:chickpeas-crispy"], "params": { "with": ["i4"] }, "duration": { "active": "PT1M" }, "dependsOn": ["s4"] }
],
"serve": { "step": "s5", "temperature": "warm" }
}
```
My idea: {describe the dish you imagine}