Contexte
Aujourd'hui, chaque ouverture d'un module re-télécharge ET re-déchiffre toute la collection depuis le serveur, à chaque fois. La recherche/heatmap/stats étant 100 % côté client (serveur aveugle), tout doit être en mémoire — mais rien n'est conservé entre deux ouvertures.
Proposition
Un cache local chiffré (IndexedDB) + une synchronisation incrémentale (delta) : au lancement, lire le local et afficher tout de suite, puis ne demander au serveur que ce qui a changé depuis la dernière fois. La notion de version par module qui existe déjà (bumpJournalVersion, etc.) est le crochet naturel pour savoir quoi resynchroniser.
Décision de sécurité — importante
Stocker le chiffré au repos, JAMAIS le clair.
Propriété actuelle de Nodea : le clair ne vit qu'en mémoire vive et meurt au rechargement (purge = location.reload()). Mettre du clair sur disque élargirait le périmètre de confiance (appareil volé/analysé, profil navigateur sauvegardé, ordi partagé). cf. règles crypto de CLAUDE.md. On déchiffre à la lecture, en session — depuis une source locale rapide.
Obligations que ça crée (à faire dès le départ)
- Purge du cache au logout / changement de mot de passe / recovery / changement de compte — sinon on laisse des données déchiffrables sous une ancienne session.
- Invalidation multi-appareils via la
version (édition/suppression sur un autre appareil ou onglet).
- Quota IndexedDB : texte toujours en cache, images en LRU (on relâche les plus vieilles).
Gains
- Démarrage instantané à chaque ouverture, pas seulement la première.
- Socle indispensable du hors-ligne (issue dédiée).
- Rend les futurs croisements cross-module (Mood↔Journal↔HRT…) quasi gratuits (données déjà locales).
Critères d'acceptation
Contexte
Aujourd'hui, chaque ouverture d'un module re-télécharge ET re-déchiffre toute la collection depuis le serveur, à chaque fois. La recherche/heatmap/stats étant 100 % côté client (serveur aveugle), tout doit être en mémoire — mais rien n'est conservé entre deux ouvertures.
Proposition
Un cache local chiffré (IndexedDB) + une synchronisation incrémentale (delta) : au lancement, lire le local et afficher tout de suite, puis ne demander au serveur que ce qui a changé depuis la dernière fois. La notion de
versionpar module qui existe déjà (bumpJournalVersion, etc.) est le crochet naturel pour savoir quoi resynchroniser.Décision de sécurité — importante
Stocker le chiffré au repos, JAMAIS le clair.
Propriété actuelle de Nodea : le clair ne vit qu'en mémoire vive et meurt au rechargement (purge =
location.reload()). Mettre du clair sur disque élargirait le périmètre de confiance (appareil volé/analysé, profil navigateur sauvegardé, ordi partagé). cf. règles crypto deCLAUDE.md. On déchiffre à la lecture, en session — depuis une source locale rapide.Obligations que ça crée (à faire dès le départ)
version(édition/suppression sur un autre appareil ou onglet).Gains
Critères d'acceptation