Mealie: A Self-Hosted Recipe Manager for People Who Actually Cook
Reclaim your recipes from ad-choked sites and lost bookmarks

I have a confession. For years my recipe collection was a chaotic sprawl of browser bookmarks, screenshots, a Google Doc nobody could find, and three different paper notebooks with the handwriting of a doctor having a stroke. Every time I wanted to cook something I’d dig up the original blog post, scroll past 1,400 words about the author’s grandmother in Tuscany, dodge a video ad that started playing on its own, and then finally reach the bit telling me how much flour to use.
Mealie fixed that. It’s a self-hosted recipe manager you run on your own box, and it has quietly become one of the most-used services on my home server.
1 What Mealie actually is
Mealie is a single-container web app for managing recipes. The headline feature, the one that sells it in ten seconds, is the URL importer: paste a recipe link and Mealie scrapes it, pulls out the ingredients and method, and saves a clean, structured copy with none of the life story and none of the ads. Just the food.
Beyond that you get:
- A proper recipe database with tags and categories you control.
- Meal planning — drag recipes onto a calendar.
- Shopping lists generated from those recipes.
- A genuine REST API, so it plays nicely with other tools and a bit of scripting.
- Multi-user support, so the whole household isn’t sharing one login.
It’s open source, it’s actively developed, and it doesn’t phone home to a company that might pivot to selling your meal data to a supermarket.
2 Getting it running
Mealie ships as a Docker image and it’s about as painless as self-hosting gets. You can run it against the bundled SQLite database (fine for a single household) or point it at Postgres if you want something sturdier. Here’s a compose file that uses Postgres, which is what I’d recommend if you intend to keep this around:
services:
mealie:
image: ghcr.io/mealie-recipes/mealie:latest
container_name: mealie
restart: unless-stopped
ports:
- "9925:9000"
environment:
ALLOW_SIGNUP: "false"
BASE_URL: "https://mealie.example.com"
DB_ENGINE: postgres
POSTGRES_USER: mealie
POSTGRES_PASSWORD: change-me-please
POSTGRES_SERVER: postgres
POSTGRES_DB: mealie
volumes:
- ./mealie/data:/app/data
depends_on:
- postgres
postgres:
image: postgres:15
container_name: mealie-postgres
restart: unless-stopped
environment:
POSTGRES_USER: mealie
POSTGRES_PASSWORD: change-me-please
POSTGRES_DB: mealie
volumes:
- ./postgres:/var/lib/postgresql/dataA few things worth flagging. The BASE_URL matters more than it looks — get it wrong and the import preview and share links misbehave. The ./mealie/data volume is the bit you actually care about: it holds recipe images and the uploaded files, so that’s what your backup job needs to cover. And I set ALLOW_SIGNUP: "false" after creating my admin account, because there’s no reason to leave the door open once everyone who needs an account has one. Stick it behind a reverse proxy with TLS and you’re done.
If you’d rather skip Postgres entirely, drop the second service, remove the DB_ENGINE and POSTGRES_* variables, and Mealie falls back to SQLite inside that same data volume. Honestly, for one family it’s perfectly fine.
3 The actual workflow
This is where it earns its keep. Say I’ve found a curry recipe on some blog. I open Mealie, hit Create → Import from URL, paste the link, and a few seconds later I’ve got a tidy recipe card: title, ingredients as a proper list, numbered steps, a photo, and the source link preserved so I can credit the original.
Then I tidy it. I add tags — curry, weeknight, freezer-friendly — and slot it into a category like Mains. This sounds fussy, but two months later when I search “freezer-friendly” and get back the eight things I actually cook, the five minutes of tagging pays for itself many times over.
From there it’s meal planning. I open the planner, drag recipes onto the days of the week, and once the week is roughed out I generate a shopping list straight from those recipes. Mealie pools the ingredients, I tick off what’s already in the cupboard, and I shop from my phone. That loop — import, tag, plan, list — is the whole reason to run this thing, and it maps onto how a home cook genuinely operates rather than how an app designer imagines they do.
4 The honest bits
Import quality varies, and it varies a lot. Sites that publish proper structured recipe metadata import beautifully; the big recipe networks and most well-built food blogs are flawless. Smaller or older sites that just bung the recipe into a wall of prose will give you a half-parsed mess you’ll need to fix by hand. The importer is good, not magic. Budget for the occasional cleanup.
There’s also the usual self-hosting tax: you own the backups, the updates, and the reverse proxy. If ./mealie/data and your database aren’t being backed up, you don’t have a recipe collection — you have a recipe collection waiting to be deleted.
5 Who it’s for
If you cook regularly, hoard recipes, and resent the modern recipe-blog experience, Mealie is close to ideal. If you already run a home server it’s a no-brainer evening project. If you cook from boxes and order takeaways, this isn’t for you and that’s fine.
For me it replaced the bookmarks, the screenshots, the Doc and the doctor’s-handwriting notebooks with one clean, searchable, ad-free place. My only regret is the years I spent scrolling past somebody’s grandmother to find the flour.




