Self-hosted · open source · one container

The meal planner for one household, not a market of them.

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.

Scroll

What's inside

Everything a household kitchen actually needs.

Nothing else. No meal-kit ads, no macro tracking, no social feed — just the loop from recipe to calendar to shopping list.

One shared calendar

Breakfast, lunch, dinner, snack — four fixed slots a day, visible to the whole household at once.

Structured recipes

Ordered method steps, quantity + unit ingredients, tags, and an optional photo — not a wall of freeform text.

Plans, not just dates

A plan is a playlist of meals — unscheduled, reorderable — kept deliberately separate from the calendar itself.

Shopping lists

Computed on demand from a plan or a date range. Save one to check items off, rename it, or hand-edit it.

Personal pins

Pin a meal, plan, or list to the top of your own view. Pins are private — nobody else sees what you've pinned.

Invite-only, always yours

No anonymous access. Sign-up needs an admin-issued invite code, and the very first account bootstraps as admin.

Run it

One container. One volume. No database server.

SQLite lives inside the app's own volume, so there's nothing else to provision — pull the published image and start it.

compose.yaml
# 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.