Mealie Recipe Manager: Self-Host Your Recipes With This Docker Setup
Install Mealie with Docker Compose, import recipes from any URL, and set up meal planning with a self-hosted recipe manager that actually works.
Mealie is a recipe manager and meal planner you run on your own hardware. Paste a URL from any recipe website, and it scrapes the recipe automatically — ingredients, steps, photos. Build a library. Plan meals for the week. Generate a shopping list.
I run it at mealie.homelab.lan and use it daily. The recipe import from URLs is genuinely good — it works on most major recipe sites without manual cleanup.
Install Mealie
mkdir -p ~/docker/mealie
cd ~/docker/mealie
docker-compose.yml:
services:
mealie:
image: ghcr.io/mealie-recipes/mealie:latest
container_name: mealie
restart: unless-stopped
ports:
- "9925:9000"
volumes:
- ./data:/app/data
environment:
TZ: America/New_York
BASE_URL: https://mealie.yourdomain.com
ALLOW_SIGNUP: "false"
DB_ENGINE: sqlite
DEFAULT_EMAIL: [email protected]
DEFAULT_PASSWORD: changeme
Start it:
docker compose up -d
Access at http://your-server-ip:9925. Log in with the email and password you set in the environment variables.
Change the admin password immediately after first login under User Profile → Change Password.
Import your first recipe
Go to Recipes → Create → Import from URL.
Paste any recipe URL — AllRecipes, NYT Cooking, Serious Eats, most food blogs. Mealie sends the URL to an internal scraper and returns structured recipe data. Review it, make any edits, and save.
The import works well on structured recipe sites. For hand-typed blog posts where the author buried the recipe in 2,000 words of personal anecdote, the scraper may grab the wrong content. Those cases require manual entry.
Bulk import: If you have recipes saved as bookmarks or in another app, you can export them to a recipe exchange format (Paprika, Nextcloud Cookbook) and import the whole set. Go to Admin → Backups and look for import options.
Set up recipe categories and tags
Before building a large library, create your category and tag structure. This makes filtering and planning easier later.
Categories are the primary organization (Breakfast, Lunch, Dinner, Snacks, Desserts).
Tags are secondary descriptors (Quick, Weeknight, Keto, Vegetarian, High Protein).
Go to Settings → Categories and Settings → Tags. Add the ones you’ll actually use. I keep it simple: 6 categories, maybe 10 tags.
Apply them as you import recipes or in bulk from the recipe list.
Meal planning
The meal planner (under Planner) shows a week view. Drag recipes onto days, or click a day to search for a recipe to add.
This is where Mealie earns its keep. Spend 10 minutes Sunday morning planning the week, and the shopping list generates automatically from the planned meals.
Shopping list
Go to Shopping Lists. Create a new list, then use Add from Meal Plan to populate it from your planned meals. It groups ingredients by category (Produce, Meat, Dairy, etc.) based on the ingredient tagging.
There’s a mobile-friendly web UI, so you can use it on your phone at the grocery store. No separate app required, though there are community apps if you want native mobile.
Household sharing
By default, one admin user controls everything. To share with family members:
Set ALLOW_SIGNUP: "false" (keep this — you don’t want random people creating accounts).
Create users manually under Admin → Users → Create User. Give each person their own login. They can view all recipes, add their own, and collaborate on meal planning.
For shared households, the household feature lets you separate recipe libraries and meal plans between groups.
Add HTTPS via NPM
In Nginx Proxy Manager, add a proxy host:
- Domain:
mealie.yourdomain.com - Forward to:
your-server-ip:9925 - Websockets: On
- SSL: Request certificate, force SSL
Update the BASE_URL in your compose file if you haven’t already:
docker compose down
# Edit docker-compose.yml to update BASE_URL
docker compose up -d
Backing up Mealie
The ./data volume contains everything: the SQLite database, uploaded photos, and configuration.
# Simple backup
tar -czf mealie-backup-$(date +%Y%m%d).tar.gz ~/docker/mealie/data
For Postgres instead of SQLite (worth it for larger libraries), change DB_ENGINE: postgresql and add a Postgres service. The Paperless-ngx guide has a full Postgres + app stack example you can adapt.
Troubleshooting
Import fails or returns empty: The site may not have structured recipe markup. Try manually creating the recipe. Some sites actively block scrapers.
Images not loading after moving to HTTPS: Make sure BASE_URL is set to your HTTPS URL, not HTTP, and restart the container.
Slow on first load: Mealie builds some caches on first run. Give it 30 seconds. Subsequent loads are fast.
For the Docker basics underlying this setup, the Docker Compose guide covers the patterns used here.