Files
calorie-counter/idea/mvpDataStructAndWorkflows.md
Andris Enins 91cd18aec6 feat: initial implementation — all 35 requirements across phases 1-3
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)
2026-05-18 21:56:13 +03:00

6.1 KiB
Raw Blame History

Perfect — this is exactly the kind of product where a clean MVP design = 80% of success.

Ill give you copypaste 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

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)

Ill 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 (youre 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 👍