feat(core): add secure recipe APIs, precise scaling and versioned imports

This commit is contained in:
OpenCode committed 2026-10-24 15:40:44 +02:00
commit 5d71d32e20
31 files changed
+6293

No files matched your search

+430
View File
@@ -0,0 +1,430 @@
{
"version": 1,
"recipes": [
{
"id": "10000000-0000-4000-8000-000000000001",
"title": "Grüne Pesto-Pasta",
"subtitle": "Ein Teller Sommer, ganz ohne Eile.",
"description": "Frisches Basilikum, geröstete Pinienkerne und ein Hauch Zitrone. Unsere liebste Pasta für Tage, an denen es einfach gut sein soll.",
"image": "/images/kitchen.jpg",
"images": [],
"categories": [
"Alltagsküche",
"Vegetarisch"
],
"tags": [
"Schnell",
"Familienliebling"
],
"cuisine": "Italien",
"difficulty": "Einfach",
"prepMinutes": 10,
"cookMinutes": 12,
"restMinutes": 0,
"servings": 2,
"ingredients": [
{
"id": "pasta",
"name": "Pasta",
"amount": 200,
"unit": "g",
"section": "Für die Pasta",
"note": "",
"optional": false
},
{
"id": "basilikum",
"name": "Basilikum",
"amount": 40,
"unit": "g",
"section": "Für das Pesto",
"note": "",
"optional": false
},
{
"id": "kerne",
"name": "Pinienkerne",
"amount": 30,
"unit": "g",
"section": "Für das Pesto",
"note": "",
"optional": false
},
{
"id": "oel",
"name": "Olivenöl",
"amount": 60,
"unit": "ml",
"section": "Für das Pesto",
"note": "",
"optional": false
},
{
"id": "kaese",
"name": "Hartkäse mit mikrobiellem Lab",
"amount": 40,
"unit": "g",
"section": "Für das Pesto",
"note": "",
"optional": false
},
{
"id": "zitrone",
"name": "Bio-Zitrone",
"amount": 0.5,
"unit": "Stück",
"section": "Zum Abschmecken",
"note": "",
"optional": true
},
{
"id": "salz",
"name": "Salz",
"amount": null,
"unit": "",
"section": "Zum Abschmecken",
"note": "nach Geschmack",
"optional": false
}
],
"steps": [
{
"id": "vorbereiten",
"title": "Ein bisschen Vorbereitung",
"text": "{{basilikum}} waschen und trocken schütteln. {{kaese}} fein reiben. Einen großen Topf Salzwasser aufsetzen.",
"ingredients": [
"basilikum",
"kaese",
"salz"
],
"timers": []
},
{
"id": "pesto",
"title": "Das Pesto zum Leuchten bringen",
"text": "{{kerne}} in einer trockenen Pfanne goldbraun rösten. Mit Basilikum und {{oel}} fein mixen, anschließend den geriebenen Käse unterheben.",
"ingredients": [
"kerne",
"basilikum",
"oel",
"kaese"
],
"timers": [
{
"id": "roesten",
"label": "Pinienkerne rösten",
"seconds": 180
}
]
},
{
"id": "kochen",
"title": "Pasta trifft Pesto",
"text": "{{pasta}} nach Packungsangabe bissfest kochen. Vor dem Abgießen etwas Kochwasser auffangen. Pasta mit dem Pesto vermengen und mit Kochwasser geschmeidig rühren.",
"ingredients": [
"pasta"
],
"timers": [
{
"id": "nudeln",
"label": "Pasta kochen",
"seconds": 600
}
]
},
{
"id": "geniessen",
"title": "Der schönste Moment",
"text": "Mit dem Saft von {{zitrone}} und Salz abschmecken. Auf warme Teller verteilen und sofort genießen.",
"ingredients": [
"zitrone",
"salz"
],
"timers": []
}
],
"tips": "Pesto nicht stark erhitzen: So bleibt es leuchtend grün. Ein Schuss stärkehaltiges Nudelwasser macht die Sauce wunderbar cremig.",
"storage": "Pesto in einem sauberen Glas mit einer dünnen Ölschicht bedecken und im Kühlschrank innerhalb von zwei Tagen verbrauchen.",
"nutrition": {
"kcal": 780,
"protein": 22,
"carbs": 79,
"fat": 42
},
"published": true
},
{
"id": "10000000-0000-4000-8000-000000000002",
"title": "Bunte Garten-Bowl",
"subtitle": "Knackig, frisch und voller guter Dinge.",
"description": "Eine großzügige Schüssel Gemüse, cremige Kichererbsen und ein zitroniges Tahini-Dressing. Genau richtig für einen frischen Start.",
"image": "/images/garden.jpg",
"images": [],
"categories": [
"Vegetarisch"
],
"tags": [
"Meal Prep"
],
"cuisine": "Mediterran",
"difficulty": "Einfach",
"prepMinutes": 20,
"cookMinutes": 10,
"restMinutes": 0,
"servings": 2,
"ingredients": [
{
"id": "kichererbsen",
"name": "Kichererbsen, gekocht",
"amount": 240,
"unit": "g",
"section": "",
"note": "",
"optional": false
},
{
"id": "salat",
"name": "Blattsalat",
"amount": 100,
"unit": "g",
"section": "",
"note": "",
"optional": false
},
{
"id": "tomaten",
"name": "Cherrytomaten",
"amount": 200,
"unit": "g",
"section": "",
"note": "",
"optional": false
},
{
"id": "gurke",
"name": "Gurke",
"amount": 0.5,
"unit": "Stück",
"section": "",
"note": "",
"optional": false
},
{
"id": "tahini",
"name": "Tahini",
"amount": 2,
"unit": "EL",
"section": "",
"note": "",
"optional": false
},
{
"id": "zitrone",
"name": "Zitronensaft",
"amount": 2,
"unit": "EL",
"section": "",
"note": "",
"optional": false
},
{
"id": "wasser",
"name": "Wasser",
"amount": 3,
"unit": "EL",
"section": "",
"note": "",
"optional": false
},
{
"id": "salz",
"name": "Salz",
"amount": null,
"unit": "",
"section": "",
"note": "nach Geschmack",
"optional": false
}
],
"steps": [
{
"id": "gemuese",
"title": "Bunt vorbereiten",
"text": "{{salat}} waschen und trocknen. {{tomaten}} halbieren und {{gurke}} in Scheiben schneiden.",
"ingredients": [
"salat",
"tomaten",
"gurke"
],
"timers": []
},
{
"id": "roesten",
"title": "Kichererbsen rösten",
"text": "{{kichererbsen}} abtropfen lassen und in einer beschichteten Pfanne zehn Minuten rösten. Regelmäßig umrühren.",
"ingredients": [
"kichererbsen"
],
"timers": [
{
"id": "roesten",
"label": "Kichererbsen rösten",
"seconds": 600
}
]
},
{
"id": "dressing",
"title": "Alles kommt zusammen",
"text": "{{tahini}} mit {{zitrone}}, {{wasser}} und Salz verrühren. Gemüse und Kichererbsen anrichten und das Dressing darübergeben.",
"ingredients": [
"tahini",
"zitrone",
"wasser",
"salz"
],
"timers": []
}
],
"tips": "Das Dressing separat aufbewahren, wenn die Bowl für morgen ist.",
"storage": "Gekühlt einen Tag haltbar. Salat und Dressing getrennt lagern.",
"nutrition": null,
"published": true
},
{
"id": "10000000-0000-4000-8000-000000000003",
"title": "Wärmende Gemüsesuppe",
"subtitle": "Ein Löffel Gemütlichkeit.",
"description": "Saisongemüse, weiße Bohnen und aromatische Kräuter machen aus wenigen Zutaten ein wohliges Essen für die ganze Familie.",
"image": "/images/soup.jpg",
"images": [],
"categories": [
"Alltagsküche"
],
"tags": [
"Familienliebling",
"Meal Prep"
],
"cuisine": "",
"difficulty": "Einfach",
"prepMinutes": 15,
"cookMinutes": 30,
"restMinutes": 0,
"servings": 4,
"ingredients": [
{
"id": "karotten",
"name": "Karotten",
"amount": 300,
"unit": "g",
"section": "",
"note": "",
"optional": false
},
{
"id": "kartoffeln",
"name": "Kartoffeln",
"amount": 400,
"unit": "g",
"section": "",
"note": "",
"optional": false
},
{
"id": "bohnen",
"name": "Weiße Bohnen, gekocht",
"amount": 240,
"unit": "g",
"section": "",
"note": "",
"optional": false
},
{
"id": "bruehe",
"name": "Gemüsebrühe",
"amount": 1,
"unit": "l",
"section": "",
"note": "",
"optional": false
},
{
"id": "zwiebel",
"name": "Zwiebel",
"amount": 1,
"unit": "Stück",
"section": "",
"note": "",
"optional": false
},
{
"id": "oel",
"name": "Olivenöl",
"amount": 1,
"unit": "EL",
"section": "",
"note": "",
"optional": false
},
{
"id": "kraeuter",
"name": "Petersilie",
"amount": 0.5,
"unit": "Bund",
"section": "",
"note": "",
"optional": true
}
],
"steps": [
{
"id": "schneiden",
"title": "Alles klein schneiden",
"text": "{{karotten}}, {{kartoffeln}} und {{zwiebel}} schälen und würfeln.",
"ingredients": [
"karotten",
"kartoffeln",
"zwiebel"
],
"timers": []
},
{
"id": "kochen",
"title": "Zeit für Wärme",
"text": "Zwiebel in {{oel}} glasig dünsten. Karotten und Kartoffeln dazugeben, mit {{bruehe}} aufgießen und zugedeckt etwa 25 Minuten sanft kochen, bis das Gemüse weich ist.",
"ingredients": [
"oel",
"bruehe"
],
"timers": [
{
"id": "suppe",
"label": "Gemüse weich kochen",
"seconds": 1500
}
]
},
{
"id": "abschmecken",
"title": "Der letzte Schliff",
"text": "{{bohnen}} dazugeben und fünf Minuten erwärmen. Abschmecken und mit {{kraeuter}} bestreuen.",
"ingredients": [
"bohnen",
"kraeuter"
],
"timers": [
{
"id": "bohnen",
"label": "Bohnen erwärmen",
"seconds": 300
}
]
}
],
"tips": "",
"storage": "Rasch abkühlen und im Kühlschrank maximal zwei Tage lagern. Portionsweise bis zu drei Monate einfrieren.",
"nutrition": null,
"published": true
}
]
}