Skip to content

Self-host Tandoor Recipes

updated Sep 2026prices checked · Jul 2026
We earn commissions when you shop through the links below. Full disclosure →

A self-hosted recipe manager and meal planner for power users: import recipes from thousands of sites, plan several meals a day, and turn plans into shopping lists shared across a household.

Key facts

CategoryRecipes
LicenseAGPL-3.0 with Commons Clause
StackPython, Vue
Min RAM1024 MB
Official imageyes
Difficulty
Our recommendation

Pick Tandoor Recipes when a large or shared recipe collection needs more than a scraper and a calendar: it is a Django (Python) app with a Vue frontend, and the recommended install is Docker Compose with two services — `postgres:16-alpine` and the `vabene1111/recipes` image, which since Tandoor 2 bundles nginx and serves everything on port 80. You get import from thousands of sites that publish ld+json or microdata, importers from other recipe managers (Mealie, Paprika, Nextcloud and more), full-text search with trigram similarity, meal plans with several meals a day, shopping lists from plans or recipes, and households and spaces for sharing. Upstream publishes no RAM figure for Docker; our 1 GB floor is an estimate. The code is AGPL-3.0 with a Commons Clause selling restriction. If you want one container on SQLite instead, Mealie is the catalog's other recipe manager.

What you need

  • Any VPS with at least 1024 MB of RAM
  • A domain you control — most self-hosted setups need HTTPS in front of them
  • Under an hour if you've used Docker before
Where to host itaffiliate disclosure
Hetzner Cloudrun it on
From $23.59/mo · 2 vCPU / 4 GB / 80 GB · EU + US
Get Hetzner Cloud (opens in new tab)
Kamaterafree trial
From $4/mo · 1 vCPU / 1 GB / 20 GB · US + EU + Asia
Start free on Kamatera → (opens in new tab)
DigitalOceanalso works on
From $6/mo · 1 vCPU / 1 GB / 25 GB · US + EU + Asia
Deploy on DigitalOcean → (opens in new tab)

Paid link — we earn a commission if you shop through it.

Install

Run these commands on your server:

# Tandoor Recipes — upstream's "plain" compose (PostgreSQL 16 + the Tandoor image with its built-in nginx) and .env template
mkdir tandoor && cd tandoor
wget https://raw.githubusercontent.com/TandoorRecipes/recipes/develop/docs/install/docker/plain/docker-compose.yml
wget https://raw.githubusercontent.com/TandoorRecipes/recipes/develop/.env.template -O .env
# edit .env — required: SECRET_KEY (upstream: base64 /dev/urandom | head -c50), POSTGRES_PASSWORD, ALLOWED_HOSTS=your.domain
docker compose up -d
# →  http://SERVER_IP (port 80) — wait 2–3 minutes for first-start migrations; the first visit opens /setup to create the admin

What you take on

Tandoor's docs are candid about what a Docker install leaves to you:

non-negotiableBefore the first start, the .env downloaded from .env.template needs SECRET_KEY (upstream suggests base64 /dev/urandom | head -c50), ALLOWED_HOSTS and POSTGRES_PASSWORD. The first start runs database migrations — upstream says to wait at least 2–3 minutes — and while no user exists the first visit redirects to /setup to create the admin. Local signup is off by default (ENABLE_SIGNUP=0), but social login can still create accounts unless SOCIALACCOUNT_AUTO_SIGNUP=0 is set.
non-negotiableThere is no built-in backup: upstream says "There is currently no 'good' way of backing up your data implemented in the application itself." Dump PostgreSQL with pg_dumpall and copy the mediafiles directory yourself. Copying the raw postgresql folder only restores on the same PostgreSQL version.
non-negotiableUpdates are docker compose down, docker compose pull, docker compose up -d after a backup and a read of the release notes. There is "no mechanism to downgrade the database", so a bad upgrade means restoring a dump; the default latest tag can be pinned to an X.Y.Z tag. Moving to a newer PostgreSQL major is a manual dump and restore.
non-negotiableThe official plain compose publishes port 80, so anything else on the host's port 80 blocks it; behind a reverse proxy, pass Host and X-Forwarded-Proto. Tandoor 2 no longer builds images for arm/v7, and upstream says the app "is not meant to be run as a public page."
non-negotiableThe AGPL-3.0 licence carries the Commons Clause, which withholds the right to sell the software, including paid hosting or support whose value derives from it. Self-hosting for yourself, a family or a team is unaffected. AI features (import from images, PDFs or text; step sorting; nutrition extraction) are enabled per space by default but need an AI provider you configure through LiteLLM, with a per-space spending cap.
non-negotiableThe 1 GB floor is our estimate for the app container (gunicorn defaults to 3 workers) plus PostgreSQL. Upstream's only memory figure, at least 2048 MB, is for the manual install's yarn build step, which the Docker image skips.

Head-to-head

More self-hosted tools

We use analytics cookies (Google Analytics, PostHog) to see which guides are useful. No ad networks, no cross-site tracking. See our privacy policy.