[BUG] - JSON Import Ignores Instruction Titles, Categories, Summary, Notes, and Tools
First Check
- This is not a feature request.
- I added a very descriptive title to this issue (title field is above this).
- I used the GitHub search to find a similar issue and didn't find it.
- I searched the Mealie documentation, with the integrated search.
- I already read the docs and didn't find an answer.
- This issue can be replicated on the demo site (https://demo.mealie.io/).
What is the issue you are experiencing?
Preface: Addressing Schema Validity
This bug report documents fields that Mealie's internal schema supports but the JSON importer silently discards.
I want to address a pattern I've seen in previous discussions (#4490, #6406) where similar reports were dismissed with "that's not valid schema.org." This defense doesn't hold for two reasons:
- Several of these fields ARE valid schema.org (see table below)
- Even for fields that aren't schema.org, if Mealie supports them internally, the importer should too. At minimum, Mealie should be able to import its own export format.
| Field | Mealie Supports? | Schema.org? |
|---|---|---|
recipeInstructions[].title |
✅ Section header | ✅ via HowToSection.name |
recipeInstructions[].summary |
✅ Step title | ❌ Mealie-specific |
recipeIngredient[].title |
✅ Section header | ❌ Mealie-specific |
recipeIngredient[].display |
✅ Ingredient notes | ❌ Mealie-specific |
notes[] |
✅ Recipe notes | ❌ Mealie-specific |
recipeCategory |
✅ Yes | ✅ recipeCategory |
tools |
✅ Yes | ✅ tool (from HowTo) |
tags |
✅ Yes | ✅ via keywords |
Describe the Bug
When importing recipes via JSON (API endpoint /api/recipes/create/html-or-json or UI "Import from HTML or JSON"), several fields that Mealie's data model supports are silently discarded:
1. Instructions: title and summary ignored
Mealie's RecipeStep schema has three fields:
title- Section header (toggleable in UI, groups steps like "Make the Sauce")summary- Individual step title (appears above the step text)text- The instruction content
Bug: The importer hardcodes title="" and never extracts summary.
Code location: mealie/services/scraper/scraper_strategies.py (~line 127)
# Current: both title and summary are lost
return [RecipeStep(title="", text=x.get("text")) for x in instruction_as_text]2. recipeCategory ignored
Categories are extracted into ScrapedExtras but never applied to the created recipe.
3. tools ignored
Same as categories. Extracted but not applied.
4. Ingredient section headers (summary)
Mealie's ingredient model supports title for section headers (e.g., "For the Filling", "For the Sauce"). This likely suffers the same hardcoding issue.
5. Ingredient notes (note)
Does the importer preserve the note field on ingredients?
6. Recipe notes (notes[])
Mealie supports an array of {title, text} note objects. Does import preserve these?
7. Markdown formatting stripped
Markdown in text fields (bold, lists, etc.) is stripped during import but renders fine if edited via UI.
My opinion
Mealie should import its own export format. If I export a recipe as JSON and re-import it, I should get the same recipe.
The importer already extracts these fields (into
ScrapedExtras) but doesn't apply them. The extraction logic exists.For fields that map to schema.org (
recipeCategory,tool,HowToSection.name), these are standard fields.For Mealie-specific fields (
summary, ingredienttitle/note,notes[]), my opinion is, if Mealie's internal schema supports it, the importer should support it.
Thank you!
Steps to Reproduce
- Go to your Mealie instance
- Click "Create Recipe" → "Import from HTML or JSON"
- Paste the following JSON:
{
"@context": "https://schema.org/",
"@type": "Recipe",
"name": "Test Recipe - Import Verification",
"description": "Testing Mealie field import with valid schema.org/Recipe format",
"recipeCategory": ["Dinner", "American"],
"keywords": ["High Protein", "Quick"],
"recipeYield": "4 servings",
"prepTime": "PT10M",
"cookTime": "PT15M",
"totalTime": "PT25M",
"tool": [
{"@type": "HowToTool", "name": "Large Skillet"},
{"@type": "HowToTool", "name": "Cutting Board"}
],
"recipeIngredient": [
"1 lb Ground Beef, preferably 85/15",
"1 tsp Salt",
"1 cup Tomato Sauce"
],
"recipeInstructions": [
{
"@type": "HowToSection",
"name": "Prep Work",
"itemListElement": [
{
"@type": "HowToStep",
"text": "Gather all ingredients and prep your workspace."
},
{
"@type": "HowToStep",
"name": "Season the meat",
"text": "Season the ground beef with salt and pepper."
}
]
},
{
"@type": "HowToSection",
"name": "Cooking",
"itemListElement": [
{
"@type": "HowToStep",
"name": "Brown the beef",
"text": "Cook in skillet over **medium-high heat** for 8-10 minutes until browned."
},
{
"@type": "HowToStep",
"name": "Add the sauce",
"text": "Pour in tomato sauce and simmer for 5 minutes."
}
]
}
],
"nutrition": {
"@type": "NutritionInformation",
"calories": "350 kcal",
"proteinContent": "25 g"
}
}- Click "Create"
- Open the created recipe
If we HAVE to follow the schema.org/recipe format, there are several fields as mentioned above that the Mealie native schema supports that the Mealie json importer does NOT that we cannot test.
- Ingredient sections (title on ingredients)
- Recipe notes array
- Ingredient note field
Expected: Instruction sections show section headers once manually enabled. Instruction sections should show titles (summary). Categories, tags, and tools are populated, etc. Markdown is stripped out.
Actual: All instruction titles and/or headers are blank. Categories, and tools are empty too.
Please provide relevant logs
No errors in logs. The fields are silently discarded during processing, not rejected.
Mealie Version
Reproducible on v3.9.2 and demo.mealie.io
Deployment
Docker (Linux)
Additional Deployment Details
This affects all deployment types. The bug is in the Python scraper/import code, not environment-specific.
Related: Issue #6406, Discussion #4490 (confirms categories/tools broken)
Source: mealie-recipes/mealie