Architecture
Vue d'ensemble du code Keeplas : un monorepo Turborepo avec une application Next.js, un backend Convex, et un package crypto isolé et restreint.
Disposition du monorepo
Keeplas est un monorepo pnpm + Turborepo. La surface déployée est une unique application Next.js ; tout ce qui est sensible est isolé dans son propre package.
apps/web— application Next.js 16 App Router. La seule surface déployée.packages/convex— schéma Convex, queries, mutations, actions, et crons.packages/crypto— primitives zero-knowledge. RESTRICTED, sous CODEOWNER.packages/ui— design system shadcn / Radix partagé.
Cette séparation est délibérée. Les primitives crypto sont isolées pour pouvoir être auditées indépendamment, gardées par CODEOWNERS, et revues avec plus de rigueur que le code fonctionnel.
La frontière cryptographique
Tout dans packages/crypto s'exécute uniquement dans le navigateur. Convex ne voit jamais votre phrase de récupération de 24 mots, votre clé maître, ni les fragments Shamir bruts. Le serveur stocke uniquement :
- Du texte chiffré AES-256-GCM (éléments du Vault, pièces jointes, enregistrements)
- Des clés enveloppées par ML-KEM-768 (clés par élément, clés par fragment)
- Des fragments enveloppés par ML-KEM-768 (Récupération sociale)
Le modèle de menace : même un backend totalement compromis ne peut pas lire le contenu utilisateur. Le fournisseur fait partie du modèle de menace, pas en dehors.
L'enveloppe d'audit
Chaque mutation qui touche votre Vault porte une enveloppe d'audit signée. Le middleware Next.js applique HMAC au contexte de la requête (IP, pays) avec un secret partagé (KEEPLAS_CTX_SECRET) ; Convex re-vérifie et ajoute une entrée chaînée par hash, infalsifiable, au journal d'audit.
Cela signifie que :
- Les mutations qui contournent le middleware sont rejetées par Convex
- Modifier une entrée passée brise la chaîne de hashes
- Vous pouvez prouver, après coup, la séquence exacte de mutations sur votre Vault
Authentification
L'authentification est sans mot de passe, basée sur Convex Auth.
- Codes à usage unique par e-mail et WhatsApp pour la connexion
- Passkeys (WebAuthn) optionnelles pour des identifiants matériels
- TOTP optionnel pour un deuxième facteur
- Déverrouillage par appareil via PIN, biométrie, ou clé matérielle
Aucun mot de passe à fuiter ou réinitialiser. La dérivation de la clé maître depuis la phrase de 24 mots se fait entièrement dans le navigateur.
La stack en un coup d'œil
| Couche | Technologie |
|---|---|
| App web | Next.js 16 (App Router), React 19, Tailwind v4 |
| Backend | Convex (queries, mutations, actions, crons) |
| Auth | Convex Auth (OTP e-mail/WhatsApp, passkeys, TOTP) |
| Crypto | AES-256-GCM, Argon2id, ML-KEM-768 (FIPS 203), Shamir Secret Sharing |
| Stockage | Convex (texte chiffré uniquement) |
| Build | Turborepo, pnpm workspaces, TypeScript |
| Licence | AGPL-3.0 |
Pour aller plus loin
- Contribuer — workflow, CLA, zones restreintes
- Auto-hébergement — exécutez toute la stack vous-même