# MetaBloom

MetaBloom est un compagnon métabolique mobile-first, francophone et non culpabilisant pour les personnes concernées par le surpoids, le prédiabète ou le diabète de type 2. Une seule base Expo cible iOS, Android et le Web.

> **Statut : produit en développement, usage éducatif et bien-être uniquement.** MetaBloom ne diagnostique pas, n’interprète pas une mesure, ne calcule pas de dose et ne modifie jamais un traitement. En cas d’urgence, contactez les services d’urgence.

## Fonctionnalités disponibles

- onboarding avec objectif, parcours et consentement informatif ;
- parcours Prévention, Perte de poids, Diabète type 2 et GLP-1 ;
- dashboard quotidien responsive avec données réellement dynamiques ;
- journal enrichi : poids, glycémie facultative, eau, pas, sommeil, repas et humeur ;
- validation des valeurs et gestion mg/dL/mmol/L ;
- graphiques et moyennes calculés sur les sept derniers jours ;
- coaching comportemental et micro-leçons sans recommandations thérapeutiques ;
- **Peg**, coach IA conversationnel relié au backend et compatible Ollama/OpenAI ;
- préférences, rappels préparés, export CSV et effacement local ;
- persistance hors ligne via AsyncStorage ;
- backend FastAPI/PostgreSQL auto-hébergeable avec JWT, consentement, CRUD, export et suppression de compte ;
- préparation UI pour scan de repas, Apple Santé et Health Connect.

## Captures

Les captures mobiles sont disponibles dans [`screenshots/`](./screenshots/).

## Stack

| Couche | Technologie |
|---|---|
| Application | Expo SDK 57, React Native 0.86, React 19, TypeScript |
| Design system | Icônes vectorielles Lucide, composants accessibles, zones tactiles 44 px minimum |
| Stockage local | AsyncStorage |
| API | FastAPI, SQLAlchemy, Pydantic |
| Données serveur | PostgreSQL en production, SQLite en développement |
| Sécurité API | JWT expirant, Argon2, isolation par utilisateur |

## Démarrer l’application

Prérequis : Node.js 20+ et npm.

```bash
npm install
npm run web
```

```bash
npm run android
npm run ios
npm run typecheck
npm run build:web
```

Les cibles Android/iOS fonctionnent avec Expo Go pour ce prototype. HealthKit/Health Connect nécessiteront un development build natif et des comptes développeur Apple/Google.

## Démarrer l’API

```bash
cd server
python -m venv .venv
. .venv/bin/activate
pip install -r requirements-dev.txt
uvicorn app.main:app --reload
```

Documentation OpenAPI : `http://localhost:8000/docs`. Voir [`server/README.md`](./server/README.md) pour PostgreSQL, Docker et les règles de sécurité.

Pour connecter l’application à l’API :

```bash
EXPO_PUBLIC_API_URL=http://localhost:8000 npm run web
```

Les builds distribués utilisent `https://api.metabloom.vicode.agency` par défaut. Cette URL doit pointer vers le proxy HTTPS public, lui-même relié au conteneur FastAPI permanent. Le Compose d'exemple active `restart: unless-stopped`; un exemple de virtual host OpenResty est fourni dans `server/openresty.metabloom.conf.example`.

Au premier message, l’application crée une session invitée pseudonyme et conserve son jeton sous `metabloom-auth-token`. Le moteur, le modèle et l’URL IA sont configurés uniquement côté serveur. Aucun secret ne doit être placé dans l’application.

## Architecture

```text
App.tsx                    Expérience Expo multiplateforme
assets/                    Icônes et splash screen
server/app/                API, modèles, validation et sécurité
server/tests/              Tests d’intégration API
server/docker-compose...   PostgreSQL + API auto-hébergeables
screenshots/               Captures produit
.gitea/workflows/          Contrôles CI
```

L’application fonctionne actuellement en mode local-first. L’API est prête séparément ; la prochaine étape d’intégration est une file de synchronisation idempotente avec gestion explicite des conflits.

## Sécurité et réglementation

- aucune donnée n’est envoyée par l’application tant que l’API n’est pas configurée ;
- les conversations Peg ne sont pas persistées par le backend et l’historique transmis est limité ;
- Peg filtre les urgences, diagnostics, dosages et modifications de traitement avant et après le modèle ;
- l’API impose un consentement avant l’enregistrement de données de santé ;
- les mots de passe sont hachés avec Argon2 et les données isolées par utilisateur ;
- les secrets d’exemple ne doivent jamais être utilisés en production ;
- AsyncStorage n’est pas chiffré : il doit être remplacé par SQLite + SecureStore avant production ;
- une AIPD/RGPD, une analyse HDS, un audit OWASP et une qualification MDR sont obligatoires avant usage réel ;
- aucun conseil GLP-1, seuil glycémique ou traitement n’est produit par l’application.

## État des fonctionnalités avancées

- **Backend/auth/export/suppression :** implémentés et isolés dans `server/`.
- **Synchronisation multi-appareil :** architecture définie, connexion client/API restante.
- **Notifications :** préférences fonctionnelles ; branchement natif restant.
- **Scan alimentaire :** expérience préparée ; source nutritionnelle et confirmation utilisateur restantes.
- **HealthKit/Health Connect :** préparation produit ; dépendances natives et autorisations stores restantes.
- **IA :** volontairement non branchée avant gouvernance clinique et corpus validé.

## Tests

```bash
npm run typecheck
npm run build:web
cd server && pytest -q
```

## Licence

MIT — voir [`LICENSE`](./LICENSE).
