# Food — Meal Planning System A custom Django app for pantry tracking, meta-recipes, and meal planning. Built for Tom, operated primarily through Caine (OpenClaw AI assistant) via Matrix chat, with Django admin as the web UI. ## Architecture - **Django 5.2** (latest LTS) with SQLite backend - **Django REST Framework** for API with token auth - **HTMX** frontend planned (Phase 4) - **App name:** `kitchen` ### Core Concept: Meta-Recipes Instead of rigid recipes, the system uses **templates with swappable slots**: ``` "Stir Fry" = protein (chicken OR pork) + carb (noodles OR rice) + veg (any combo) + sauce ``` This matches how Tom actually cooks — same method, different ingredients depending on what's in the pantry. ## Models | Model | Purpose | |-------|---------| | `Tag` | Flexible ingredient tags (protein, carb, veg, etc.) | | `Ingredient` | Master ingredient list with aliases and shelf life | | `PantryItem` | Current kitchen inventory with location and expiry | | `MetaRecipe` | Cooking template with swappable slots | | `Slot` | A category in a meta-recipe (protein, carb, veg) | | `SlotOption` | An ingredient that can fill a slot, with qty/serving | | `MetaRecipeBase` | Always-needed ingredients (onion, garlic, oil) | | `Recipe` | Traditional fixed-ingredient recipe | | `RecipeIngredient` | Ingredient in a fixed recipe | | `CookLog` | What was cooked and when | | `ShoppingListItem` | Shopping list with reasons and checkboxes | ## Setup ```bash cd /var/lib/food source venv/bin/activate # Run migrations python manage.py migrate # Seed initial data (ingredients, pantry, meta-recipes) python manage.py seed # Create superuser (if not already done) python manage.py createsuperuser # Run dev server python manage.py runserver 0.0.0.0:8042 ``` ## Access - **Admin UI:** `http://localhost:8042/admin/` - **Browsable API:** `http://localhost:8042/api/` - **cgit:** `https://git.jihakuz.xyz/food/` ## API All endpoints require auth. Token auth for Caine, session auth for browser. ### Key Endpoints | Method | Endpoint | Purpose | |--------|----------|---------| | GET | `/api/what-can-i-cook/?servings=2` | Match pantry vs recipes | | POST | `/api/log-cook/` | Log a cooked meal, optionally deduct from pantry | | GET | `/api/pantry/` | List all pantry items | | GET | `/api/pantry/expiring/` | Items expiring within 3 days | | GET | `/api/pantry/restock/` | Staples needing restocking | | CRUD | `/api/ingredients/` | Ingredient master list | | CRUD | `/api/meta-recipes/` | Meta-recipes with nested slots | | CRUD | `/api/recipes/` | Fixed recipes | | CRUD | `/api/shopping-list/` | Shopping list | | CRUD | `/api/cook-log/` | Cooking history | ### Auth - **Token:** `Authorization: Token ` header - **Session:** Log in via admin or `/api-auth/login/` - **API users:** `tom` (admin), `caine` (API-only) ## File Structure ``` /var/lib/food/ ├── food_project/ # Django project config │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── kitchen/ # Main app │ ├── models.py # All 11 models │ ├── admin.py # Admin config with inlines │ ├── serializers.py # DRF serializers │ ├── views.py # ViewSets + what-can-i-cook + log-cook │ ├── urls.py # API router │ ├── management/ │ │ └── commands/ │ │ └── seed.py # Initial data seeder │ └── migrations/ ├── venv/ # Python virtual environment (gitignored) ├── db.sqlite3 # SQLite database (gitignored) ├── manage.py ├── requirements.txt └── README.md ``` ## Pantry Business Rules - **Freezer items** → no expiry date (frozen = indefinite) - **Fridge items** → expiry date set from ingredient's `shelf_life_days` if available - **Staples** (onions, frozen chips, salt, etc.) → auto-flag for restocking when quantity = 0 - **Onions** are a permanent staple — always restock - **Chicken skin** → remove before cooking (noted in slot option notes) - **Tom prefers pork** to chicken — pork mince over loins - **Cooked chicken** — 3 day max fridge life - **Defrosted sausages** — 2-3 days max ## Implementation Phases - [x] **Phase 1:** Django project + models + admin + seed data - [x] **Phase 2:** DRF API + token auth + "what can I cook?" + log-cook with pantry deduction - [ ] **Phase 3:** Recipe import (URL scraping + cookbook extraction) - [ ] **Phase 4:** HTMX frontend (pantry view, recipe browser, shopping list) - [ ] **Phase 5:** Systemd service + nginx reverse proxy + production hardening ## Caine Integration OpenClaw skill file at `~/.openclaw/workspace/skills/food/SKILL.md` teaches Caine the API each session. Natural language interface via Matrix: - "What can I cook?" → calls `/api/what-can-i-cook/` - "Add 6 eggs to the fridge" → POST to `/api/pantry/` - "Made stir fry with pork and noodles" → POST to `/api/log-cook/` with deduction - [Photo of shopping] → identify items, bulk add to pantry ## Design Doc Full design document: `Obsidian Vault/Tom Net/Meal Planning System.md`