Documentation produit
⚠️ Cette documentation décrit la V1, archivée sur /app/archivesv1/. Le site test V2.0 (pipeline 100 % IA) est en ligne sur /app/ — sa documentation vit sur les pages du pipeline. Refonte de cette page à venir.

Comment ça marche

Guide complet de l'application — fonctionnement utilisateur écran par écran, puis architecture technique à l'intention du futur CTO.

L'écran principal est le Journal. En haut de l'écran se trouve la zone de saisie : c'est là qu'on ajoute une entrée.

Une entrée, c'est un fragment de vécu de santé : ce qu'on a mangé, comment on a dormi, une douleur, une émotion, une mesure. On l'écrit librement, sans formulaire à remplir. La phrase peut être aussi courte que « mal dormi » ou aussi précise que « réveillée à 4h, temps humide dehors, dîner fromage hier soir ».

⌨️

Texte libre

Tape ou dicte ce que tu veux, dans ta langue naturelle. Pas de champ dédié, pas de menu à dérouler.

🎙️

Dictée vocale

Le bouton micro active la reconnaissance vocale du navigateur. Dans l'app native iOS, la dictée sera intégrée de façon plus fluide.

📷

Photo

Le bouton appareil photo permet d'ajouter une image (repas, ordonnance, courbe de tension). La photo est redimensionnée localement avant envoi.

Des raccourcis rapides apparaissent sous la zone de saisie (😴 Ma nuit, 🍽️ Mon repas, 🩹 Une douleur, 🙂 Mon humeur) : ils pré-remplissent la zone avec un début de phrase pour guider la saisie.

Une fois l'entrée soumise, elle est automatiquement horodatée, taguée (voir ci-dessous) et sauvegardée.

Dès qu'une entrée est soumise, un moteur d'attribution de tags analyse le texte et lui associe une ou plusieurs catégories :

😴 Sommeil 🍽️ Alimentation 🙂 Humeur ⚡️ Énergie 🩹 Douleur 🌀 Stress 🌡️ Symptômes 🌫️ Brouillard mental 💊 Médicaments 🏃 Activité 📊 Mesures ⛅️ Climat

Les tags apparaissent sous chaque entrée du journal sous forme de chips colorées. Si aucun mot-clé n'est reconnu, l'entrée reçoit le tag Divers.

Quatre valeurs canoniques d'appétit sont extraites en catégorie Symptômes : Envie de manger, Faim, Pas faim, Satiété (la négation « pas faim » est comprise comme un état réel, pas ignorée). Le moteur local reconnaît les mots entiers (il ne confond plus « bu » avec « bureau »), repère les rôles du sommeil (coucher / réveil / durée), note l'énergie de 1 à 5, et affiche des valeurs contextuelles (« Coucher à 22h », « Glycémie 110 mg/dl »). Réglages → Moteur → Choix du moteur permet de choisir, pour cette transformation, entre le moteur local (sur l'appareil, par défaut), un moteur IA (à venir — tant qu'il n'est pas branché, le sélectionner conserve l'extraction locale) et un mode manuel (aucune extraction automatique). Le bouton « Tout réanalyser » relance le moteur sur toutes les entrées passées — le texte de vos entrées n'est jamais modifié.

