Taking Control of Your Recipe Collection
Most recipe apps come with a catch: your data lives on someone else’s server, the interface gets redesigned without warning, and the free tier quietly vanishes behind a paywall. Tandoor is a self-hosted recipe manager that puts your cookbook back under your control. Built with Django and designed for home servers, it handles everything from ingredient scaling to meal planning, with a clean web UI that works across devices.
Running Tandoor on your own hardware means your recipes stay private, your data doesn’t train anyone’s recommendation algorithm, and you’re not locked into a subscription. Setup takes under 30 minutes with Docker, and the end result is a full-featured recipe database you can share with your household or keep entirely to yourself.

What You Need Before You Start
Tandoor runs well on any machine that can handle Docker – a Raspberry Pi 4, an old desktop repurposed as a home server, or a cloud VPS all work fine. You’ll need Docker and Docker Compose installed, a basic comfort level with terminal commands, and a spare port to expose the app on your network. If you want to access Tandoor outside your home, a reverse proxy like Nginx Proxy Manager or Caddy will handle that cleanly.
Before pulling any files, decide where you want to store your recipe data and media uploads. Tandoor uses a PostgreSQL database and stores images separately, so creating a dedicated folder structure now will save you reorganizing later. Something like /opt/tandoor/ with subfolders for mediafiles and staticfiles keeps everything tidy. Note the paths – you’ll reference them in your Compose file.
Setting Up with Docker Compose
The Tandoor project maintains an official Docker Compose file on its GitHub repository. Download it directly, or create your own docker-compose.yml in your chosen directory. The official file includes three services: a PostgreSQL container, the Tandoor application container, and an Nginx container that serves static and media files. All three need to run together for the app to work correctly.
Alongside the Compose file, Tandoor requires a .env file to configure environment variables. Copy the provided .env.template file from the repository and rename it. The key variables to set are SECRET_KEY (generate a long random string), DB_ENGINE (set to django.db.backends.postgresql), and the database credentials: POSTGRES_DB, POSTGRES_USER, and POSTGRES_PASSWORD. Pick strong values here and keep them consistent across both the app and database service definitions.
You’ll also want to set ALLOWED_HOSTS to the IP address or domain name you plan to reach Tandoor from. If you’re running locally and plan to use a reverse proxy, you can set this to your internal IP for now and update it once your domain is pointed correctly. The TIMEZONE variable matters too – set it to your local timezone string (for example, America/New_York) so that meal plan dates and import timestamps show correctly.
With the files configured, run docker compose up -d from your Tandoor directory. Docker will pull the images and start all three containers. Give it a minute, then check that everything came up with docker compose ps – you should see all three containers listed as running. If the app container restarts repeatedly, check your .env file for typos in the database credentials; mismatched values between the app and the database service are the most common startup issue.

Creating Your First Account
Once the containers are running, open a browser and navigate to http://your-server-ip:80 (or whichever port you mapped in the Compose file). Tandoor will show a login screen. To create the initial admin account, run the following command against the app container: docker compose exec web_recipes python manage.py createsuperuser. Follow the prompts to set a username, email, and password. Log in with those credentials and you’ll land on the main dashboard.
From the admin panel at /admin, you can create additional user accounts for family members or housemates and control their permissions. Tandoor supports a sharing model where some users can edit and add recipes while others can only view – useful for households where not everyone needs full access.
Importing Recipes and Getting Organized
Tandoor’s built-in recipe importer supports URL scraping from a wide range of cooking websites. Paste a recipe URL into the import field, and Tandoor will attempt to pull the title, ingredients, instructions, and images automatically. The success rate varies by site – heavily JavaScript-rendered pages sometimes require manual entry – but for major recipe publishers the importer handles the heavy lifting well.
For bulk imports, Tandoor supports several common formats including Nextcloud Cookbook JSON and a handful of other structured formats. If you’re migrating from another recipe app, check whether it can export to one of those formats before resorting to manual re-entry. The Tandoor community has also built a browser extension for Chrome and Firefox that lets you clip recipes directly from any page with a single click, which speeds up building your library considerably.
Once recipes are in, the keyword and category system is where Tandoor really earns its keep. You can tag recipes with dietary labels, cuisine types, difficulty levels, or anything else that matches how you think about cooking. The meal planning view uses these tags to filter suggestions, so if you’ve organized your recipes consistently, planning a week of meals takes far less time than scrolling through a flat list. Tandoor also tracks which ingredients appear across multiple recipes, which feeds into its shopping list generator – mark a meal plan as active and it consolidates ingredients across every recipe automatically.

Keeping Tandoor Running
Updates come through Docker image pulls. When a new Tandoor version is released, run docker compose pull followed by docker compose up -d to replace the running containers with the updated images. Tandoor runs database migrations automatically on startup, so schema changes apply without manual intervention. Back up your PostgreSQL database before any major version update – a simple docker compose exec db pg_dump -U your_db_user your_db_name > backup.sql takes seconds and covers you if anything goes wrong.
For access outside your home network, placing Tandoor behind a reverse proxy with HTTPS is the right call. Nginx Proxy Manager makes this straightforward even without deep server knowledge, and pairing it with a free Let’s Encrypt certificate means your login credentials are never transmitted in plain text. Set ALLOWED_HOSTS in your .env file to your domain name, restart the containers, and Tandoor will be reachable wherever you have an internet connection – which is the point where a self-hosted recipe manager stops feeling like a project and starts feeling like an actual tool.





