Taking Control of Your Meal Planning Without Handing Data to a Subscription App
Mealie is an open-source recipe manager and meal planner you can run entirely on your own hardware. It stores your recipes, organizes your weekly meal schedule, and generates shopping lists – all without a monthly fee, an account on someone else’s server, or ad-driven recipe pages you have to scroll past to find the ingredient list. If you already run a home server or a small VPS, adding Mealie to that stack takes under thirty minutes.
The appeal goes beyond privacy. Mealie supports recipe scraping, meaning you paste a URL and it extracts the recipe data automatically. It also offers a REST API, multi-user support with household accounts, and a clean mobile-friendly interface. This guide walks through deploying Mealie using Docker Compose, securing it behind a reverse proxy, and getting the first recipes imported.

What You Need Before Starting
The setup assumes you have Docker and Docker Compose installed on a Linux machine – a Raspberry Pi, a home server running Ubuntu, or a cheap VPS all work fine. You will also need a domain name or local hostname if you want to access Mealie from outside your home network. The application itself is lightweight: Mealie recommends at least 1GB of RAM, though it runs comfortably on less under normal household use. Storage requirements depend on how many images you attach to recipes, but a few gigabytes covers most home libraries.
You should also decide early whether you want Mealie to be publicly accessible over the internet or restricted to your local network only. A public setup requires a reverse proxy with HTTPS – Nginx Proxy Manager or Caddy are the most common choices in the self-hosting community. A local-only setup is simpler but limits access from outside your home Wi-Fi. Both configurations use the same Docker Compose file; the difference is purely in how you expose the port. If you are already running other self-hosted services, you likely have a reverse proxy in place already and this step is just adding a new entry to your existing config.
Writing the Docker Compose File
Create a project directory – something like /opt/mealie or ~/docker/mealie – and inside it create a file named docker-compose.yml. The basic configuration uses the official Mealie image from ghcr.io/mealie-recipes/mealie with a tagged version rather than latest, so updates do not break your instance unexpectedly. Set a named volume for /app/data to persist your recipe database and uploaded images across container restarts.
The environment variables are where most of the meaningful configuration lives. Set PUID and PGID to match your host user to avoid permission issues with the volume. Set BASE_URL to the address where Mealie will be accessible – this matters for email links and the API. Set DEFAULT_GROUP and DEFAULT_EMAIL to configure the first household account. Mealie defaults to a SQLite database for simple setups, but you can point it at a PostgreSQL instance by adding the DB_ENGINE, POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_SERVER, and POSTGRES_DB variables. For a single-household setup, SQLite is perfectly adequate and removes the need to run a separate database container.
The default port is 9000. Map it with 9000:9000 in the ports section if you are accessing Mealie directly, or skip the port mapping and connect it to a Docker network shared with your reverse proxy. Once the file is saved, run docker compose up -d from the project directory. Docker pulls the image and starts the container. Give it about thirty seconds on first launch while it initializes the database, then navigate to the address in your browser.

First Login, Configuration, and Recipe Import
Mealie creates a default admin account on first run using the email you set in DEFAULT_EMAIL and the password MyPassword – change this immediately. After logging in, go to the admin panel under your profile menu. The admin panel covers user management, backup scheduling, SMTP configuration for email notifications, and OIDC settings if you want to connect Mealie to an external identity provider like Authentik or Authelia. For a household with a few users, the built-in user management is enough: create accounts for each person, assign them to the same group, and they share the same recipe library and meal plans.
Recipe import is where Mealie earns its keep quickly. The scraper supports a wide range of recipe sites – paste the URL into the import dialog and Mealie pulls the title, ingredients, instructions, cook time, and images automatically. Results vary by site depending on how cleanly the source uses structured recipe markup, but the success rate on major recipe platforms is high. You can also import from a JSON file using the standard Recipe JSON-LD format, which means migrating from other recipe managers that support export is straightforward. Mealie also accepts imports from a handful of specific app formats including Paprika and Nextcloud Cookbook, which covers a lot of common migration paths.
Once your recipes are in, the meal planning interface lets you drag recipes onto calendar days for the week ahead. Each day supports breakfast, lunch, dinner, and a side category. From any planned week, Mealie generates a consolidated shopping list that merges ingredient quantities across all scheduled recipes. The list can be viewed in the app, shared via a link, or exported. There is no native integration with grocery delivery services, but the API lets you pull the list into any automation tool you are already running – Home Assistant, n8n, or a simple script that sends the list to a messaging app.

Backups deserve attention before you accumulate a large recipe library. Mealie has a built-in backup tool in the admin panel that exports the entire database and uploaded files as a zip archive. Schedule this on a cadence that matches how often you add recipes, and store the backup off the host machine – a network share, a cloud bucket, or even a simple rclone job works. The backup file is self-contained and restores cleanly to a fresh Mealie instance, which also makes migrating between servers straightforward. One thing to watch: if you switch from SQLite to PostgreSQL later, there is a migration path documented in the Mealie wiki, but it requires manual steps and is easier to plan for before you have hundreds of recipes rather than after.





