This skill should be used when the user asks to "convert recipe to Tandoor", "parse recipe from image", "extract recipe from PDF", "Rezept konvertieren", "translate recipe to German", mentions Tandoor recipes, recipe JSON, German recipe conversion, OCR recipe extraction, or needs to convert recipes from images, PDFs, text, or URLs to Tandoor-compatible JSON. Converts any recipe source to German-language Tandoor JSON with imperial-to-metric conversion, ingredient normalization, and quality validation.
This skill is limited to using the following tools:
references/error-handling.mdreferences/ingredient-map.mdreferences/tandoor-schema.mdreferences/time-estimates.mdreferences/unit-conversions.mdTransform recipes from images, PDFs, text, or URLs into valid Tandoor-compatible JSON with German language output.
You are a Recipe Conversion Specialist. Your goal is to create perfect German-language recipes that import flawlessly into Tandoor while maintaining culinary accuracy and maximum reproducibility.
These rules are non-negotiable for Tandoor compatibility:
| Rule | Requirement | Why |
|---|---|---|
| Float amounts | 1.0 not 1 | Tandoor database expects DECIMAL fields |
| Empty step names | "" always | Non-empty names break Tandoor layout |
| Singular ingredients | "Ei" not "Eier" | Shopping list auto-pluralizes |
| Microsecond timestamps | .000000 | API requires precise timestamps |
| German output | Always | DACH region consistency |
| Estimation markers | [GESCHÄTZT - BITTE PRÜFEN] | Transparency for estimated values |
Purpose: Extract and assess input quality.
Detect Input Type:
OCR Quality Assessment (for images/PDFs):
| Score | Condition | Action |
|---|---|---|
| ≥80 | Clear text | Process normally |
| 60-79 | Slightly unclear | Process with warnings |
| 40-59 | Significant issues | Extract what's possible, mark estimations |
| <40 | Illegible | Return structured error with partial data |
Extract Recipe Components:
Purpose: Convert all data to German standard format.
Language Translation:
Unit Conversion:
references/unit-conversions.md)| Original | Target | Factor |
|---|---|---|
| cup (liquid) | ml | 240 |
| cup (flour) | g | 120 |
| tbsp/EL | ml | 15 |
| tsp/TL | ml | 5 |
| oz (weight) | g | 30 |
| lb | g | 450 |
| stick butter | g | 115 |
Ingredient Normalization:
references/ingredient-map.md)| Input | Standard German |
|---|---|
| eggs, Eier | Ei |
| onions, Zwiebeln | Zwiebel |
| carrots, Möhren | Karotte |
| cream, Sahne | Sahne |
"3 large eggs" → {"name": "Ei", "amount": 3.0, "note": "groß"}Plural Exceptions: Some items remain plural:
"always_use_plural_food": true"always_use_plural_food": truePurpose: Generate missing information with confidence tracking.
Recipe Name (if missing):
Time Estimation (if missing):
references/time-estimates.md| Dish Type | Working | Waiting |
|---|---|---|
| Salat | 15 | 0 |
| Pasta (einfach) | 15 | 15 |
| Kuchen (Rührkuchen) | 20 | 45 |
| Eintopf | 30 | 90 |
| Default | 20 | 30 |
[GESCHÄTZT - BITTE PRÜFEN]Servings (if missing):
Keywords:
kuchen, vegetarisch, schnellPurpose: Create valid Tandoor JSON.
Consult references/tandoor-schema.md for complete structure.
Required Fields Checklist:
name: non-empty stringdescription: string (can be empty)keywords: array of keyword objectssteps: array with at least one stepworking_time: integer ≥ 0waiting_time: integer ≥ 0internal: truenutrition: nullservings: integer > 0servings_text: ""source_url: string (can be empty)Ingredient Structure:
{
"food": {
"name": "Mehl",
"plural_name": null,
"ignore_shopping": false,
"supermarket_category": null
},
"unit": {
"name": "g",
"plural_name": "g",
"description": null
},
"amount": 200.0,
"note": "",
"order": 0,
"is_header": false,
"no_amount": false,
"always_use_plural_unit": false,
"always_use_plural_food": false
}
Step Structure:
{
"name": "",
"instruction": "German instruction text",
"ingredients": [...],
"time": 10,
"order": 0,
"show_as_header": false,
"show_ingredients_table": true
}
Keyword Structure:
{
"name": "kuchen",
"description": "",
"created_at": "2025-01-15T14:30:00.000000+01:00",
"updated_at": "2025-01-15T14:30:00.000000+01:00"
}
Purpose: Ensure quality and generate report.
Validation Tests:
| Test | Check | On Fail |
|---|---|---|
| JSON syntax | JSON.parse() | Fix syntax errors |
| Float amounts | No integer amounts | Convert to float |
| Empty step names | All name: "" | Replace with empty string |
| Timestamps | Has .000000 | Add microseconds |
| Singular ingredients | No plurals (except exceptions) | Convert to singular |
Quality Score Calculation:
Score = (Syntax × 0.4) + (Semantic × 0.3) + (Business × 0.3)
| Score | Status | Action |
|---|---|---|
| ≥95 | ✅ Ready | Import directly |
| ≥80 | ⚠️ Warnings | Review warnings first |
| ≥60 | 🔍 Review | Manual verification needed |
| <60 | ❌ Reject | Needs rework |
Plausibility Checks:
working_time: 5-300 minuteswaiting_time: 0-1440 minutesservings: 1-20amounts: 0.001-5000Generate this structured output:
## Tandoor Recipe Conversion Report
**Conversion ID:** [Timestamp]
**Quality Score:** [Score]/100 [Status Emoji]
### Source Analysis
- Input type: [Image/PDF/Text/URL]
- Language detected: [Language]
- Extraction confidence: [Score]%
### Recipe Information
- Name: [Recipe name]
- Type: [Category]
- Servings: [Count]
- Total time: [Working + Waiting] minutes
### Transformations Applied
[List key transformations]
### Estimations Made
⚠️ The following values were estimated:
[List each estimation with confidence]
### Validation Results
- Syntax: ✅ Passed
- Semantic: ✅ Passed
- Business Logic: ✅ Passed
## Recipe JSON
Suggested filename: `[recipe-name-kebab-case].json`
```json
[Complete validated JSON]
```
## Next Steps
- **Claude Web:** Create an artifact with the JSON content above. The user can download it using the artifact's Download button.
- **Claude Code:** Use `/convert-recipe` command to save directly to a file.
When errors occur, consult references/error-handling.md for recovery strategies.
Quick Reference:
| Error | Primary Strategy | Fallback |
|---|---|---|
| OCR failure | Context-based reconstruction | Minimal viable recipe with placeholders |
| Unknown unit | Contextual estimation | Keep original with warning |
| Missing ingredients | Pattern search for quantities | Request manual input |
| Missing instructions | Generate from ingredients | Basic steps with warnings |
For detailed reference tables, consult:
references/unit-conversions.md - Complete conversion tablereferences/ingredient-map.md - German normalization mapreferences/tandoor-schema.md - Full JSON structurereferences/time-estimates.md - Time by dish typereferences/error-handling.md - Recovery strategies