managarten/apps/nutriphi/Plan.md
Wuesteon d36b321d9d style: auto-format codebase with Prettier
Applied formatting to 1487+ files using pnpm format:write
  - TypeScript/JavaScript files
  - Svelte components
  - Astro pages
  - JSON configs
  - Markdown docs

  13 files still need manual review (Astro JSX comments)
2025-11-27 18:33:16 +01:00

11 KiB

MVP Projektplan: KI-Kalorien Tracker Nutriphi (Finaler Plan)

  1. Projekt-Übersicht Ziel: React Native App mit Expo für automatische Kalorienschätzung durch Foto-Analyse Architektur: Local-First mit optionaler Cloud-Synchronisation (Supabase-ready) UI-Framework: NativeWind (Tailwind CSS für React Native) Sync-Strategy: Bidirektionale Synchronisation mit Konfliktlösung
  2. Technologie-Stack Frontend
  • React Native: 0.73+
  • Expo SDK: 50+
  • TypeScript: Vollständige Typisierung
  • NativeWind: 2.0+ für Styling
  • React Navigation: 6.x für Navigation
  • Zustand: Lightweight State Management
  • Expo Camera: Foto-Aufnahme
  • React Native Reanimated: Smooth Animationen Datenschicht
  • Expo SQLite: Primäre lokale Datenbank
  • Expo FileSystem: Lokale Foto-Speicherung
  • AsyncStorage: App-Einstellungen
  • Supabase: Cloud-Backend (optional, später)
  • Supabase Storage: Cloud-Foto-Speicherung KI & APIs
  • Google Gemini Vision API: Primäre Bilderkennung
  • Optimierter Prompt: Strukturierte Nährwert-Analyse
  • Fallback-System: Graceful Degradation bei API-Fehlern Development Tools
  • Expo Dev Tools: Development Environment
  • TypeScript: Compile-time Type Safety
  • ESLint + Prettier: Code Quality
  • Jest: Unit Testing
  1. Erweiterte Datenbank-Architektur Haupttabelle: meals (Dual-kompatibel)

sql CREATE TABLE meals ( -- Primärschlüssel (dual-kompatibel) id INTEGER PRIMARY KEY AUTOINCREMENT, -- SQLite cloud_id TEXT UNIQUE, -- UUID für Supabase

-- Sync-Metadaten user_id TEXT, -- NULL lokal, UUID in Cloud sync_status TEXT DEFAULT 'local', -- local, synced, conflict, pending version INTEGER DEFAULT 1, -- Für Konfliktlösung last_sync_at TEXT, -- ISO DateTime

-- Foto & Metadaten photo_path TEXT NOT NULL, -- Lokaler Pfad photo_url TEXT, -- Cloud Storage URL photo_size INTEGER, -- Dateigröße in Bytes photo_dimensions TEXT, -- JSON: {"width": 1920, "height": 1080}

-- Zeitstempel timestamp TEXT DEFAULT (datetime('now')), created_at TEXT DEFAULT (datetime('now')), updated_at TEXT DEFAULT (datetime('now')),

-- Mahlzeit-Kontext meal_type TEXT, -- breakfast, lunch, dinner, snack location TEXT, -- Optional: GPS oder manuell

-- KI-Analyse Ergebnisse analysis_result TEXT, -- Vollständiges JSON der Gemini-Antwort analysis_confidence REAL, -- 0.0 - 1.0 analysis_status TEXT DEFAULT 'pending', -- pending, completed, failed, manual

-- Aggregierte Nährwerte total_calories INTEGER, total_protein REAL, total_carbs REAL, total_fat REAL, total_fiber REAL, total_sugar REAL,

-- Gesundheitsbewertung health_score REAL, -- 1.0 - 10.0 health_category TEXT, -- very_healthy, healthy, moderate, unhealthy

-- User-Interaktion user_notes TEXT, user_modified INTEGER DEFAULT 0, -- Boolean als Integer user_rating INTEGER, -- 1-5 Sterne für KI-Genauigkeit

-- API-Metadaten api_provider TEXT DEFAULT 'gemini', api_cost REAL, -- Kosten in Cent processing_time INTEGER -- Millisekunden ); Detailtabelle: food_items

sql CREATE TABLE food_items ( id INTEGER PRIMARY KEY AUTOINCREMENT, cloud_id TEXT UNIQUE, meal_id INTEGER NOT NULL,

-- Sync-Metadaten sync_status TEXT DEFAULT 'local', version INTEGER DEFAULT 1,

-- Lebensmittel-Details name TEXT NOT NULL, category TEXT, -- protein, vegetable, grain, fruit, dairy, fat, processed, beverage portion_size TEXT, -- "150g", "1 Stück", "1 Tasse"

-- Nährwerte pro Item calories INTEGER, protein REAL, carbs REAL, fat REAL, fiber REAL, sugar REAL,

-- KI-Metadaten confidence REAL, -- 0.0 - 1.0 bounding_box TEXT, -- JSON: Position im Bild

-- Eigenschaften is_organic INTEGER DEFAULT 0, is_processed INTEGER DEFAULT 0, allergens TEXT, -- JSON Array

created_at TEXT DEFAULT (datetime('now')),

FOREIGN KEY (meal_id) REFERENCES meals(id) ON DELETE CASCADE ); Sync-Metadaten

