dc01a0fefbd1069dab426e5a86d5544bc060a238
Bring docs in line with the post-AM-6 state so a fresh agent can pick up cleanly without first reconciling stale numbers: - pytest count: 88/59/31 → 92 across all references - live scrape: 9,960 rows / 36s → 9,980 rows / 44s (latest run, 2026-05-06) - migrations applied: 0001-0005 → 0001-0007 in both docs - verification gate updated with auto-minted JWT detail and the 29,779 ingredient_grocery_match rows produced post-scrape - "What is real" / Backend: added swiftly_auth.py bullet describing get_token() / mint_anonymous_token() / cache semantics + the 10,928-item live verification - file map: added services/swiftly_auth.py, services/matcher.py, services/planner/, mentioned scraper_service runs matcher post-scrape - file map: alembic versions 0001 → 0007, tests/ count = 92, marked config.py as no-longer-carrying SWIFTLY_BEARER_TOKEN - spec map line for swiftly-token-auto-mint: "next-up" → "Implemented" Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Meal Planner
Self-hosted meal planning system that integrates with Lucky California grocery store, sends weekly meal proposals via email to family members, generates shopping lists, and learns from feedback.
Background
This project was born out of frustration with meal kit services (Blue Apron → EveryPlate → HungryRoot → Sunbasket) that:
- Escalate costs to 3x ingredient markup
- Fall into repetitive meal rhythms
- Force users to log into apps to manage selections
- Don't integrate with home pantry items
Features
- Grocery Integration: Scrapes Lucky California weekly ads and sales
- Family Approval Workflow: Email proposals with approve/deny; one denial swaps the meal
- Shopping List Generation: Weekly list grouped by store aisles, highlighting sales
- Pantry Integration: Specify home items to incorporate into suggestions
- Web UI: Modern interface for the whole family
- Learning: Feedback-based meal recommendations
- Recipe Images: Scraped from public recipe sites, AI fallback available
Architecture
- Backend: Python/FastAPI
- Database: PostgreSQL
- Frontend: React + Tailwind CSS
- Email: SendGrid
- Hosting: Docker Compose with nginx reverse proxy
Documentation
Quick Start
# Clone and start
docker-compose up -d
# View logs
docker-compose logs -f
# Stop
docker-compose down
Family Profile
Household: 2 adults, 2 children
- One adult likes mushrooms, one child OK with them
- Three family members do NOT like mushrooms
- No allergies
- Calorie, budget, and health conscious eating
Approval Workflow
- System generates 7-day meal plan based on sales, dietary constraints, budget, variety
- Email sent to both adults with meal previews
- One denial = meal swapped; no denials = auto-approved
- Shopping list generated after approval
Tech Stack
| Component | Technology |
|---|---|
| Backend | Python 3.11, FastAPI |
| Database | PostgreSQL 15 |
| Frontend | React 18, TypeScript, Tailwind |
| Scraping | Playwright, BeautifulSoup |
| SendGrid | |
| Hosting | Docker Compose, nginx |
Languages
Python
72.5%
TypeScript
25.9%
JavaScript
0.5%
PLpgSQL
0.4%
CSS
0.3%
Other
0.2%