Skip to main content

Self-Host Mealie: Recipe Manager and Meal Planner 2026

·OSSAlt Team
mealierecipesmeal-planningself-hostingdocker2026

TL;DR

Mealie (AGPL 3.0, ~7K GitHub stars, Python/Vue) is a self-hosted recipe manager and meal planner. Paste any recipe URL and Mealie scrapes and saves it — no more browser bookmarks graveyard. Organize into categories and tags, plan weekly meals, generate grocery lists by combining planned meals, and share recipes with family. There's no paid alternative doing this better — AllRecipes and Paprika charge $4.99/year but put recipes behind ads. Mealie stores everything on your server.

Key Takeaways

  • Mealie: AGPL 3.0, ~7K stars — recipe import from any URL, meal planning, grocery lists
  • URL import: Paste any recipe website URL, Mealie extracts ingredients and instructions
  • Meal planner: Weekly drag-and-drop calendar, generate shopping list from the plan
  • API: Full REST API — integrate with Grocy, Home Assistant, or custom scripts
  • iOS/Android: Mobile-optimized web app (PWA) — works great while cooking
  • Multi-user: Households with per-user and shared recipe collections

Mealie vs Tandoor vs Paprika

FeatureMealieTandoorPaprika
LicenseAGPL 3.0MITProprietary
GitHub Stars~7K~5K
CostFreeFree$4.99 once
URL scrapingYesYesYes
Meal plannerYesYesYes
Grocery listYesYesYes
Nutrition infoYesYesLimited
iOS/AndroidPWA + APIPWA + APINative
Multi-userYesYesNo (local)
Self-hostedYesYesNo

Part 1: Docker Setup

# docker-compose.yml
services:
  mealie:
    image: ghcr.io/mealie-recipes/mealie:latest
    container_name: mealie
    restart: unless-stopped
    ports:
      - "9000:9000"
    volumes:
      - mealie_data:/app/data
    environment:
      ALLOW_SIGNUP: "true"   # Disable after first user
      MAX_WORKERS: 1
      WEB_CONCURRENCY: 1
      BASE_URL: "https://recipes.yourdomain.com"
      # Default admin:
      DEFAULT_EMAIL: "${ADMIN_EMAIL}"
      DEFAULT_PASSWORD: "${ADMIN_PASSWORD}"
      # Email (optional for password reset):
      SMTP_HOST: "smtp.yourdomain.com"
      SMTP_PORT: 587
      SMTP_AUTH_STRATEGY: "TLS"
      SMTP_FROM_EMAIL: "mealie@yourdomain.com"
      SMTP_FROM_NAME: "Mealie"
      SMTP_USER: "${SMTP_USER}"
      SMTP_PASSWORD: "${SMTP_PASS}"
      # Language:
      DEFAULT_GROUP: "Home"
      TZ: "America/Los_Angeles"

volumes:
  mealie_data:
# .env
ADMIN_EMAIL=admin@yourdomain.com
ADMIN_PASSWORD=your-admin-password

docker compose up -d

Visit http://your-server:9000 — log in with your admin credentials.


Part 2: HTTPS with Caddy

recipes.yourdomain.com {
    reverse_proxy localhost:9000
}

Part 3: Importing Recipes

From a URL (any recipe website)

  1. Click + New Recipe → Import Recipe
  2. Paste any recipe URL from:
    • AllRecipes, Food Network, NYT Cooking, Serious Eats, Budget Bytes
    • Personal food blogs
    • Any page with recipe schema markup
  3. Mealie scrapes: title, ingredients, instructions, nutrition, time, servings
  4. Review and save

From a file

  • Import .zip Mealie exports from another instance
  • Import from Nextcloud Cookbook
  • Import .json in schema.org Recipe format

Manual entry

  1. + New Recipe → Create Recipe
  2. Fill in title, ingredients (one per line), instructions
  3. Add tags, categories, nutrition info

