Étude de cas · 2026

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.

React Native · Expo Spring Boot 3 · Java 21 Socket.IO Whisper · Gemini Solidity · Polygon
Course #128 · Analakely → Ivandry en direct
Demande publiéePrix max · 3 passagers · Berline
15 000 Ar
« Okey, fa 18 000 »Whisper → Gemini · NEGOTIATE
18 000 Ar
Offre diffusée au passagerSocket.IO · p95 mesuré
3 ms
Garantie chauffeur activeTrustRegistry · Polygon
LOCK
6
briques logicielles (mobile, web, gateway, core, IA, smart contract)
~42k
lignes de code source
96
endpoints REST
92/92
tests automatisés au vert
3ms
latence p95 des enchères temps réel
100%
exactitude de l'intention vocale (fr · mg)
01 — Contexte

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.
02 — Fonctionnalités

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.

expo-mapsGoogle PlacesAdiresy

Offres en temps réel

Les propositions des chauffeurs arrivent en direct ; le passager compare prix, véhicule et réputation, puis accepte.

Socket.IOrooms par trajet

Suivi de course

Position GPS du chauffeur mise à jour en continu jusqu'à la prise en charge, puis pendant le trajet.

expo-locationRedis

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.

QR code@Transactional

Portefeuille & recharge

Recharge en jetons par mobile money avec justificatif, historique des dépôts et des paiements.

MVola · Orange Moneytaux historisé

Avis, lieux favoris, historique

Notation du chauffeur, demande de compensation, adresses enregistrées et interface bilingue fr / mg.

i18nexpo-localization

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).

Whisper large-v3Gemini 2.5 Flash

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.

expo-speechTTS

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.

Socket.IOJWT handshake

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.

expo-cameraCloudinary

Mode confiance

Le chauffeur bloque des jetons en garantie ; le dépôt est enregistré sur le smart contract TrustRegistry.

Web3jPolygon

Historique & réputation

Courses passées, avis reçus, score de réputation (base 100) et gains en jetons.

React Query

Tableau de bord

Indicateurs d'activité, volumes de jetons et carte de chaleur des courses.

RechartsLeaflet heatmap

Gestion des litiges

Preuves des deux parties, barème par catégorie d'anomalie, décision et déclenchement du slashing on-chain.

11 catégories4 niveaux de gravité

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.

RabbitMQcron

Validation des transactions

Validation manuelle des dépôts et retraits mobile money, gestion des méthodes de paiement.

temps réel

Taux du jeton

Planification et historique du prix du jeton : PENDING → ACTIVE → SUPERSEDED.

période de validité

Utilisateurs & KYC

Fiche utilisateur, blocage et réactivation de compte, vérification des permis et véhicules.

RBAC

Smart contract TrustRegistry

Dépôt, retrait et pénalité de la garantie conducteur, historique des sanctions consultable, événements émis à chaque mouvement.

Solidity 0.8.28Hardhat

Verrous applicatifs

Seul le backend peut écrire (onlyBackend), politique active requise, erreurs typées pour chaque cas invalide.

custom errorsimmutable admin

Paiements ACID

Transfert de jetons entre portefeuilles et clôture du trajet dans une même transaction PostgreSQL.

Spring @Transactional

Flux de garantie tracés

Chaque LOCK, RELEASE, REFUND ou SLASH est stocké avec son hash de transaction on-chain.

trustfund_flow
03 — Architecture

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.

HTTPS · WS HTTPS · WS proxy REST proxy Socket.IO AMQP AMQP App mobile React Native · Expo · passager & chauffeur Back-office web React 19 · Vite · Tailwind API Gateway · :3001 Fastify 5 · vérification JWT RS256 · CORS Core-service · :8080 Spring Boot 3 · Java 21 · JPA · Web3j AI & Realtime · :5001 Node · Express · Socket.IO · Zod PostgreSQL 16 source de vérité · WAL Polygon TrustRegistry.sol RabbitMQ événements inter-services Redis 7 enchères · positions GPS APIs IA Groq Whisper · Gemini

Core-service

Java · 11,8 k lignes

Métier, portefeuilles, trajets, litiges, KYC. 16 contrôleurs, 96 endpoints, 24 entités JPA, couche blockchain Web3j.

Spring BootHibernateAOP RBAC

AI & Realtime

TS · 2,9 k lignes

Gateway d'enchères Socket.IO, pipeline vocal, analyse de sentiment planifiée, consommation RabbitMQ.

Socket.IOGroqGemini

Gateway

JS · Fastify

Point d'entrée unique : vérifie la signature JWT, route vers le core ou le service temps réel, gère les origines web.

@fastify/jwthttp-proxy

App mobile

TSX · 18,5 k lignes

39 écrans regroupés en espaces passager et chauffeur, cartes natives, caméra, audio, stockage sécurisé.

Expo SDK 56NativeWindReact Query

Back-office web

TSX · 7,8 k lignes

11 pages d'administration : tableau de bord, litiges, KYC, transactions, jetons, modération IA.

React 19ZustandLeaflet

Smart contract

Solidity · Polygon

Registre des garanties : dépôt, retrait, slashing en pourcentage, historique des sanctions et événements.

HardhatIgnition
04 — Parcours d'une course

De la demande au paiement, en six étapes.

Demande

Le passager publie trajet et prix maximum. Un seul trajet actif par client.

POST /trips

Diffusion

Les chauffeurs reçoivent la demande ; elle leur est lue à voix haute.

ws · request

Enchère

