Manifeste
Pourquoi Cyora existe, et pourquoi son architecture cryptographique rend la trahison de ses utilisatrices techniquement impossible.
1. Le problème
Quand tu utilises Flo, Clue, Stardust ou n'importe quelle autre app de cycle commerciale, tes données — règles, douleurs, humeur, médicaments, partenaires sexuels parfois — sont stockées en clair sur les serveurs de l'éditeur. Tu fais confiance à leur politique de confidentialité.
Cette confiance a déjà été trahie publiquement :
- En janvier 2021, la FTC américaine a sanctionné Flo Health pour avoir partagé des données de cycle, de grossesse et de fertilité avec Facebook, Google et AppsFlyer — alors que la politique de confidentialité de Flo affirmait l'inverse.
- Plusieurs apps de cycle ont été pointées du doigt pour avoir continué à partager des données de cycle alors que des États américains ont criminalisé l'avortement post-Dobbs (juin 2022).
- Les rapports de transparence de la plupart des apps santé féminines ne mentionnent pas combien de demandes judiciaires elles reçoivent ni comment elles y répondent.
Le problème de fond est structurel : tant qu'un éditeur a accès à tes données en clair, il peut les partager. Volontairement (modèle publicitaire, partenariats), ou contre sa volonté (failles de sécurité, ordres judiciaires, rachats par un acteur moins scrupuleux).
2. Notre invariant
Cyora est conçue pour qu'on ne puisse pas te trahir, même si on le voulait. Pas grâce à une promesse marketing, mais grâce à une architecture cryptographique :
Quand tu actives la sync entre tes appareils : ton journal est chiffré sur ton téléphone avec une clé dérivée de ta passphrase, avant tout envoi vers nos serveurs. Le serveur reçoit un blob opaque qu'il ne peut pas lire.
Si tu perds ta passphrase, personne ne récupère tes données — pas même nous. C'est le prix à payer pour la garantie cryptographique : on ne stocke pas de mécanisme de récupération côté serveur, sinon on aurait l'accès en clair.
3. Comment ça marche concrètement
Pipeline de chiffrement
- L'app sérialise ton journal en JSON.
- Elle dérive une clé à partir de ta passphrase via Argon2id (memory 64 MiB, 3 itérations) — algo officiel de hashing de mots de passe, résistant aux attaques par GPU.
- Elle chiffre avec AES-256-GCM (chiffrement authentifié, détecte toute corruption ou altération du blob).
- Sel et nonce sont générés aléatoirement (
Random.secure()) et stockés en clair en préfixe du blob. - Le blob final est uploadé vers Supabase Storage sous le préfixe
journal-blobs/<ton_user_id>/snapshot.bin. - Une Row Level Security policy sur le bucket garantit que seul ton compte peut lire ce blob, même si quelqu'un connaissait ton user_id.
Format du blob
[version:1B][salt:16B][nonce:12B][ciphertext+mac:variable]
Quand tu télécharges depuis un autre appareil
Argon2id reproduit la même clé à partir de ta passphrase et du sel. AES-GCM déchiffre. Le MAC vérifie l'intégrité. Si la passphrase est mauvaise ou le blob corrompu, le déchiffrement échoue avec erreur — aucune donnée déchiffrée n'est exposée.
4. Pourquoi ça marche aussi sur le mobile (sans sync)
Si tu n'actives pas la sync, tes données ne quittent jamais ton appareil. Aucun serveur n'est impliqué. La base de données est SQLite locale, protégée par les mécanismes natifs du système (chiffrement disque par défaut sur Android 6+ avec mot de passe d'écran de verrouillage).
Désinstaller l'app efface tout. C'est volontaire.
5. Comment vérifier que ces affirmations sont vraies
Le code source de Cyora est public sous licence AGPL-3.0 sur github.com/jpbenoit/cyora. N'importe qui — toi, un journaliste, un développeur, ton ou ta partenaire — peut :
- Lire le code de chiffrement dans
lib/data/sync/encryption_codec.dartetlib/data/sync/supabase_sync_service.dart. - Auditer les permissions Android demandées dans
android/app/src/main/AndroidManifest.xml. - Vérifier l'absence de SDK tiers (AdMob, Firebase Analytics, Mixpanel, Sentry, Crashlytics) dans
pubspec.yaml. - Construire l'app soi-même à partir des sources et comparer avec le binaire publié sur le Play Store (build reproductible).
La licence AGPL-3.0 garantit que toute version dérivée déployée comme service en ligne devra publier ses modifications. Tu ne peux pas hériter du code de Cyora pour faire un Cyora-with-ads sans rendre ce fork public.
6. Pourquoi on est payant
Cyora se vend ouvertement : 4,99 €/mois, 39 €/an (35 % d'économie), ou 99 € lifetime. Trial 14 jours sans CB requise.
C'est ce qui nous permet de refuser la pub et la revente. Cohérent avec le modèle de Proton, Bitwarden, Standard Notes — tous privacy-first et payants.
Le paiement se fait via Stripe en externe, pas via les achats intégrés Apple/Google. Pour deux raisons : préserver ton anonymat (pas de lien entre ton achat et ton compte Apple/Google), et éviter la commission de 30 % qu'Apple et Google prélèvent sur les abos in-app.
La version gratuite est complète sur le suivi local. Premium ajoute la sync entre appareils, le rapport PDF gynéco, l'historique illimité, les palettes alternatives. Il n'y a pas de freemium-trompeur où on dégrade la version gratuite pour te forcer à payer.
7. Ce qu'on ne fait pas
- Pas de prédiction de fertilité. C'est de la médecine. Cyora note ce que tu observes, ne prescrit pas.
- Pas de partage social, pas de communauté in-app, pas de gamification. Ton journal corporel n'est pas un produit social.
- Pas de notifications intrusives. Un seul rappel quotidien optionnel, à heure fixe choisie par toi.
- Pas d'imports invasifs. Si tu viens de Clue ou Flo, on importe via leur export CSV neutre — pas via une intégration API qui leur signalerait ton départ.
8. Limites assumées
Pour qu'il n'y ait pas de surprise :
- Perte de la passphrase = perte définitive des données synchronisées. C'est cryptographique, on ne peut rien y faire.
- Compromis de l'appareil : si quelqu'un a accès physique à ton téléphone déverrouillé, il peut lire la base SQLite locale. Aucune app ne peut empêcher ça sans hardware-backed encryption qui n'est pas disponible sur tous les Android.
- Brute-force d'une passphrase faible : Argon2id rend l'attaque coûteuse, mais une passphrase « 1234 » reste vulnérable. Choisis ≥ 12 caractères, idéalement une phrase mémorable.