Backend (Spring Boot 3.2 / Java 21 / PostgreSQL): - JWT auth with BCrypt password hashing - User profile + Mifflin-St Jeor BMR calculator - Food search + barcode via OpenFoodFacts API with local cache - Meal CRUD with user data isolation and ownership checks - AI photo analysis (OpenAI Vision) with confidence intervals - AI correction feedback loop for personalisation - Flyway DB migrations + RFC-7807 error responses Mobile (React Native / TypeScript): - Full navigation stack (Auth → Tabs → Home stack) - Design tokens (WCAG 2.2 AA colours, 8px grid, 48px touch targets) - 10 screens: Login, Register, Home, Search, Camera, AI Result, Edit Meal, Daily Details, History, Profile - Confidence-aware calorie display (kcal ± range) - Repeat last meal shortcut + macro tracking Docs: - docs/PLAN-AND-REQUIREMENTS.md - docs/traceability.csv (35 requirements, all Implemented)
6.1 KiB
Perfect — this is exactly the kind of product where a clean MVP design = 80% of success.
I’ll give you copy‑paste ready PRD, data model, APIs, and UI flows — structured so you could literally start building (or drop into Notion / repo).
🧾 1. MVP PRD (Feature Set)
🎯 Product Vision
“The easiest way to track calories with minimal effort and acceptable accuracy using AI + smart defaults.”
👤 Target User
- Busy professionals (like you 😄)
- Eat mixed: home + restaurant + packaged food
- Want low friction, not perfect precision
✅ MVP Scope (STRICT — avoid scope creep)
Core Features
1. Meal Logging (3 methods)
✅ A. Quick Add (manual)
- Search food
- Select portion (grams / default servings)
- Add to day
✅ B. Barcode scan
- Scan product → auto-fill nutrition
✅ C. Photo (AI assist, NOT full auto)
- Take picture
- App suggests:
- detected food(s)
- estimated portions
- User must confirm/edit
👉 Important: User confirmation required (trust + accuracy)
2. Daily Tracking
- Calories consumed (main KPI)
- Optional:
- protein / carbs / fat
- Remaining calories (based on goal)
3. User Profile
- Age, weight, height
- Goal:
- lose / maintain / gain
- Daily calorie target (calculated)
(BMR-based baseline — like MyFitnessPal approach)
4. History & Reuse
- Recent foods
- Repeat last meal (1 tap)
5. Correction Loop (THIS IS YOUR SECRET WEAPON)
- User edits AI result
- Store correction
- Improve next suggestions
❌ NOT in MVP (important discipline)
- No social features
- No meal plans
- No wearable integrations
- No deep health analytics
🧠 2. Data Model (clean + scalable)
Use something like Postgres (or Firestore if you go fast).
Core Entities
User
{
"id": "uuid",
"email": "string",
"createdAt": "timestamp",
"profile": {
"age": 30,
"weightKg": 80,
"heightCm": 180,
"goal": "lose|maintain|gain",
"dailyCaloriesTarget": 2200
}
}
FoodItem (normalized DB)
{
"id": "uuid",
"name": "Chicken breast",
"source": "openfoodfacts|custom|ai",
"caloriesPer100g": 165,
"macros": {
"protein": 31,
"fat": 3.6,
"carbs": 0
}
}
MealEntry
{
"id": "uuid",
"userId": "uuid",
"date": "2026-05-16",
"items": [
{
"foodItemId": "uuid",
"quantityGrams": 200,
"calories": 330
}
],
"source": "manual|barcode|photo",
"confidence": 0.82
}
PhotoAnalysis (AI trace — VERY IMPORTANT)
{
"id": "uuid",
"userId": "uuid",
"imageUrl": "string",
"detectedItems": [
{
"name": "rice",
"estimatedGrams": 150,
"confidence": 0.76
}
],
"userCorrections": [
{
"name": "rice",
"correctedGrams": 180
}
]
}
UserFoodMemory (optimization layer)
{
"userId": "uuid",
"foodName": "coffee with milk",
"avgPortionGrams": 250,
"lastUsed": "timestamp"
}
👉 This enables:
- auto-fill frequent meals
- personalization
🔌 3. API Design (clean + realistic)
Assume REST (simple for MVP)
Auth
POST /auth/register
POST /auth/login
User
GET /user/profile
PUT /user/profile
Food Search
GET /foods?query=chicken
Response:
[
{
"id": "uuid",
"name": "Chicken breast",
"caloriesPer100g": 165
}
]
Barcode
GET /foods/barcode/{code}
Meal Logging
POST /meals
{
"date": "2026-05-16",
"items": [
{
"foodItemId": "uuid",
"grams": 200
}
],
"source": "manual"
}
Daily Overview
GET /meals/daily?date=2026-05-16
Response:
{
"totalCalories": 1800,
"target": 2200,
"remaining": 400,
"meals": [...]
}
Photo Analysis (AI entry point)
POST /ai/analyze-meal
Request:
- image
Response:
{
"suggestions": [
{
"name": "pasta",
"grams": 250,
"confidence": 0.78
}
]
}
Feedback Loop
POST /ai/correction
{
"analysisId": "uuid",
"corrections": [...]
}
📱 4. UI Flows (VERY IMPORTANT — UX is everything)
I’ll give you clear flows you can directly translate into screens
🏠 Home Screen (Daily Dashboard)
------------------------------------
Calories: 1800 / 2200
Remaining: 400
[ + Add Meal ]
Today:
- Breakfast (450 kcal)
- Lunch (800 kcal)
- Dinner (550 kcal)
------------------------------------
➕ Add Meal (entry selector)
Choose how to log:
[ 📷 Take Photo ]
[ 🔍 Search Food ]
[ 📦 Scan Barcode ]
👉 Always start here — reduces friction.
📷 Photo Flow
Step 1 — Capture
[ Camera View ]
[ Snap ]
Step 2 — AI Suggestion (critical UX moment)
We detected:
- Rice (150g)
- Chicken (120g)
[ Edit ] [ Confirm ]
Step 3 — Edit
Rice: 150g → [ adjust slider ]
Chicken: 120g → [ adjust ]
[ + Add item ]
[ Save Meal ]
🔍 Manual Search Flow
Search: "chicken"
Results:
- Chicken breast
- Chicken thigh
→ Select
→ Choose grams
→ Add
📊 Daily Details Screen
Total: 1800 kcal
Macros:
Protein: 120g
Carbs: 180g
Fat: 60g
Meals:
- Breakfast
- Lunch
- Dinner
🔁 Repeat Meal (killer UX shortcut)
On Home:
[ Repeat yesterday's lunch ]
🎯 5. Architecture Decisions (important for you)
Given your background:
Backend
- FastAPI or Spring Boot (you’re Java → maybe Spring Boot)
Frontend
- React Native (fast MVP)
AI
- Start with API-based (no custom model)
- Later optimize
🚀 6. What makes YOUR app better (MVP differentiation)
Focus on:
✅ Minimal friction
✅ Smart defaults
✅ Learning user habits
NOT:
❌ Better AI model
❌ More features
✅ Next logical step
If you want, I can next:
👉 Turn this into actual repo structure + starter code (backend + mobile)
👉 Or design clickable UI wireframes (Figma-style)
Just tell me which direction 👍