sql CREATE TABLE sync_metadata ( table_name TEXT NOT NULL, record_id INTEGER NOT NULL, cloud_id TEXT, last_sync_at TEXT, conflict_data TEXT, -- JSON für Konfliktlösung retry_count INTEGER DEFAULT 0,

PRIMARY KEY (table_name, record_id) ); Performance-Indizes

sql CREATE INDEX idx_meals_timestamp ON meals(timestamp DESC); CREATE INDEX idx_meals_sync_status ON meals(sync_status); CREATE INDEX idx_meals_meal_type ON meals(meal_type); CREATE INDEX idx_food_items_meal ON food_items(meal_id); CREATE INDEX idx_food_items_category ON food_items(category); CREATE INDEX idx_sync_metadata_status ON sync_metadata(table_name, last_sync_at); 4. Optimierter Gemini Prompt Haupt-Prompt-Template:

Du bist ein professioneller Ernährungsexperte. Analysiere dieses Essen-Foto präzise und detailliert.

AUFGABE:

  1. Erkenne alle sichtbaren Lebensmittel und schätze realistische Portionsgrößen
  2. Berechne Nährwerte basierend auf Standard-Portionen
  3. Bewerte die Gesundheit der gesamten Mahlzeit
  4. Berücksichtige versteckte Zutaten (Öle, Saucen, Gewürze)

ANTWORT-FORMAT (nur JSON, keine zusätzlichen Texte): { "meal_analysis": { "total_calories": , "total_protein": , "total_carbs": , "total_fat": , "total_fiber": , "total_sugar": , "health_score": <1.0-10.0>, "health_category": "healthy|moderate|unhealthy", "confidence": <0.0-1.0>, "meal_type_suggestion": "breakfast|lunch|dinner|snack" }, "food_items": [ { "name": "Gegrilltes Hähnchen", "category": "protein", "portion_size": "120g", "calories": 180, "protein": 27.0, "carbs": 0.0, "fat": 7.5, "fiber": 0.0, "sugar": 0.0, "confidence": 0.9, "is_organic": false, "is_processed": false, "allergens": [] } ], "analysis_notes": { "health_reasoning": "Ausgewogene Mahlzeit mit hochwertigem Protein und Gemüse", "improvement_suggestions": [ "Mehr Vollkornprodukte hinzufügen", "Portion der Kohlenhydrate erhöhen" ], "cooking_method": "grilled", "estimated_freshness": "fresh", "hidden_ingredients": ["Olivenöl (1 TL)", "Gewürze"], "portion_accuracy": "high" } }

BEWERTUNGSKRITERIEN health_score: 10: Optimal (viel Gemüse, mageres Protein, Vollkorn, minimal verarbeitet) 8-9: Sehr gesund (ausgewogen, natürliche Zutaten) 6-7: Gesund (gute Balance, moderate Verarbeitung) 4-5: Mittelmäßig (gemischt, einige verarbeitete Komponenten) 2-3: Ungesund (viel verarbeitet, hoher Zucker/Fett) 1: Sehr ungesund (Fast Food, stark verarbeitet)

KATEGORIEN:

  • protein: Fleisch, Fisch, Eier, Hülsenfrüchte, Nüsse
  • vegetable: Alle Gemüsesorten
  • grain: Reis, Nudeln, Brot, Getreide
  • fruit: Alle Früchte
  • dairy: Milchprodukte
  • fat: Öle, Butter, Avocado
  • processed: Verarbeitete Lebensmittel
  • beverage: Getränke

WICHTIG:

  • Realistische Portionsgrößen (Deutsche Standards)
  • Kalorien auf 5er-Schritte runden
  • Bei Unsicherheit: confidence reduzieren
  • Versteckte Fette/Öle nicht vergessen
  • Mehrere gleiche Items separat listen Kontext-spezifische Erweiterungen:

typescript const promptContexts = { breakfast: "KONTEXT: Frühstück - berücksichtige typische deutsche Frühstücksportionen", restaurant: "KONTEXT: Restaurant - größere Portionen, mehr versteckte Fette wahrscheinlich", homemade: "KONTEXT: Hausgemacht - tendenziell gesünder, weniger versteckte Zusätze", fastfood: "KONTEXT: Fast Food - höhere Kaloriendichte, mehr verarbeitete Zutaten" }; 5. App-Architektur Ordnerstruktur:

