La course en ville,
avec une confiance vérifiable.
Trust & Ride est une plateforme de transport à la demande pensée pour Madagascar : le passager fixe son prix, les chauffeurs enchérissent en temps réel — à la voix —, une IA modère les avis et chaque chauffeur engage une garantie inscrite sur la blockchain Polygon.
Un VTC où le prix se négocie et où la confiance se prouve.
Dans les grandes villes malgaches, le prix d'une course se discute, le paiement se fait en espèces et la confiance repose sur le bouche-à-oreille. Trust & Ride numérise ces usages au lieu de les remplacer.
Le constat
- Tarifs opaques et négociés à la portière, sans trace.
- Aucun recours fiable en cas de détour, d'agression ou de non-paiement.
- Chauffeurs qui conduisent : impossible de taper sur un écran pour répondre à une course.
- Avis clients en français, en malgache ou mélangés : difficiles à exploiter à la main.
La réponse Trust & Ride
- Le passager publie un prix maximum, les chauffeurs enchérissent en direct.
- Paiement en jetons depuis un portefeuille interne rechargé par mobile money.
- Le chauffeur répond à la voix ; l'offre lui est lue par synthèse vocale.
- Chaque chauffeur bloque une garantie on-chain, pénalisable (slashing) après litige.
- Une IA analyse chaque avis et remonte les alertes de sécurité à l'administration.
Trois espaces, un même parcours de confiance.
Une application mobile unique pour passagers et chauffeurs, et un back-office web pour l'équipe d'exploitation.
Publication de course
Départ, arrivée, prix maximum, nombre de passagers et catégories de véhicules souhaitées ; distance théorique calculée.
Offres en temps réel
Les propositions des chauffeurs arrivent en direct ; le passager compare prix, véhicule et réputation, puis accepte.
Suivi de course
Position GPS du chauffeur mise à jour en continu jusqu'à la prise en charge, puis pendant le trajet.
Clôture par code PIN
Le trajet n'est soldé qu'avec le code du passager : le paiement est réglé de façon atomique avant clôture.
Portefeuille & recharge
Recharge en jetons par mobile money avec justificatif, historique des dépôts et des paiements.
Avis, lieux favoris, historique
Notation du chauffeur, demande de compensation, adresses enregistrées et interface bilingue fr / mg.
Réponse vocale aux courses
Le chauffeur dit « ok » ou « 18 000 » : la voix est transcrite puis convertie en action métier (accepter, négocier, refuser).
Offres lues à voix haute
Chaque nouvelle demande est dictée au chauffeur (départ, destination, prix) pour qu'il garde les yeux sur la route.
Enchères en direct
Réception des demandes proches, proposition d'un prix et d'un point de départ, notification instantanée en cas d'acceptation.
KYC & véhicules
Envoi du permis, de la carte grise et des photos ; chaque véhicule est validé ou refusé (avec motif) par un administrateur.
Mode confiance
Le chauffeur bloque des jetons en garantie ; le dépôt est enregistré sur le smart contract TrustRegistry.
Historique & réputation
Courses passées, avis reçus, score de réputation (base 100) et gains en jetons.
Tableau de bord
Indicateurs d'activité, volumes de jetons et carte de chaleur des courses.
Gestion des litiges
Preuves des deux parties, barème par catégorie d'anomalie, décision et déclenchement du slashing on-chain.
Alertes de modération IA
Avis signalés par l'IA (sentiment, catégorie, code d'anomalie) et réglage des paramètres de modération.
Validation des transactions
Validation manuelle des dépôts et retraits mobile money, gestion des méthodes de paiement.
Taux du jeton
Planification et historique du prix du jeton : PENDING → ACTIVE → SUPERSEDED.
Utilisateurs & KYC
Fiche utilisateur, blocage et réactivation de compte, vérification des permis et véhicules.
Smart contract TrustRegistry
Dépôt, retrait et pénalité de la garantie conducteur, historique des sanctions consultable, événements émis à chaque mouvement.
Verrous applicatifs
Seul le backend peut écrire (onlyBackend), politique active requise, erreurs typées pour chaque cas invalide.
Paiements ACID
Transfert de jetons entre portefeuilles et clôture du trajet dans une même transaction PostgreSQL.
Flux de garantie tracés
Chaque LOCK, RELEASE, REFUND ou SLASH est stocké avec son hash de transaction on-chain.
Des microservices, chacun à sa juste place.
Le métier transactionnel vit dans un core Java ; le temps réel et l'IA dans un service Node dédié ; une gateway unique authentifie tout le trafic.
Core-service
Java · 11,8 k lignesMétier, portefeuilles, trajets, litiges, KYC. 16 contrôleurs, 96 endpoints, 24 entités JPA, couche blockchain Web3j.
AI & Realtime
TS · 2,9 k lignesGateway d'enchères Socket.IO, pipeline vocal, analyse de sentiment planifiée, consommation RabbitMQ.
Gateway
JS · FastifyPoint d'entrée unique : vérifie la signature JWT, route vers le core ou le service temps réel, gère les origines web.
App mobile
TSX · 18,5 k lignes39 écrans regroupés en espaces passager et chauffeur, cartes natives, caméra, audio, stockage sécurisé.
Back-office web
TSX · 7,8 k lignes11 pages d'administration : tableau de bord, litiges, KYC, transactions, jetons, modération IA.
Smart contract
Solidity · PolygonRegistre des garanties : dépôt, retrait, slashing en pourcentage, historique des sanctions et événements.
De la demande au paiement, en six étapes.
Demande
Le passager publie trajet et prix maximum. Un seul trajet actif par client.
POST /tripsDiffusion
Les chauffeurs reçoivent la demande ; elle leur est lue à voix haute.
ws · requestEnchère
Réponse au doigt ou à la voix : accepter, négocier un montant, refuser.
ws · bidding_responseAcceptation
Le passager choisit une offre ; les jetons sont réservés, les autres offres rejetées.
PATCH /propositionsTrajet
Suivi GPS en direct jusqu'à la prise en charge puis l'arrivée.
ws · locationClôture
Code PIN validé → paiement réglé → trajet clos → avis analysé par l'IA.
PATCH /completeDes outils récents, choisis pour chaque contrainte.
Mobile
- React Native 0.85
- Expo Router SDK 56
- NativeWind v4
- TanStack Query v5
- expo-maps · audio · speech natif
Web
- React 19
- Vite 8
- Tailwind CSS 4
- Zustand · Zod état · schémas
- Recharts · Leaflet dataviz
Backend
- Spring Boot Java 21
- Fastify 5
- Express · Socket.IO 4.8
- PostgreSQL 16
- Redis · RabbitMQ 7 · 3
IA & Web3
- Whisper large-v3 Groq
- Gemini 2.5 Flash intention
- Gemini Flash sentiment
- Solidity 0.8.28
- Hardhat · Web3j Polygon
Une IA évaluée sur des jeux de référence, pas sur des impressions.
Deux usages en production, chacun mesuré par un script d'évaluation reproductible (npm run eval:voice, npm run eval:sentiment) sur des phrases réelles en français, en malgache et mélangées.
Compréhension de l'intention
Phrase dictée → action métier + montant. Évaluation du 10/10/2026.
40 phrases évaluées (macro-F1 = 100 %). 99 autres phrases du jeu ont été exclues suite à des erreurs d'API pendant le run : le résultat porte sur l'échantillon complet traité. Latence Gemini : médiane 3,6 s, p95 5,0 s.
Analyse de sentiment & anomalies
Chaque avis reçoit un sentiment, une catégorie, une alerte sécurité et un code d'anomalie.
Le jeu de référence couvre volontairement les cas difficiles :
| Anomalie détectée | Gravité |
|---|---|
| DRUNK_DRIVER · alcool / stupéfiants | CRITICAL |
| HARASSMENT · harcèlement | CRITICAL |
| DANGEROUS_DRIVING | HIGH |
| ROUTE_DEVIATION · détour | MEDIUM |
Échantillon évalué : 18 avis du jeu de référence, tous classés correctement. Les avis sont analysés en tâche planifiée (cron), hors du chemin critique de l'utilisateur.
92 tests automatisés, 0 échec.
Tests unitaires sur les règles métier critiques (authentification, cycle de vie d'une course, contrôle d'accès, enchères temps réel, IA) — relancés le 21/10/2026.
| Suite | Composant | Outil | Tests | Durée | Statut |
|---|---|---|---|---|---|
| AuthServiceTest | Core-service | JUnit 5 · Mockito | 13 | 1,08 s | PASS |
| TripRequestServiceTest | Core-service | JUnit 5 · Mockito | 14 | 1,86 s | PASS |
| RoleCheckAspectTest | Core-service | JUnit 5 | 4 | 0,75 s | PASS |
| CoreServiceApplicationTests | Core-service | Spring Boot Test | 1 | 13,5 s | PASS |
| bidding.gateway | AI & Realtime | Jest · ts-jest | 12 | 12,5 s | PASS |
| voice.service | AI & Realtime | Jest · ts-jest | 8 | PASS | |
| sentiment.service | AI & Realtime | Jest · ts-jest | 5 | PASS | |
| socketAuth.middleware | AI & Realtime | Jest · ts-jest | 5 | PASS | |
| trip.service · auth.service | App mobile | Jest | 18 | 17,6 s | PASS |
| AuthTabs · InputField · EndTripActionModal | App mobile | Testing Library | 12 | PASS |
Couverture des modules critiques
Instructions couvertes (Istanbul) sur les fichiers qui portent la logique sensible.
Couverture globale du service IA : 39 % des instructions — les routes, contrôleurs et connecteurs (Redis, RabbitMQ) sont couverts par les tests de bout en bout plutôt qu'en unitaire.
Ce que vérifient les tests
Extraits des cas testés sur le cycle de vie d'une course et l'authentification.
- completeTrip_reussit_et_regle_le_paiement_avant_de_cloturer
- completeTrip_refuse_si_le_code_pin_est_invalide
- completeTrip_refuse_si_ce_n_est_pas_le_chauffeur_assigne
- cancelTripRequestByClient_libere_le_paiement_reserve_si_une_proposition_etait_acceptee
- createTripRequest_refuse_si_une_course_est_deja_en_cours
- createTripRequest_refuse_si_une_categorie_de_vehicule_est_introuvable
- login_refuse_un_compte_inactif
- refreshAccessToken_refuse_un_token_revoque
- refreshAccessToken_refuse_un_token_expire
- register_refuse_un_numero_de_telephone_deja_utilise
- refuse_quand_role_insuffisant
- autorise_quand_au_moins_un_role_correspond
Les exigences non fonctionnelles, prouvées par des scripts.
Un dossier perf-tests/ dédié rassemble les tests de latence temps réel, de charge et de reprise après crash.
Latence de diffusion des enchères
20 chauffeurs connectés, 30 courses publiées, 2 campagnes — chaque demande doit atteindre chaque chauffeur.
latence (ms) — nombre de messages reçus
Charge & durabilité
Scénarios k6 et script de crash-test prêts à rejouer sur l'environnement cible.
GET /api/healthSIGKILL sur PostgreSQL, rejeu du WAL, comparaison d'étatChaque seuil est codé dans le script (thresholds k6) : le test échoue automatiquement s'il n'est pas tenu. La campagne de charge se lance avec k6 run gateway-auth-flow-realistic.js.
Temps réel
Rooms Socket.IO par trajet : seuls les acteurs concernés reçoivent les événements, pas de diffusion globale.
États éphémères en Redis
Enchères et positions GPS hors de PostgreSQL : la base transactionnelle n'absorbe pas le flux haute fréquence.
IA asynchrone
L'analyse des avis passe par RabbitMQ et une tâche planifiée : aucune attente de LLM côté utilisateur.
De la clé RSA au smart contract.
JWT RS256 + refresh tokens
Le core signe avec la clé privée, la gateway et le service temps réel vérifient avec la clé publique. Refresh tokens révocables et expirables.
Cookies HttpOnly côté web
Le back-office n'expose aucun token au JavaScript ; le handshake WebSocket est lui aussi authentifié.
Contrôle d'accès par rôle
Aspect Spring dédié (CLIENT, DRIVER, ADMIN), couvert par ses propres tests.
Limitation de débit & validation
Rate limiting sur l'endpoint vocal, schémas Zod sur les réponses LLM, jeu de test contenant des tentatives d'injection de prompt.
// TrustRegistry.sol — seul le backend écrit contract TrustRegistry { address public immutable backendAdmin; error OnlyBackendAuthorized(); error PolicyNotActive(); error NoGuaranteeBalance(); modifier onlyBackend() { if (msg.sender != backendAdmin) revert OnlyBackendAuthorized(); _; } event DriverSlashed( bytes32 indexed driverReference, uint256 amountPenalized, bytes32 reasonCode, bytes32 disputeReference, uint256 timestamp ); }
Une conception MERISE, 11 règles de gestion, 24 entités.
Le modèle a été conçu en MCD / MLD (Mocodo) avant d'être implémenté en JPA. Les opérations financières héritent d'un supertype commun ; les rôles, statuts et barèmes sont typés.
Le produit, en images.










Deux développeurs, 87 jours-homme, 158 commits.
Projet mené de juin à octobre 2026, découpé en 7 modules fonctionnels et un chantier transverse d'intégration.
Cadrage
Modélisation MERISE, maquettes, architecture microservices.
Socle
Auth JWT, portefeuille, gateway, premiers écrans mobiles.
Temps réel
Enchères Socket.IO, suivi GPS, smart contract.
IA & admin
Pipeline vocal, modération, litiges, back-office.
Preuves
Tests, campagnes de performance, évaluation IA.
Répartition par module
Estimation en jours, issue du plan de charge du projet.
Envie d'en voir plus ?
Démonstration, code source ou détails d'architecture : je présente volontiers le projet de bout en bout.