Application Web
DashFlow
DashFlow est une application web self-hosted qui réunit la gestion du budget familial et le suivi médical de tous les membres du foyer dans une interface sombre et soignée. Toutes les données sensibles sont chiffrées côté client (chiffrement de bout en bout) avant de quitter le navigateur, si bien que le serveur ne stocke que des charges utiles opaques et ne voit jamais le contenu en clair. Le frontend Angular communique avec une API NestJS via des cookies httpOnly, sur une base PostgreSQL pilotée par Drizzle ORM. Côté budget : comptes, enveloppes, prêts, récurrences et projections ; côté santé : patients, praticiens, ordonnances, médicaments et documents.
- stack
- Angular
- TypeScript
- TailwindCSS
- Docker
- PostgreSQL
- NestJS
- API
- JWT

Choix techniques
Pourquoi chaque brique, et ce qu'elle apporte au projet.
Angular
Front zoneless, réactivité 100 % Signals, composants standalone OnPush. L'app jongle avec beaucoup d'état dérivé (soldes, projections 12 mois, agrégats par membre) que les Signals rendent déclaratif et traçable, sans le coût et l'imprévisibilité du change detection global de Zone.js. Contrôle fin des effets de bord, ce qui compte quand un effet déclenche du déchiffrement asynchrone.
NestJS
Structure modulaire stricte et DI par token, sur une vingtaine de modules métier (comptes, enveloppes, prêts, patients, ordonnances…). Le CRUD répétitif est factorisé dans une base générique `OwnedCrudController` qui impose le scoping par utilisateur sur chaque requête.
Drizzle ORM
Typage SQL-first sans couche magique : types inférés depuis le schéma (`$inferSelect`/`$inferInsert`), migrations générées par `drizzle-kit`. Précieux pour un modèle E2EE où la plupart des tables n'exposent qu'une colonne `encryptedData` opaque plus quelques champs en clair.
E2EE via WebCrypto (AES-256-GCM + AES-KW + PBKDF2 600k)
Chiffrement entièrement via l'API WebCrypto native, sans lib tierce. Une clé maître AES-256-GCM chiffre chaque entité (IV unique 12 octets, base64). Cette clé maître est elle-même enveloppée (AES-KW) par une clé dérivée du mot de passe en PBKDF2-SHA256 à 600 000 itérations. Le serveur ne stocke que le sel, la clé maître wrappée et une enveloppe de récupération.
PostgreSQL
Robustesse transactionnelle ; le modèle reste fortement relationnel malgré l'E2EE (membres, comptes, transactions, patients, ordonnances liés par clés étrangères réelles), seul le contenu métier de chaque ligne est chiffré dans des colonnes `text` opaques.
Décisions d'architecture
Les arbitrages structurants, avec leur justification.
- Chiffrement de bout en bout côté client
- Centraliser des données financières et médicales sans jamais les confier en clair au serveur. Arbitrage serveur vs client : tranché pour le client, la clé maître dérivée du mot de passe ne quitte pas le navigateur. Conséquence assumée : recherche/agrégation côté client après déchiffrement, et enveloppe de récupération indispensable (mot de passe perdu sans elle = données irrécupérables).
- Clean Architecture
- Chaque feature découpée en `domain` (TS pur, zéro import Angular), `infra` (HTTP, adaptateurs) et `application` (composants). Permet d'insérer le déchiffrement comme un adaptateur sans contaminer le domaine. Pragmatisme : pas d'abstraction inutile, les use-cases triviaux passthrough sont supprimés.