Réponse au doigt ou à la voix : accepter, négocier un montant, refuser.

ws · bidding_response

Acceptation

Le passager choisit une offre ; les jetons sont réservés, les autres offres rejetées.

PATCH /propositions

Trajet

Suivi GPS en direct jusqu'à la prise en charge puis l'arrivée.

ws · location

Clôture

Code PIN validé → paiement réglé → trajet clos → avis analysé par l'IA.

PATCH /complete
05 — Stack technique

Des 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
06 — Intelligence artificielle

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.

Assistant vocal chauffeur

Compréhension de l'intention

Phrase dictée → action métier + montant. Évaluation du 10/10/2026.

100 %
décisions correctes
22/22
montants exacts
0
erreur critique
0,93
confiance moyenne
prédit ACCEPT
prédit NEGOTIATE
ACCEPT
18
0
NEGOTIATE
0
22
Français (20)100 %
Malgache (19)100 %
Conversion fmg / « alina » (15)100 %

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.

Modération des avis

Analyse de sentiment & anomalies

Chaque avis reçoit un sentiment, une catégorie, une alerte sécurité et un code d'anomalie.

18/18
sentiments corrects
0,98
confiance médiane
435
avis de référence
11
catégories d'anomalie

Le jeu de référence couvre volontairement les cas difficiles :

code-switching fr/mg · 49avis de chauffeurs · 42négation · 13ambigu · 12note contradictoire · 10sarcasme · 8injection de prompt · 4emojis · SMS · fautes
Anomalie détectéeGravité
DRUNK_DRIVER · alcool / stupéfiantsCRITICAL
HARASSMENT · harcèlementCRITICAL
DANGEROUS_DRIVINGHIGH
ROUTE_DEVIATION · détourMEDIUM

É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.

07 — Qualité & tests

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.

SuiteComposantOutilTestsDuréeStatut
AuthServiceTestCore-serviceJUnit 5 · Mockito131,08 sPASS
TripRequestServiceTestCore-serviceJUnit 5 · Mockito141,86 sPASS
RoleCheckAspectTestCore-serviceJUnit 540,75 sPASS
CoreServiceApplicationTestsCore-serviceSpring Boot Test113,5 sPASS
bidding.gatewayAI & RealtimeJest · ts-jest1212,5 sPASS
voice.serviceAI & RealtimeJest · ts-jest8PASS
sentiment.serviceAI & RealtimeJest · ts-jest5PASS
socketAuth.middlewareAI & RealtimeJest · ts-jest5PASS
trip.service · auth.serviceApp mobileJest1817,6 sPASS
AuthTabs · InputField · EndTripActionModalApp mobileTesting Library12PASS

Couverture des modules critiques

Instructions couvertes (Istanbul) sur les fichiers qui portent la logique sensible.

ai · sentiment.service.ts100 %
ai · socketAuth.middleware.ts100 %
ai · voice.service.ts90 %
ai · bidding.gateway.ts73 %
mobile · auth.service.ts100 %
mobile · EndTripActionModal.tsx95 %

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
08 — Performance & fiabilité

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.

Mesuré

Latence de diffusion des enchères

20 chauffeurs connectés, 30 courses publiées, 2 campagnes — chaque demande doit atteindre chaque chauffeur.

1,5 ms
latence moyenne
3 ms
p95
11 ms
pire cas
0
message perdu / 1 200

latence (ms) — nombre de messages reçus

✓ Seuil exigé : 150 ms — le pire cas est 13× plus rapide
Protocoles outillés

Charge & durabilité

Scénarios k6 et script de crash-test prêts à rejouer sur l'environnement cible.

Charge brute core-servicek6 · rampe jusqu'à 500 utilisateurs virtuels · GET /api/health
p95 < 200 ms
Parcours réaliste via gatewayk6 · login JWT puis lecture authentifiée · comptes provisionnés
p99 < 500 ms
Taux d'erreur HTTPappliqué aux deux scénarios
< 1 %
Reprise après crash (RPO = 0)course IN_PROGRESS, SIGKILL sur PostgreSQL, rejeu du WAL, comparaison d'état
0 perte

Chaque 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.

09 — Sécurité

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
    );
}
10 — Modèle de données

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.

UserWalletTripRequestPropositionDisputeVehicleVehicleCategoryReviewPaymentTransactionTrustfundFlowTokenRateTransactionMethodAnomalyCategoryDisputeEvidenceReputationPenaltyReactivationRequestPolicyVersionUserConsentSavedPlaceRefreshToken
11 — Captures d'écran

Le produit, en images.

12 — Équipe & organisation

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.

Juin 2026

Cadrage

Modélisation MERISE, maquettes, architecture microservices.

Juil. 2026

Socle

Auth JWT, portefeuille, gateway, premiers écrans mobiles.

Août 2026

Temps réel

Enchères Socket.IO, suivi GPS, smart contract.

Sept. 2026

IA & admin

Pipeline vocal, modération, litiges, back-office.

Oct. 2026

Preuves

Tests, campagnes de performance, évaluation IA.

Répartition par module

Estimation en jours, issue du plan de charge du projet.

Espace utilisateur & portefeuille
11 j
Recharge du portefeuille
12 j
Espace chauffeur & mode vocal
18 j
Espace passager
16 j
Sécurité & garantie blockchain
8 j
Modération automatique (IA)
3 j
Panneau d'administration
12 j
Intégration WebSocket & HTTP
7 j

Envie d'en voir plus ?

Démonstration, code source ou détails d'architecture : je présente volontiers le projet de bout en bout.