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 ».
Tape ou dicte ce que tu veux, dans ta langue naturelle. Pas de champ dédié, pas de menu à dérouler.
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.
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 :
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.
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.
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.
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 →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.
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.
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.
localStorage — persistance entre les sessions, fonctionne hors-lignedata/store_<id>.json. Les mots de passe sont hashés avec bcrypt (password_hash PHP)/app/api.php, actions signup / login / load / save · export/import JSON complet côté client*Le mot de passe en clair est acceptable en démo « données de test » uniquement — à proscrire en production.
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.
À 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).
(λ₁−1)/(k−1)