Skip to content

Cache local chiffré + sync delta des collections #152

Description

@aliceout

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

  • Lecture depuis le cache local au lancement, sync delta en fond
  • Stockage chiffré au repos uniquement (test : rien en clair dans IndexedDB)
  • Purge complète vérifiée au logout / changement de mot de passe (test)
  • Invalidation correcte sur édition/suppression (multi-onglet / multi-appareil)
  • Images en LRU sous contrainte de quota
  • Tests Vitest sur la logique de sync/purge

Metadata

Metadata

Assignees

No one assigned

    Labels

    cryptoE2EE, key derivation, HKDF, integrity, KEK rotationenhancementNew feature or requestperformanceprivacyv3Reporté à la v3 (post-v2)

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions