Mealie
Recipe manager and meal planner that imports from URLs, photos and cooking videos
Mealie stores recipes, builds weekly meal plans and turns those plans into shopping lists, with an import path that scrapes a recipe page and fills in the fields for you. It replaces Paprika or a folder of browser bookmarks, and it keeps the recipes as your data rather than a vendor's.
Our verdict on Mealie#
Mealie is on 3.25.1 as of 4 September 2026 and ships roughly every two weeks. The 3.0 line (July 2025) rebuilt the frontend on Nuxt 3 and Vue 3, so screenshots and theming guides written for 1.x no longer match. The part to understand before you commit a recipe collection to it is the importer. URL import escalates in three steps: a direct fetch that rotates real browser TLS fingerprints, then an optional proxy at SCRAPER_PROXY_URL, then a self-hosted FlareSolverr at SCRAPER_FLARESOLVERR_URL, and only when the page is still blocked. Steps two and three are opt-in and Mealie ships neither, so a default install imports most sites cleanly and just fails on the Cloudflare-heavy ones. AI is separate and off by default: point it at OpenAI or a local Ollama and you get an ingredient parser, a scraper fallback and video transcription. Without it, the built-in NLP parser fumbles unusual units.
Who Mealie is for#
Choose it if
- A household that cooks from the internet and wants the recipes to survive the site going down or paywalling
- Anyone who plans a week of meals and wants the shopping list generated from it rather than retyped
- People migrating off Paprika, Copy Me That, Nextcloud Cookbook or Tandoor, all of which have documented importers
- Someone willing to run Ollama or pay a few dollars a month to OpenAI for a genuinely good ingredient parser
Look elsewhere if
- Your recipes come from a handful of aggressively bot-blocked sites and you will not run FlareSolverr or a proxy
- You want offline-first mobile use: it is a PWA, and it needs the server reachable to do anything interesting
- You want nutrition tracking or macro calculation as a first-class feature; nutrition fields are free text you fill in
What running it actually looks like#
One container, ghcr.io/mealie-recipes/mealie, serving both API and frontend on port 9000 (the docs' example publishes it as 9925). Mount a volume at /app/data for the database, recipe images and uploads. SQLite is the default and is fine for 1 to 20 users, but the docs warn explicitly against putting it on network-attached storage and tell you to use Postgres there instead. Set PUID and PGID (both default to 911) to match whoever owns the volume, BASE_URL for OIDC callbacks and notification links, and ALLOW_SIGNUP=false unless you want open registration. Add an explicit memory: 1000M limit, which the compose annotations recommend. Pin an exact version tag: the maintainers ask you to update deliberately after reading release notes rather than track latest.
Resource profile#
- Memory
- 300 MB idle, around 600 MB in ordinary use. FastAPI plus the NLTK data loaded at start. The docs recommend capping the container at roughly 1000M because Python will otherwise pre-allocate to fit a large host and look like a leak.
- CPU and acceleration
- Idle is close to nothing. Spikes are URL imports, image resizing on upload, and any AI or FlareSolverr call, where a single headless-browser fetch can take several seconds of real CPU.
- Storage growth
- The database stays in the tens of MB. Recipe images and their generated thumbnails dominate, at a few hundred KB per recipe, so a thousand-recipe library lands in low single-digit GB.
- Operational load
- 2 of 5, Light. One container, SQLite by default, upgrades are a tag bump and an automatic migration. It scores 2 rather than 1 because the release cadence is roughly fortnightly, the project tells you to pin a version and read notes, and SQLite means a live file copy is not a safe backup.
Figures describe a small single-household install and are the working assumptions behind our stack planner. Your numbers will differ with library size, user count and hardware. See methodology.
Data and backup surface#
Everything lives under /app/data: the SQLite database, plus per-recipe directories holding the original image, generated thumbnails and any assets you attached. A live file copy of a SQLite database is not safe, and less so if you enabled SQLITE_MIGRATE_JOURNAL_WAL, so either stop the container for the copy or use Mealie's own admin backup, which writes a zip of the database and the data directory together. On Postgres it is pg_dump plus the same volume, because images never go into the database. Thumbnails and the NLTK data baked into the image are regenerable. Restore is a Mealie-side operation: the admin restore expects one of its own archives, not a hand-assembled directory.
Derived backup shape
SQLite backup. sqlite3 <db> ".backup out.db" while running, or stop the container and copy. A live cp of a WAL-mode SQLite file can restore corrupt.
Traps and surprises#
Imports fail silently on bot-protected sites
Out of the box Mealie only does the direct fetch with rotating TLS impersonation. Sites behind a Cloudflare challenge return a block, and you get an import error rather than a recipe. The fixes are opt-in and self-hosted: SCRAPER_PROXY_URL (with SCRAPER_PROXY_MODE=fallback if you pay per request) and a FlareSolverr sidecar at SCRAPER_FLARESOLVERR_URL. Note that FlareSolverr returns HTML only, so image downloads never use it and a recipe can import with no picture.
AI providers are configured in the UI, not env vars
The OpenAI-compatible integration is set per group under group settings: a default provider, optionally a separate image-capable one and an audio one for video transcription. Only OPENAI_CUSTOM_PROMPT_DIR and YTDLP_COOKIEFILE are environment variables now. Ollama works by setting base_url to http://your-host:11434/v1, but you must still supply some API key string because the client requires one even though Ollama ignores it.
Python expands to fill the host without a memory limit
The install docs put an explicit note on the compose file: set a memory limit, because Python pre-allocates larger arenas on machines with a lot of RAM and the container then idles far higher than it needs to. The suggested value is 1000M. Without it, people on 64 GB servers report Mealie sitting at well over a gigabyte at rest and mistake it for a leak. Add deploy.resources.limits.memory and the idle number drops.
3.0 moved admin routes and removed template rendering
3.0 relocated the admin user endpoints from /api/users to /api/admin/users for every verb, so scripts, dashboards and provisioning tooling built against the old paths return 404 after the upgrade. The same release removed backend Jinja2 template rendering from the API entirely; it was never surfaced in the UI, but anyone using it for custom recipe exports has to move that to a client-side template.
The expanded food seed does not overwrite yours
3.0 grew the seeded food database from 214 entries to over 2,500, all categorized, which is what makes sorted shopping lists work out of the box. Re-seeding on an existing install does not overwrite entries you already have, so your older uncategorized foods stay uncategorized and shopping lists stay half-sorted. Fixing it means editing those foods by hand or clearing and re-seeding, which unlinks them from existing recipes.
Specifications#
- Category
- Tasks, recipes and personal finance
- Licence
- AGPL-3.0-or-later (Copyleft)
- Written in
- Python (FastAPI) / Vue (Nuxt 3)
- First release
- 2020
- Maturity
- Mature
- Datastore
- SQLite by default, PostgreSQL optional
- Default ports
9000- Ships as
- docker, docker compose
- arm64 builds
- Yes
- Identity
- Native OIDC. Native OIDC with discovery, admin and group claim mapping, and `ALLOW_PASSWORD_LOGIN=false` to hide the local login form entirely.
- Replaces
- Paprika, Copy Me That, Samsung Food (Whisk), Pinterest recipe boards
- Project site
- mealie.io
- Source
- github.com/mealie-recipes/mealie
- Documentation
- docs.mealie.io
Alternatives to Mealie#
Everything else in tasks, recipes and personal finance, closest in operational weight first.
| Tool | Ops load | Idle RAM | Licence |
|---|---|---|---|
| Actual Budget | 2, Light | 120 MB | MIT |
| Vikunja | 2, Light | 70 MB | AGPL-3.0-or-later |
| Firefly III | 3, Moderate | 250 MB | AGPL-3.0-or-later |
| PLANKA | 3, Moderate | 220 MB | PLANKA Community License (Fair Use License 1.1) |
| grocy | 1, Set and forget | 40 MB | MIT |
Sources#
Facts on this page were checked against the project's own material. Where a number is our own estimate rather than a published figure, the text says so.
Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.