Self-Host Mealie: Recipe Manager and Meal Planner 2026
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
| Feature | Mealie | Tandoor | Paprika |
|---|---|---|---|
| License | AGPL 3.0 | MIT | Proprietary |
| GitHub Stars | ~7K | ~5K | — |
| Cost | Free | Free | $4.99 once |
| URL scraping | Yes | Yes | Yes |
| Meal planner | Yes | Yes | Yes |
| Grocery list | Yes | Yes | Yes |
| Nutrition info | Yes | Yes | Limited |
| iOS/Android | PWA + API | PWA + API | Native |
| Multi-user | Yes | Yes | No (local) |
| Self-hosted | Yes | Yes | No |
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)
- Click + New Recipe → Import Recipe
- Paste any recipe URL from:
- AllRecipes, Food Network, NYT Cooking, Serious Eats, Budget Bytes
- Personal food blogs
- Any page with recipe schema markup
- Mealie scrapes: title, ingredients, instructions, nutrition, time, servings
- Review and save
From a file
- Import
.zipMealie exports from another instance - Import from Nextcloud Cookbook
- Import
.jsonin schema.org Recipe format
Manual entry
- + New Recipe → Create Recipe
- Fill in title, ingredients (one per line), instructions
- Add tags, categories, nutrition info
Part 4: Meal Planning
- Meal Plan → Week View
- Drag recipes onto days (or click + to add)
- Plan breakfast, lunch, dinner, snacks separately
- View the week's plan at a glance
Generate a grocery list
- Meal Plan → Shopping List
- Select the date range
- Mealie combines all ingredients from planned meals
- Deduplicates and combines quantities (e.g., "2 cups + 1 cup flour = 3 cups flour")
- Check off items as you shop
Part 5: Multi-User Households
Mealie supports households with shared and private recipes:
Create a household group
- Admin → Groups → Create Group
- Name:
Smith Family - 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
- Settings → Users → Invite User
- Share the invite link
- 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.