Part 4: Meal Planning

  1. Meal Plan → Week View
  2. Drag recipes onto days (or click + to add)
  3. Plan breakfast, lunch, dinner, snacks separately
  4. View the week's plan at a glance

Generate a grocery list

  1. Meal Plan → Shopping List
  2. Select the date range
  3. Mealie combines all ingredients from planned meals
  4. Deduplicates and combines quantities (e.g., "2 cups + 1 cup flour = 3 cups flour")
  5. Check off items as you shop

Part 5: Multi-User Households

Mealie supports households with shared and private recipes:

Create a household group

  1. Admin → Groups → Create Group
  2. Name: Smith Family
  3. Members can share recipes within the group

User roles

  • Admin: Manage users, all settings
  • User: Create/edit own recipes, view shared
  • Viewer: Read-only access to shared recipes

Invite household members

  1. Settings → Users → Invite User
  2. Share the invite link
  3. Or create accounts: Admin → Users → Create User

Part 6: REST API

# Get API token:
# Profile → Security → API Tokens → Create

TOKEN="your-api-token"
BASE="https://recipes.yourdomain.com/api"

# Get all recipes:
curl "${BASE}/recipes?page=1&perPage=50" \
  -H "Authorization: Bearer $TOKEN" | jq '.[].name'

# Create a recipe:
curl -X POST "${BASE}/recipes" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "Simple Pasta", "recipeIngredient": ["200g pasta", "2 cloves garlic", "olive oil"]}'

# Get a recipe by slug:
curl "${BASE}/recipes/simple-pasta" \
  -H "Authorization: Bearer $TOKEN"

# Scrape from URL:
curl -X POST "${BASE}/recipes/create/url" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://www.budgetbytes.com/pasta-e-fagioli/"}'

# Add to meal plan:
curl -X POST "${BASE}/groups/mealplans" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"date": "2026-03-10", "entryType": "dinner", "recipeId": "recipe-uuid"}'

Part 7: Organize with Tags and Categories

# Suggested category structure:
Categories:
  - Breakfast
  - Lunch
  - Dinner
  - Snacks
  - Desserts
  - Baking

# Suggested tags:
Tags:
  - 30-minutes
  - vegetarian
  - vegan
  - gluten-free
  - dairy-free
  - kid-friendly
  - meal-prep
  - one-pan
  - budget
  - holiday

Bulk tag via API:

# Apply tag to multiple recipes:
RECIPE_IDS=("uuid1" "uuid2" "uuid3")
for ID in "${RECIPE_IDS[@]}"; do
  curl -X PATCH "${BASE}/recipes/${ID}" \
    -H "Authorization: Bearer $TOKEN" \
    -H "Content-Type: application/json" \
    -d '{"tags": [{"name": "vegetarian"}]}'
done

Part 8: Home Assistant Integration

Integrate with Home Assistant for meal plan visibility:

# In Home Assistant configuration.yaml:
rest_command:
  get_mealie_plan:
    url: "https://recipes.yourdomain.com/api/groups/mealplans/today"
    method: GET
    headers:
      Authorization: "Bearer YOUR_MEALIE_TOKEN"

sensor:
  - platform: rest
    name: "Tonight's Dinner"
    resource: "https://recipes.yourdomain.com/api/groups/mealplans/today"
    headers:
      Authorization: "Bearer YOUR_MEALIE_TOKEN"
    value_template: "{{ value_json | selectattr('entryType','eq','dinner') | map(attribute='recipe.name') | first }}"

Maintenance

# Update Mealie:
docker compose pull
docker compose up -d

# Backup:
tar -czf mealie-backup-$(date +%Y%m%d).tar.gz \
  $(docker volume inspect mealie_mealie_data --format '{{.Mountpoint}}')

# Export all recipes (for migration):
curl "${BASE}/recipes/exports/download/recipes.zip" \
  -H "Authorization: Bearer $TOKEN" -O

# Logs:
docker compose logs -f mealie

See all open source lifestyle and home tools at OSSAlt.com/categories/home.

Comments