How to Install Mealie (Self-Hosted Recipes, Meal Plans and Shopping Lists)

Every household has recipes scattered across bookmarks, screenshots, a notes app and a folder in the kitchen. Mealie gathers them: paste a URL and it pulls the ingredients, steps and photo out of the page (minus the 2,000-word life story), lets you plan the week, turns the plan into a shopping list, and works nicely on a phone. It's one of the most-used things on many home servers.
Quick reference
| Task | What |
|---|---|
| Folder | ~/docker/mealie/compose.yaml |
| Web | http://server-ip:9925 |
| First login | changeme@example.com / MyPassword — change both |
| Import a recipe | + → Import from URL |
| Bookmarklet / share | share a page to Mealie from the phone's share sheet |
| Household accounts | Settings → Users |
1. The compose file
mkdir -p ~/docker/mealie && cd ~/docker/mealie
nano compose.yaml
services:
mealie:
image: ghcr.io/mealie-recipes/mealie:latest
container_name: mealie
ports:
- "9925:9000"
environment:
ALLOW_SIGNUP: "false"
PUID: 1000
PGID: 1000
TZ: Europe/London
BASE_URL: https://recipes.example.com
DB_ENGINE: sqlite
volumes:
- ./data:/app/data
restart: unless-stopped
SQLite is fine for a household. Set BASE_URL to whatever address you'll actually use (the LAN address is fine if you won't proxy it).
docker compose up -d
sudo ufw allow 9925/tcp
2. First login
Open http://192.168.1.50:9925. Log in with changeme@example.com / MyPassword, then straight to the profile → change the email and password. Create a user for each person in Settings → Users (sign-up is off, so you add them).
3. Import a recipe
+ (Create) → Import from URL, paste the page, Import. Mealie reads the structured recipe data most sites embed, and the result is just the recipe: ingredients, steps, time, servings, photo. Edit anything it got wrong. For sites with no structured data, paste the text into Create from text and it parses that instead.
On a phone, install Mealie as a web app (browser → Add to Home Screen) and recipes can be shared straight to it from the share sheet.
4. Cook from it
Open a recipe → Cook mode keeps the screen on and shows one step at a time. Change the servings and quantities scale. Tick ingredients off as you go.
5. Plan the week and shop
Meal planner — drag recipes onto days, or Generate for a random plan from your favourites. Then Shopping lists → Add from meal plan: ingredients are combined (two recipes with onions become one line) and sorted by shop section. Tick things off in the aisle on your phone; the list syncs for whoever else is shopping.
6. Organise
Tags (quick, vegetarian, kids), categories (dinner, baking), cookbooks (saved searches that appear as books). Settings → Data management backs up the whole database to a zip and restores it; also back up ./data with everything else.
Behind the proxy
recipes.example.com → 127.0.0.1:9925 (tutorial 28), HTTPS, and BASE_URL to match. Behind the VPN is fine too; recipes aren't secret, but the household's accounts are.
Troubleshooting
Import gets nothing from a site. The page has no recipe markup. Use Create from text or Create from image (it OCRs a photo of a cookbook page).
Photos missing after a restore. Images live in ./data/recipes/; the zip backup includes them, a database-only copy doesn't.
Login page says "signup disabled" to a family member. Correct — create their account in Settings → Users.
Shopping list on two phones isn't syncing. Both must be logged in to the same household; refresh the page.
Wrapping up
One container, change the default login, paste a URL. The household's recipes live in one searchable place, the week gets planned on Sunday, and the shopping list is on everyone's phone by Monday.
