Chargement...
Chargement...
MyRoadTripDeux personnes modifient leur road trip en même temps. L'un offline en pleine montagne. L'autre en 3G. Au retour du réseau : tout doit fusionner sans conflit. Sans perte. Sans choix arbitraire.
La fonctionnalité la plus dure des apps collaboratives, c'est la synchronisation hors-ligne. Quand deux personnes éditent les mêmes données chacune de leur côté, la plupart des apps choisissent arbitrairement laquelle 'gagne' — et l'autre perd son travail. MyRoadTrip résout ça avec des CRDT (Conflict-free Replicated Data Types) au niveau du champ : Alice change le nom de l'étape, Bob change la durée — les deux modifications sont gardées. Compression de 98 % sur les sync (on n'envoie que les changements). Polling adaptatif : 2 secondes en édition active, 60 secondes quand la batterie est basse. Le tout livré en web ET en app native iOS/Android via un seul code source (Capacitor). 201 fichiers de tests. Stripe pour le paiement, Auth0 pour la connexion, Mapbox pour la cartographie 50K points.
Sur la route, la 4G saute. Et pourtant les apps de planning continuent à 'perdre' les modifications offline. C'est inacceptable. Je voulais une app qui ne perd jamais rien — même sur 3 heures sans réseau, à deux, en montagne.
Synchronisation par CRDT (structure de données distribuée) comme source de vérité. Chaque modification est commutative — l'ordre n'importe pas, le résultat est toujours le même. Persistence en arrière-plan sans bloquer l'interface. Polling adapté au réseau et à la batterie.
conflits de données grâce au CRDT
de compression sur la synchronisation
fichiers de tests (unit + intégration + e2e)
même code, 2 plateformes
La migration vers le merge au niveau champ a éliminé 100% des conflits de données. L'adaptation à la batterie — un détail que personne ne fait — s'est révélée cruciale pour l'usage en road trip. Ces patterns de sync sont maintenant extraits en bibliothèques réutilisables.
Comment j'ai construit un planificateur de road trips collaboratif en offline-first avec Yjs, un monorepo Vue.js/TypeScript, Firebase, Mapbox, et Capacitor pour le mobile.
Deux décisions ont fait que MyRoadTrip tourne sur web, App Store et Play Store depuis le même repo Vue 3 — sans Flutter, sans React Native, sans Expo. Voici comment Capacitor + une discipline sur les APIs natives m'a évité 6 mois de double-codage.