src/ ├── components/ │ ├── ui/ # Basis UI-Komponenten │ │ ├── Button.tsx │ │ ├── Card.tsx │ │ └── LoadingSpinner.tsx │ ├── meals/ # Mahlzeit-spezifische Komponenten │ │ ├── MealList.tsx │ │ ├── MealItem.tsx │ │ ├── MealDetail.tsx │ │ └── NutritionBar.tsx │ ├── camera/ # Kamera-Komponenten │ │ ├── CameraModal.tsx │ │ ├── PhotoPreview.tsx │ │ └── PhotoButton.tsx │ └── sync/ # Sync-UI-Komponenten │ ├── SyncStatus.tsx │ └── ConflictResolver.tsx ├── services/ │ ├── database/ │ │ ├── SQLiteService.ts # Lokale Datenbank │ │ ├── SyncService.ts # Synchronisation │ │ └── MigrationService.ts # Schema-Updates │ ├── api/ │ │ ├── GeminiService.ts # KI-Integration │ │ └── SupabaseService.ts # Cloud-Backend │ ├── storage/ │ │ ├── PhotoService.ts # Foto-Management │ │ └── CacheService.ts # Lokaler Cache │ └── utils/ │ ├── DateUtils.ts │ ├── NutritionUtils.ts │ └── ValidationUtils.ts ├── stores/ │ ├── MealStore.ts # Zustand für Mahlzeiten │ ├── SyncStore.ts # Synchronisation-Status │ └── AppStore.ts # Globaler App-Zustand ├── types/ │ ├── Database.ts # Datenbank-Typen │ ├── API.ts # API-Response-Typen │ └── UI.ts # UI-Komponenten-Typen ├── hooks/ │ ├── useMeals.ts # Mahlzeit-Management │ ├── useCamera.ts # Kamera-Funktionen │ └── useSync.ts # Synchronisation └── utils/ ├── constants.ts ├── config.ts └── helpers.ts 6. Implementierungsphasen Phase 1: Foundations & Database Fokus: Solide Basis schaffen

  • Expo-Projekt mit TypeScript und NativeWind setup
  • Erweiterte SQLite-Datenbank implementieren
  • Basis-Services für Database-Operations
  • Migration-System für Schema-Updates
  • Grundlegende App-Navigation Phase 2: Core UI & Camera Fokus: Basis-Funktionalität implementieren
  • MealList mit erweiterten NativeWind-Komponenten
  • Floating Action Button mit Animationen
  • Camera-Modal mit Vorschau-Funktionalität
  • Foto-Speicherung im lokalen FileSystem
  • Basic Loading-States und Error-Handling Phase 3: AI Integration & Analysis Fokus: Gemini API vollständig integrieren
  • Optimierten Prompt-Service implementieren
  • Robuste API-Error-Handling-Strategien
  • Retry-Mechanismus mit exponential backoff
  • Offline-Queue für fehlgeschlagene Requests
  • Erweiterte Nährwert-Darstellung in UI Phase 4: Enhanced UX & Data Visualization Fokus: User Experience verbessern
  • Detailansicht für einzelne Mahlzeiten
  • Nährwert-Visualisierung (Balken, Kreise)
  • Tagesstatistiken und einfache Trends
  • User-Korrektur-Interface für KI-Ergebnisse
  • Mahlzeit-Typ-Erkennung und -Kategorisierung Phase 5: Sync Preparation & Cloud-Ready Fokus: Für Cloud-Sync vorbereiten
  • Sync-Metadaten in lokaler Datenbank
  • Data-Transformation-Layer implementieren
  • Conflict-Resolution-Algorithmus
  • Settings-Screen für Sync-Präferenzen
  • Export/Import-Funktionalität als Backup Phase 6: Supabase Integration (Optional) Fokus: Cloud-Synchronisation aktivieren
  • Supabase-Client-Setup und Authentication
  • Bidirektionale Sync-Implementation
  • Photo-Upload zu Supabase Storage
  • Real-time Conflict-Resolution
  • Multi-Device-Support
  1. MVP Success Criteria Funktionale Anforderungen: Core Functionality
  • Foto aufnehmen und lokal speichern
  • Gemini API erfolgreich aufrufen
  • Strukturierte Nährwert-Analyse erhalten
  • Daten persistent in SQLite speichern User Experience
  • Intuitive Ein-Screen-App mit Liste
  • Smooth Kamera-Integration
  • Verständliche Nährwert-Darstellung
  • Responsive UI mit NativeWind Data Quality
  • Realistische Kalorienschätzungen (±20% Genauigkeit)
  • Vollständige Nährwert-Breakdown
  • Plausible Gesundheitsbewertungen
  • Robuste Error-Handling Performance-Anforderungen:
  • App-Start unter 3 Sekunden
  • Foto-zu-Analyse unter 15 Sekunden
  • Smooth 60fps Scrolling in Meal-Liste
  • Maximaler Memory-Footprint: 100MB Stabilität:
  • Keine Crashes bei normaler Nutzung
  • Graceful Degradation bei API-Fehlern
  • Offline-Foto-Speicherung funktioniert zuverlässig
  • Daten-Integrität bei App-Kills gewährleistet