#6887·mealie

[BUG] - JSON Import Ignores Instruction Titles, Categories, Summary, Notes, and Tools

Author: mswdevCreated Jan 16, 2026Updated Sep 7, 2026
Labelsbugtriage

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:

  1. Several of these fields ARE valid schema.org (see table below)
  2. 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)

python
# 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

  1. Mealie should import its own export format. If I export a recipe as JSON and re-import it, I should get the same recipe.

  2. The importer already extracts these fields (into ScrapedExtras) but doesn't apply them. The extraction logic exists.

  3. For fields that map to schema.org (recipeCategory, tool, HowToSection.name), these are standard fields.

  4. For Mealie-specific fields (summary, ingredient title/note, notes[]), my opinion is, if Mealie's internal schema supports it, the importer should support it.

Thank you!

Steps to Reproduce

  1. Go to your Mealie instance
  2. Click "Create Recipe" → "Import from HTML or JSON"
  3. Paste the following JSON:
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"
  }
}
  1. Click "Create"
  2. 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)