199 lines
4.8 KiB
Markdown
199 lines
4.8 KiB
Markdown
# Recipe Manager — MVP Execution Plan
|
|
|
|
**Date:** 2026-03-25
|
|
**Owner:** Paul + Cleo
|
|
**Goal:** Ship a tight, usable MVP with clear scope and a fast implementation path.
|
|
|
|
---
|
|
|
|
## 1) MVP Scope (Step 1 — locked)
|
|
|
|
### In Scope (MVP)
|
|
1. **Recipe CRUD**
|
|
- Create recipe
|
|
- Read/list recipes
|
|
- View single recipe detail
|
|
- Edit recipe
|
|
- Delete recipe
|
|
2. **Tags**
|
|
- Create/delete tags
|
|
- Attach/remove tags on recipes
|
|
- Filter list by tag
|
|
3. **Ingredients + Steps**
|
|
- Ingredient list per recipe (qty/unit/item)
|
|
- Ordered instruction steps
|
|
4. **Search**
|
|
- Search by title
|
|
- Search by ingredient text
|
|
- Search by tag
|
|
5. **Backup portability**
|
|
- JSON export
|
|
- JSON import (merge strategy: skip duplicates by title+sourceUrl)
|
|
|
|
### Out of Scope (Post-MVP)
|
|
- AI substitutions
|
|
- Meal planner UX (calendar)
|
|
- Shopping list automation
|
|
- Nutrition calculations
|
|
- OCR/image import
|
|
- Multi-user auth/roles
|
|
|
|
### Definition of Done (MVP)
|
|
- User can create/edit/delete recipes with ingredients + steps
|
|
- User can tag and filter recipes
|
|
- User can search quickly by title/tag/ingredient
|
|
- User can export and import data JSON without data loss for core fields
|
|
- API + UI docs updated
|
|
- Docker compose run path works end-to-end
|
|
|
|
---
|
|
|
|
## 2) Architecture (existing stack + MVP alignment)
|
|
|
|
- **Backend:** Node/TypeScript REST API (SQLite)
|
|
- **Frontend:** React/TypeScript (Vite)
|
|
- **Storage:** SQLite file (`data/recipes.db`)
|
|
- **Deployment:** Docker + docker-compose
|
|
|
|
MVP will reuse existing architecture and avoid stack churn.
|
|
|
|
---
|
|
|
|
## 3) Data Model (Step 2 target)
|
|
|
|
### Tables
|
|
- `recipes`
|
|
- `id` (PK)
|
|
- `title` (TEXT, required)
|
|
- `description` (TEXT)
|
|
- `servings` (INTEGER)
|
|
- `prep_time_minutes` (INTEGER)
|
|
- `cook_time_minutes` (INTEGER)
|
|
- `source_url` (TEXT)
|
|
- `created_at`, `updated_at`
|
|
|
|
- `ingredients`
|
|
- `id` (PK)
|
|
- `recipe_id` (FK -> recipes.id)
|
|
- `position` (INTEGER)
|
|
- `quantity` (TEXT)
|
|
- `unit` (TEXT)
|
|
- `item` (TEXT, required)
|
|
- `notes` (TEXT)
|
|
|
|
- `steps`
|
|
- `id` (PK)
|
|
- `recipe_id` (FK -> recipes.id)
|
|
- `position` (INTEGER)
|
|
- `instruction` (TEXT, required)
|
|
|
|
- `tags`
|
|
- `id` (PK)
|
|
- `name` (TEXT UNIQUE, required)
|
|
|
|
- `recipe_tags`
|
|
- `recipe_id` (FK -> recipes.id)
|
|
- `tag_id` (FK -> tags.id)
|
|
- composite PK (`recipe_id`, `tag_id`)
|
|
|
|
### Suggested indexes
|
|
- `idx_recipes_title` on `recipes(title)`
|
|
- `idx_ingredients_item` on `ingredients(item)`
|
|
- `idx_recipe_tags_tag_id` on `recipe_tags(tag_id)`
|
|
|
|
---
|
|
|
|
## 4) API Surface (MVP)
|
|
|
|
### Recipes
|
|
- `GET /api/recipes?query=&tag=`
|
|
- `GET /api/recipes/:id`
|
|
- `POST /api/recipes`
|
|
- `PUT /api/recipes/:id`
|
|
- `DELETE /api/recipes/:id`
|
|
|
|
### Tags
|
|
- `GET /api/tags`
|
|
- `POST /api/tags`
|
|
- `DELETE /api/tags/:id`
|
|
|
|
### Backup
|
|
- `GET /api/export/json`
|
|
- `POST /api/import/json`
|
|
|
|
---
|
|
|
|
## 5) Frontend Surface (MVP)
|
|
|
|
- `RecipeListPage`
|
|
- search box
|
|
- tag filter
|
|
- recipe cards/list
|
|
- `RecipeDetailPage`
|
|
- metadata + ingredients + steps
|
|
- `RecipeFormPage`
|
|
- create/edit form with dynamic ingredient + step rows
|
|
- `TagManager`
|
|
- add/remove tags
|
|
- `ImportExportPanel`
|
|
- export button
|
|
- import file upload + summary
|
|
|
|
---
|
|
|
|
## 6) File-by-File Build Board
|
|
|
|
### Backend
|
|
1. DB schema/migrations (recipes, ingredients, steps, tags, recipe_tags)
|
|
2. Recipe repository/services with nested ingredient/step handling
|
|
3. Search query enhancements (title/ingredient/tag)
|
|
4. Tag endpoints + recipe-tag mapping logic
|
|
5. JSON export endpoint
|
|
6. JSON import endpoint + dedupe policy
|
|
7. API tests for CRUD + search + import/export
|
|
|
|
### Frontend
|
|
1. Recipe form supports ordered ingredients/steps
|
|
2. List page unified search + tag filter
|
|
3. Detail page renders normalized sections
|
|
4. Tag management wiring
|
|
5. Import/export UI panel
|
|
6. UI tests for key flows
|
|
|
|
### Docs
|
|
1. `docs/api.md` update
|
|
2. `docs/user-guide.md` update
|
|
3. README MVP usage + backup section
|
|
|
|
---
|
|
|
|
## 7) 6-Day Execution Plan
|
|
|
|
- **Day 1:** Scope freeze + schema lock + migration prep
|
|
- **Day 2:** CRUD hardening (nested ingredients/steps correctness)
|
|
- **Day 3:** Search + tag filter backend/frontend alignment
|
|
- **Day 4:** Import/export JSON endpoints + UI integration
|
|
- **Day 5:** Test pass, seed data, bug fixes
|
|
- **Day 6:** Docs + Docker validation + release tag
|
|
|
|
---
|
|
|
|
## 8) Immediate Next Actions (Starting now)
|
|
|
|
1. ✅ **Step 1 complete:** MVP scope locked in this document.
|
|
2. Next: verify existing TODO/roadmap lines up with locked scope.
|
|
3. Then start Step 2 (data model lock) by checking current schema vs target model and creating the migration delta list.
|
|
|
|
---
|
|
|
|
## 9) Risks / Decisions to keep an eye on
|
|
|
|
- Duplicate logic for import merge rules (title collisions)
|
|
- Tag naming normalization (case-insensitive unique)
|
|
- Ingredient parsing consistency for search quality
|
|
- Backward compatibility with existing recipe records
|
|
|
|
---
|
|
|
|
If scope changes are requested, update this file first and treat it as the source of truth for implementation sequencing.
|