Mealie: The Self-Hosted Recipe Manager for Home Cooks
Mealie: The Self-Hosted Recipe Manager for Home Cooks
Photo by Ilias Gainutdinov on Unsplash
Recipe apps are everywhere, but they all have the same problem: your data lives on someone else's server, paywalls creep in over time, and the day the company shuts down, your recipe collection vanishes. Mealie is a self-hosted alternative that puts your recipes under your own roof — with meal planning, shopping lists, and multi-user family sharing built in.
What Mealie Does
Mealie is a full-featured recipe manager with:
- Recipe import: Paste any URL and Mealie scrapes the recipe automatically (works with hundreds of sites)
- OCR scanning: Photograph a physical recipe card and extract text
- Meal planning: Drag-and-drop calendar for weekly meal plans
- Shopping lists: Auto-generate grocery lists from your meal plan, with ingredient scaling
- Multi-user: Separate accounts for family members, with group sharing
- API: Full REST API for automation and integrations
- OIDC: Single sign-on support for Authelia, Authentik, and others
The UI is clean, fast, and mobile-friendly — it works well as a PWA on phones.
Prerequisites
- Docker and Docker Compose
- A server or NAS with at least 512MB RAM
- (Optional) A reverse proxy like Caddy or Traefik for HTTPS
Quick Start with Docker Compose
Create a directory for Mealie and a docker-compose.yml:
mkdir -p /opt/mealie && cd /opt/mealie
# docker-compose.yml
version: "3.8"
services:
mealie:
image: ghcr.io/mealie-recipes/mealie:latest
container_name: mealie
restart: unless-stopped
ports:
- "9000:9000"
volumes:
- mealie-data:/app/data
environment:
# Base URL for link generation
BASE_URL: https://recipes.yourdomain.com
# Default admin credentials (change after first login)
DEFAULT_EMAIL: [email protected]
DEFAULT_PASSWORD: changeme
# Database (SQLite is fine for personal use)
DB_ENGINE: sqlite
# Token lifetime in hours
TOKEN_TIME: 48
# Worker count (1 is fine for small households)
MAX_WORKERS: 1
WEB_CONCURRENCY: 1
volumes:
mealie-data:
Start it:
docker compose up -d
Visit http://your-server-ip:9000 and log in with the credentials you set. Change the password immediately.
Like what you're reading? Subscribe to Self-Hosted Weekly — free weekly guides in your inbox.
Configuring PostgreSQL (Optional, Recommended)
SQLite works for personal use but PostgreSQL is recommended for multi-user setups or if you plan to share with a large household.
Add a postgres service to your compose file:
services:
mealie:
image: ghcr.io/mealie-recipes/mealie:latest
container_name: mealie
restart: unless-stopped
depends_on:
- postgres
ports:
- "9000:9000"
volumes:
- mealie-data:/app/data
environment:
BASE_URL: https://recipes.yourdomain.com
DB_ENGINE: postgres
POSTGRES_USER: mealie
POSTGRES_PASSWORD: strongpassword
POSTGRES_SERVER: postgres
POSTGRES_PORT: 5432
POSTGRES_DB: mealie
postgres:
image: postgres:15
container_name: mealie-postgres
restart: unless-stopped
volumes:
- mealie-pg:/var/lib/postgresql/data
environment:
POSTGRES_USER: mealie
POSTGRES_PASSWORD: strongpassword
POSTGRES_DB: mealie
volumes:
mealie-data:
mealie-pg:
Setting Up HTTPS with Caddy
A simple Caddyfile entry:
recipes.yourdomain.com {
reverse_proxy localhost:9000
}
Caddy handles cert provisioning automatically. If you're behind Cloudflare, set SSL/TLS to "Full (strict)" in the Cloudflare dashboard.
Importing Your First Recipes
From a URL
- Click + New Recipe in the top right
- Choose Import from URL
- Paste the recipe URL (e.g., from AllRecipes, NYT Cooking, Serious Eats)
- Mealie scrapes ingredients, instructions, and images automatically
Mealie uses a community-maintained scraper library that supports hundreds of sites. If a site fails, you can file a scraper issue upstream or enter the recipe manually.
From a File
Mealie supports importing from:
- Nextcloud Cookbook (JSON export)
- Paprika (zip export)
- Chowdown (YAML)
- Tandoor (JSON)
- ZIP archive of JSON files
Go to Settings → Data Management → Import to upload.
Scraping Tips
Some sites block scrapers aggressively. For those, use the browser extension or copy the recipe text manually. The Mealie community also maintains a list of supported sites in the docs.
Meal Planning
The meal plan view is where Mealie shines. You can:
- Go to Meal Plan from the sidebar
- Drag recipes onto days of the week
- Click Create Shopping List to auto-generate a grocery list from all meals
The shopping list groups items by category (produce, dairy, pantry) and lets you check off items as you shop. It syncs across devices in real time.
Recipe Scaling
When adding a recipe to the meal plan, you can specify the number of servings. Mealie automatically scales ingredient quantities — handy for cooking for two instead of four.
Multi-User and Family Sharing
Mealie supports groups — a household sharing a single recipe library:
- Go to Admin → Groups
- Create a group (e.g., "Family")
- Invite other users by email
All group members share the same recipe library and meal plan. Recipes can be marked private if you want to keep some personal.
Each user gets their own account with their own meal plan view, but shared recipes are accessible to everyone in the group.
OIDC / SSO Integration
If you're running Authentik or Authelia, Mealie supports OIDC. Set these environment variables:
environment:
OIDC_AUTH_ENABLED: true
OIDC_CONFIGURATION_URL: https://auth.yourdomain.com/application/o/mealie/.well-known/openid-configuration
OIDC_CLIENT_ID: mealie
OIDC_CLIENT_SECRET: your-client-secret
OIDC_USER_GROUP: mealie-users
OIDC_ADMIN_GROUP: mealie-admins
OIDC_AUTO_REDIRECT: false
With OIDC_AUTO_REDIRECT: false, users can choose to log in with OIDC or a local account. Set to true to force SSO.
Backups
Mealie stores everything in /app/data inside the container. Back up the named volume:
# Stop Mealie, copy data, restart
docker compose stop mealie
docker run --rm \
-v mealie-data:/source \
-v /backup:/dest \
alpine tar czf /dest/mealie-$(date +%Y%m%d).tar.gz -C /source .
docker compose start mealie
For automated daily backups, add this to cron:
0 3 * * * /path/to/backup-mealie.sh
The REST API
Mealie exposes a full REST API at /api. Get your API token from Profile → API Tokens.
Example: fetch all recipes:
curl -H "Authorization: Bearer YOUR_TOKEN" \
https://recipes.yourdomain.com/api/recipes?perPage=50
This lets you build automations — like pulling this week's meal plan into a Home Assistant dashboard or posting tonight's dinner to a family chat.
Mealie vs Alternatives
| Feature | Mealie | Tandoor | Nextcloud Cookbook |
|---|---|---|---|
| URL import | ✅ Excellent | ✅ Good | ⚠️ Limited |
| Meal planning | ✅ | ✅ | ❌ |
| Shopping lists | ✅ | ✅ | ❌ |
| Mobile PWA | ✅ | ✅ | ✅ |
| API | ✅ Full REST | ✅ | ⚠️ Nextcloud API |
| OIDC/SSO | ✅ | ✅ | Via Nextcloud |
Tandoor is the other popular self-hosted recipe manager. It's more powerful for nutritional tracking but has a steeper UI learning curve. Mealie wins on polish and ease of use for most households.
Nextcloud Cookbook works if you're already on Nextcloud, but it's limited — no meal planning, no shopping list generation.
Troubleshooting
URL import fails: Check the scraper logs with docker compose logs mealie. Many recipe sites use JavaScript rendering that scrapers can't handle. Try a different URL format for the same recipe (some sites have printer-friendly versions that work better).
Slow image loading: By default, Mealie fetches and caches images from external sources. The cache lives in /app/data/img/. If disk space is tight, set AUTO_BACKUP_ENABLED=false and manage image storage manually.
Can't log in after update: Mealie occasionally has breaking changes on major versions. Check the changelog before updating. Use image: ghcr.io/mealie-recipes/mealie:v1.x.x to pin to a specific version.
Wrapping Up
Mealie is one of those self-hosted apps that genuinely replaces a commercial service without compromise. URL import works well, meal planning is intuitive, and shopping list generation saves real time. For households that cook regularly, it's an instant quality-of-life improvement.
The Docker setup takes under 10 minutes. Give it a try.