Éditer / supprimer une entrée : chaque entrée du journal possède un bouton crayon ✏️. Il ouvre un panneau d'édition (bottom sheet) permettant de modifier le texte, ajouter ou retirer des tags, ou supprimer l'entrée. Une entrée éditée porte un marqueur « modifiée » : à la prochaine analyse, ses données obsolètes sont écartées au profit de la version à jour (une bannière le rappelle dans l'écran Corrélations automatiques).

Sous la zone de saisie se trouve la liste des entrées passées, affichées du plus récent au plus ancien. Par défaut, l'app affiche les dernières 24 heures. Le bouton Afficher plus remonte de 24 h supplémentaires à chaque clic.

Deux outils permettent de filtrer pour trouver les entrées recherchées :

Quand un ou plusieurs filtres sont actifs, l'icône filtre passe en surbrillance pour signaler que la vue est restreinte.

Un picto œil à côté du titre « Ton journal » permet de masquer le contenu : le texte et les photos des entrées sont floutés (les catégories et valeurs restent visibles) — pratique pour montrer ses données à quelqu'un sans dévoiler le détail écrit.

L'écran Données offre deux vues sur une fenêtre récente paramétrable.

📋

Récap (panneau compact)

Un panneau de synthèse teinté, distinct des listes. Il calcule à partir de ce qui existe (même une seule donnée sur la période est restituée — la fiabilité, elle, se lit dans la vue Complétude du suivi). Pour chaque dimension, dans l'ordre : Sommeil (moyenne d'heures par nuit, en h:mm — déclarée ou calculée depuis coucher/réveil) · Alimentation (prises par jour) · Activité (nombre de fois) · Social (nombre de fois) · Énergie (moyenne sur 5) · Douleur et Brouillard mental (fréquence sur 7 j : non = 0 jour · occasionnel = 1-2 · fréquent = 3-5 · quotidien = 6-7) · Climat (tendance dominante). Les moyennes calculées (Énergie, Alimentation/jour) sont affichées avec une décimale, arrondie au dixième supérieur. Deux vues commutables : Valeurs santé et Complétude du suivi.

🗂️

Par catégorie

La liste complète des données regroupées par catégorie, une catégorie par ligne. Chaque bloc est dépliable (replié par défaut) et liste les valeurs extraites avec leur horodatage, désormais avec un libellé contextuel (« Coucher à 22h », « 8h de sommeil », « Glycémie 110 mg/dl ») plutôt qu'un nombre nu.

Fenêtre paramétrable : par défaut le récap couvre les 7 derniers jours. Dans Réglages, l'utilisateur peut choisir 7 / 14 / 30 jours — le titre et les seuils de complétude/fréquence s'adaptent à la fenêtre choisie.

L'app repère seule des associations. Elle ne se met pas à jour automatiquement : l'utilisateur clique sur Mettre à jour pour lancer l'analyse.

Exemple de résultat : « Tes douleurs reviennent souvent les jours où tu notes : « fromage » », avec un indicateur de force (faible / modérée / forte), le nombre d'occurrences, et une ligne datée : « Corrélation observée le 25 juin, sur les données des 3 jours précédents. ». Depuis le 3 juillet 2026, Douleur, Symptômes et Brouillard mental sont suivis séparément : chaque corrélation relie un déclencheur à un type précis, plus jamais au mélange des trois

Une bannière invite à relancer l'analyse si des entrées ont été modifiées depuis la dernière exécution.

Analyses ciblées (raccourcis) — une section discrète propose des raccourcis d'analyses croisées entre deux catégories (ex. Énergie × Alimentation, Symptômes(satiété) × Sommeil). Chaque raccourci compare les séries agrégées des deux catégories puis chaque valeur contre chaque valeur, et informe s'il y a corrélation ou non (r, nombre de jours ; « données insuffisantes » en deçà de 3 jours communs). Les filtres comme Symptômes(satiété) n'agrègent que les informations de satiété — jamais tous les symptômes. La liste des raccourcis est maintenue à la main ; à terme, un moteur proposera de lui-même les analyses pertinentes (ajouts uniquement, jamais d'écrasement).

⚠️ L'app rappelle systématiquement que corrélation n'est pas causalité.

Ici, l'utilisateur génère à la demande ses propres analyses, en choisissant les facteurs à croiser. Le sous-titre rappelle : « Corrélation n'est pas causalité ». Un facteur est soit une catégorie (ex : Alimentation), soit une valeur (ex : Sucre) — les deux types sont distingués dans les suggestions.

Chaque résultat est toujours accompagné d'une note rédigée et d'une pastille :

Chaque carte sauvegardée porte la même ligne de date que les corrélations automatiques : « Corrélation observée le {date}, sur les données du … au … » — date du calcul + plage des jours réellement analysés.

Le nom en haut à droite est cliquable et mène à Mon compte, qui regroupe :

