HTML · CSS · JS
Une seule interface sans framework, de tous les écrans aux animations : rapide, légère, identique partout.
Une seule interface pour le web, iOS et Android, qui lit et écrit toujours sur l’appareil. Un serveur qui synchronise, sauvegarde et fait vivre le social, sans jamais pouvoir lire tes messages.
L’interface écrit dans la base locale de l’appareil, puis une couche connectée envoie les différences au serveur et récupère celles des autres appareils.
| Situation | Objectifs, validations, séries | Feed, amis, messages | Synchronisation |
|---|---|---|---|
| Compte + en ligne | ✓ | ✓ | Automatique : démarrage, retour au premier plan, chaque minute |
| Compte + hors ligne | ✓ base locale | Masqués temporairement | File d’attente, envoyée au retour de la connexion |
| Sans compte | ✓ base locale | Indisponibles | Tout est conservé si un compte est créé plus tard |
| Maintenance sociale | ✓ | Lecture seule | ✓ |
| Maintenance complète | ✓ base locale | Masqués | Suspendue (503), sans casser la série |
Une seule interface sans framework, de tous les écrans aux animations : rapide, légère, identique partout.
Coque native React Native 0.74 + WebView qui embarque l’interface hors ligne. Builds et publication via EAS.
TypeScript, Helmet, CORS, limitation de débit, multipart. Schémas partagés avec l’app dans packages/shared.
Drizzle pour le schéma et les migrations, postgres.js pour des requêtes paramétrées : aucune injection SQL possible.
Implémentation auditée de NaCl : X25519, XSalsa20-Poly1305. PBKDF2-SHA-256 pour le coffre de clés.
Mots de passe bcrypt 12 tours ; jeton d’accès 15 min et jeton de renouvellement 30 jours à usage unique.
Un VPS Hostinger dans l’Union européenne, Docker Compose, HTTPS automatique, sauvegardes quotidiennes.
Export et import de ton compte en .zip, clés de conversation comprises, directement sur l’appareil.
Tests du protocole et du chiffrement, scénario de bout en bout d’une quarantaine de vérifications contre un serveur vierge.
Une règle unique, partagée par le serveur et l’app (resolveLww), et des opérations qui peuvent être renvoyées sans danger.
Chaque action est écrite immédiatement dans la base locale, puis ajoutée à une file d’attente. Les identifiants sont des UUID générés par l’appareil : un objectif créé hors ligne garde son identifiant.
POST /v1/sync/push par lots de 100. Chaque opération a sa transaction ; un opId déjà reçu n’est jamais appliqué deux fois.
GET /v1/sync/pull?cursor=N renvoie tout ce qui a changé depuis la révision N, par pages de 500. Le curseur n’avance qu’après application.
stale).forbidden, invalid, not_found ; la version du serveur est alors récupérée.Messages privés et groupes sont chiffrés sur l’appareil avant l’envoi. Seuls les messages du compte PepsGoal Officiel circulent en clair.
L’appareil génère sa paire X25519 et publie sa clé publique.
32 octets aléatoires, tirés par le premier qui écrit.
La clé est chiffrée pour chaque appareil (crypto_box).
Texte scellé avec crypto_secretbox ; le serveur refuse tout message en clair.
Les appareils qui détiennent la clé la lui transmettent.
Illustration : un brouillage aléatoire calculé dans ton navigateur, pas le vrai chiffrement de l’app.
Chaque entrée passe un schéma zod ; les données inconnues sont refusées.
Un client modifié ne peut pas gonfler les classements.
Un jeton de renouvellement volé et réutilisé révoque toutes les sessions du compte.
8 Mo maximum, type contrôlé par la signature du fichier (JPEG, PNG, WebP), nom aléatoire.
300 requêtes par minute, renforcée sur connexion, inscription, publication et signalements.
Supprimer son compte efface toutes ses données ; les sauvegardes suivent sous 14 jours.
Pas de publicité, pas de mesure d’audience. Polices et bibliothèques intégrées : aucun service tiers contacté.
Signalements, sanctions graduées, contestations, journal des décisions et alertes par e-mail.
Les 14 types d’objectifs et leurs réglages sont définis une seule fois dans packages/shared et validés à l’identique par le serveur et l’app.