En ligne halvyn.app
Halvyn
L’app couple qui transforme les conversations en jeu.
Compatibilité 87 % illustration
En clair
L’app couple interactive qui transforme les conversations en jeu.
~159K lignes de code, 102 tables DB, 380 endpoints, 17 services Docker en prod.
Points forts


-
Quiz A/B temps réel
Questions interactives entre partenaires
-
Économie gamifiée
Love Coins, streaks & missions
-
8 mini-jeux couple
Des jeux pour renforcer la complicité
-
Chat temps réel
Messages texte & notes vocales
-
Journal duo & calendrier
Souvenirs partagés et événements
-
Insights IA
Analyse de compatibilité par l’IA
-
Premium Stripe
Abonnement et paiements sécurisés
-
Multi-plateforme
Web + iOS + Android, 9 langues
En chiffres
- ~159K Lignes TS
- 102 Tables DB
- 380 Endpoints
- 17 Services prod
- 9 Langues
Le récit
Pourquoi j’ai construit ça
Avec ma chérie, il y avait toute une couche de petites choses du quotidien (préférences, souvenirs, réflexes) qu’on apprend l’un de l’autre au fil des mois, parfois des années. Je n’avais pas envie d’attendre. Halvyn est née de cette impatience : transformer la découverte mutuelle en jeu pour créer plus de complicité, plus vite. Un espace où chaque quiz, chaque mini-jeu et chaque conversation ajoute une brique à la connaissance qu’on a l’un de l’autre.
Décisions techniques structurantes
Dual-backend progressif
Un Express legacy qui proxie /v1 vers un backend V1 en clean architecture (modules / repositories / services / presenters). Le monolithe glisse vers une API moderne route par route, sans big-bang ni downtime.
Monorepo React 18 + Capacitor
Un seul codebase client qui tourne natif sur iOS, Android et Web avec plus de 95 % de code partagé : un design system unifié, trois plateformes livrées.
Realtime couples + sync offline
WebSocket avec rooms user / couple / session côté serveur, et mutation queue IndexedDB v3 (LWW) côté client. Les deux partenaires jouent simultanément et les mutations offline (moods, bucket-list) rejouent déterministement à la reconnexion.
Edge Cloudflare multi-Workers
Six Workers devant l’origine (rate-limiter, showcase-cache, media-cdn, cron dispatch, og-renderer, seo-localizer) qui absorbent les bursts et le trafic public avant qu’il n’atteigne l’API.
Le challenge non-trivial
Synchroniser une session de quiz temps réel à deux
Chaque partenaire répond indépendamment à une question A/B, la révélation ne se fait que quand les deux ont répondu, on calcule le match, on distribue les Love Coins. Et tout ça doit survivre à une déconnexion mobile en plein round, une double-réponse, un partenaire qui quitte l’app, ou un Worker qui tombe.
Idempotent, avec reprise d’état propre, et les événements missions / badges / streaks qui se déclenchent au bon moment sans double-comptage. Une state machine WebSocket distribuée avec persistance Postgres et reconcile offline, pas juste du pub/sub.
Leçon retenue
Si je refaisais, je démarrerais directement sur la clean architecture V1 dès le premier commit au lieu de traîner un Express legacy en parallèle pendant des mois : le proxy /v1 a coûté plus cher en complexité deploy et en mental-load qu’une réécriture franche l’aurait coûté.
Fiche technique
Où ça tourne Docker Compose · PostgreSQL 16 · Redis Pub/Sub · Cloudflare R2 · OpenAI · Stripe
| Frontend | React 18 · Vite · TailwindCSS · Radix UI · Framer Motion |
|---|---|
| Backend | Express · TypeScript · Drizzle ORM · PostgreSQL 16 |
| Real-time | WebSocket · Redis Pub/Sub · BullMQ |
| Mobile | Capacitor 8 · iOS · Android |
| Infra | Docker Compose · GitHub Actions · Cloudflare R2 · Prometheus |
| Services | OpenAI · Stripe · Firebase · PostHog · Sentry |