Note : le bloc compte / mot de passe / déconnexion a migré vers l'écran Mon compte.


Architecture technique — note pour le futur CTO

Cette section décrit les choix d'implémentation de la version démo web, les limites intentionnelles, et les évolutions envisagées. L'app web est un prototype fonctionnel : elle permet de valider les flux utilisateur avant développement de l'app native iOS.

📄 Lire le cahier des charges complet →

Moteur d'attribution de tags 100 % client

Le moteur tourne entièrement dans le navigateur, en JavaScript. Il n'effectue aucun appel réseau et ne consomme aucun token LLM.

Fonctionnement : à la soumission d'une entrée, la fonction structureEntry(text) parcourt le texte en minuscules et teste la présence de mots-clés issus d'une liste codée en dur pour chaque catégorie. Le premier mot-clé trouvé déclenche l'attribution du tag. Si une valeur numérique est détectable (ex : « 6h de sommeil », « 120/80 mmHg »), elle est extraite et associée au tag.

Évolution A — règles utilisateur : chaque re-qualification de tag par l'utilisateur pourrait alimenter un dictionnaire personnel userRules stocké dans son profil. La prochaine saisie contenant le même mot appliquerait automatiquement la règle. Cela ne nécessite aucun token, mais demande de concevoir un système de résolution de conflits entre règles génériques et règles utilisateur.
Évolution B — classification LLM : remplacer ou compléter la correspondance par mots-clés avec un appel à l'API Anthropic (Claude) pour classer chaque entrée. Avantages : compréhension du langage naturel, multilinguisme natif, gestion des négations et du contexte. Coûts : latence réseau (~300–800 ms), consommation de tokens à chaque entrée (estimé ~50–150 tokens d'input par entrée avec un prompt système compact). À envisager en mode hybride : règles locales en premier, LLM en fallback si le score de confiance est bas.

Stockage des données local + serveur

L'app adopte une architecture local-first : toutes les données sont écrites en premier dans le localStorage du navigateur, puis synchronisées de façon asynchrone avec le serveur.

*Le mot de passe en clair est acceptable en démo « données de test » uniquement — à proscrire en production.

Pour la production : remplacer les fichiers JSON par une base de données (PostgreSQL ou SQLite), ajouter des sessions signées (JWT ou session PHP durcie), chiffrement at-rest des données de santé. La structure JSON actuelle est directement mappable sur un schéma relationnel.

Moteur de corrélations 100 % client

L'analyse tourne intégralement dans le navigateur à la demande de l'utilisateur. Aucun token LLM n'est consommé.

Algorithme (auto) : sur les 14 derniers jours, l'app construit une carte jour par jour. Chaque jour est marqué d'un flag PAR TYPE — Douleur, Symptôme, Brouillard mental — suivis séparément (une corrélation relie un déclencheur à un seul type). Les tags Alimentation et Climat sont des triggers. Un trigger co-occure avec un flag si un symptôme apparaît dans la fenêtre glissante choisie (24 h, 3 jours ou 1 semaine après). À partir de 2 co-occurrences, l'association s'affiche.

À trancher : aujourd'hui l'analyse porte sur 14 jours. Une option « tout l'historique » est envisagée. Autres pistes : inclure d'autres catégories comme triggers (Stress, Activité), ou un modèle LLM pour formuler des hypothèses en langage naturel (coût tokens + envoi de données santé à un tiers — gouvernance à trancher).

Moteur de corrélations manuelles 100 % client

À la demande, pour des facteurs choisis par l'utilisateur. Pour chaque facteur, l'app construit une série quotidienne (moyenne des nombres extraits — heures, mesures… — sinon nombre d'occurrences par jour).

Limite actuelle (heuristique de démo) : l'extraction numérique prend le premier nombre d'un signal/texte. Deux facteurs chiffrés dans une même entrée peuvent être confondus. Évolution : extraction ciblée par facteur, ou champs structurés/typés à la saisie.

Fonctionnalités non implémentées dans la démo roadmap