Recipes, weekly plans, a shared calendar, and shopping lists — run on your own hardware, in your own timezone, with your own data. No accounts team, no upsell, no tracking.
What's inside
Nothing else. No meal-kit ads, no macro tracking, no social feed — just the loop from recipe to calendar to shopping list.
Breakfast, lunch, dinner, snack — four fixed slots a day, visible to the whole household at once.
Ordered method steps, quantity + unit ingredients, tags, and an optional photo — not a wall of freeform text.
A plan is a playlist of meals — unscheduled, reorderable — kept deliberately separate from the calendar itself.
Computed on demand from a plan or a date range. Save one to check items off, rename it, or hand-edit it.
Pin a meal, plan, or list to the top of your own view. Pins are private — nobody else sees what you've pinned.
No anonymous access. Sign-up needs an admin-issued invite code, and the very first account bootstraps as admin.
Run it
SQLite lives inside the app's own volume, so there's nothing else to provision — pull the published image and start it.
# compose.yaml services: home-meal-planner: image: ghcr.io/dev-cadet/home-meal-planner:latest restart: unless-stopped ports: - "3000:3000" environment: BETTER_AUTH_SECRET: # Generate with: openssl rand -base64 32 BETTER_AUTH_URL: # Example http://localhost:3000 or Proxied Address TZ: # Australia/Brisbane | Europe/London etc DATE_FORMAT: # DD/MM/YYYY | MM/DD/YYYY | YYYY-MM-DD MEASUREMENT_SYSTEM: # metric | imperial WEEK_STARTS_ON: # sunday | monday volumes: - meal-planner-data:/data volumes: meal-planner-data:
For the full set of options — invite-only registration, demo-mode flags, health checks — see the annotated compose.yaml in the repo.