Cas clients · Résultats mesurés
Six histoires concrètes — situation, action, résultat.
Pas des accroches commerciales. Pas de chiffres inventés. Chaque cas part d'un problème réel, défend une décision d'architecture qui a coûté quelque chose, et termine sur des métriques publiques vérifiables.
Format Situation → Task → Action → Result : le plus lisible pour un décideur — le contexte, la décision, et ce qu'elle a rapporté, mesuré.
150 000+
systèmes IoT/an en production (Gecko)
250 000+
techniciens télécoms (EXFO)
Top 1 %
mondial CodersRank · Top 5 C# France
2023
lignée techno reprise par Rockstar Games
Le framework C# open-source que Rockstar Games a acquis
CTO 2019-2021, 250 connexions concurrentes, équipe de 15 personnes
- 250
- Connexions concurrentes
- 30 000+
- Comptes créés
- Serveur vendu en 2021 · lignée reprise par Rockstar (2023)
- Issue
Situation— le contexte qui rendait le projet difficile
À 19 ans, je voulais comprendre comment un serveur temps réel tient 250+ connexions en simultané. Personne autour de moi ne savait l'expliquer. Le marché en 2016 était cadenassé par des middlewares propriétaires payants. Aucune base ouverte pour bâtir un framework C# avec un protocole réseau optimisé.
Task— ce que le projet exigeait précisément
Concevoir from scratch un framework réseau temps réel C# / C++ open-source capable d'encaisser 30 000+ comptes, 250 connexions concurrentes en continu, avec déploiement live sans interruption. Puis, en tant que CTO d'IdentityRP / SARP (2019-2021), maintenir le serveur communautaire en production avec une équipe de 15 personnes.
Action— ce que j'ai fait, décision par décision
- Conçu une architecture client-serveur autoritaire avec sérialisation binaire propriétaire (protobuf-net + UDP custom via Lidgren) — réduction de la bande passante d'un facteur 4 vs JSON sur TCP
- Bâti la stack CI/CD complète (build, test, deploy, rollback) — mises à jour live sans interruption pour 250 connexions actives, opérées toutes les semaines pendant deux ans de CTO
- Implémenté le monitoring proactif (CPU, RAM, sockets, taux de perte) avec autoscaling automatique sur les pics d'affluence
- Recruté, formé et dirigé une équipe de 15 personnes (devs, designers, QA, modérateurs) sans diplôme de management — la discipline a été imposée par la livraison hebdomadaire devant des utilisateurs réels
- Documenté l'architecture pour que le système puisse survivre à mon départ — ce qui s'est avéré décisif lors de la vente du serveur communautaire à des investisseurs allemands en 2021
Result— mesures, pas adjectifs
- 30 000+ comptes créés, 250 connexions persistantes concurrentes sans panne critique sur les années de production
- Mon départ en 2021 a été sans impact opérationnel — le serveur communautaire a été vendu à un groupe d'investisseurs allemands la même année et a continué d'opérer
- V-Multi a fusionné avec un projet concurrent (GTA Network) ; cette lignée technologique a ensuite été reprise dans l'écosystème Rockstar Games (Rockstar a intégré la filière Cfx.re/FiveM en août 2023).
- Sans diplôme d'ingénieur, sans investisseur initial, sans agence — juste plusieurs années de production continue
Le trade-off que j'ai défendu
J'ai choisi un protocole binaire propriétaire vs HTTP/REST. Coût : la communauté open source ne pouvait pas contribuer facilement. Bénéfice : ×4 sur la bande passante et une latence sub-100 ms qui a permis le scale que le projet a atteint.
Firmware IoT déployé sur 150 000 systèmes par an
Du capteur 256 KB RAM au dashboard cloud, sans rupture
- 150 000+
- Systèmes en prod / an
- ÷ 3
- Time-to-diagnose incidents
- 4 semaines → 1
- Onboarding d'un dev
Situation— le contexte qui rendait le projet difficile
Gecko Alliance est leader mondial des systèmes de contrôle pour spas connectés — 30-40 % du marché global, 100+ OEM clients. En 2023, ils lançaient leur plateforme IoT cloud-native. Aucune équipe existante ne couvrait l'ensemble de la chaîne firmware → cloud → mobile, ce qui obligeait les sprints à se coordonner entre 3 équipes séparées et à perdre du temps sur les contrats d'interface.
Task— ce que le projet exigeait précisément
Intervenir comme dev full-stack IoT capable de prendre des décisions sur l'ensemble de la chaîne. Spécification, firmware embarqué C / FreeRTOS sur microcontrôleurs contraints (< 256 KB RAM), pipeline cloud AWS IoT Core / Lambda / DynamoDB, et applications mobiles de contrôle. Cible : 150 000+ systèmes produits/an déployés en production.
Action— ce que j'ai fait, décision par décision
- Co-conçu le firmware embarqué en C / FreeRTOS avec optimisation stricte de l'empreinte mémoire (heap profiling, suppression des malloc dynamiques sur les hot paths, watchdog hardware)
- Architecturé les pipelines de télémétrie haute fréquence MQTT → AWS IoT Core → Lambda → DynamoDB — ingestion sans perte de paquets sur des bursts d'usage en heure de pointe
- Implémenté les mises à jour OTA des firmwares avec rollback automatique sur signature corrompue ou checksum invalide
- Développé l'app mobile de contrôle qui parle au backend cloud et au spa local en Bluetooth Low Energy (fallback si pas de Wi-Fi)
- Imposé une discipline d'observabilité (Serilog → CloudWatch) qui a permis de diagnostiquer les failures de production à distance plutôt que d'envoyer un technicien chez le client
Result— mesures, pas adjectifs
- Firmware déployé sur 150 000+ systèmes IoT produits par an, en chaîne de production 24/7
- Ingestion télémétrie sans perte de paquets validée sur 6 mois de prod
- Time-to-diagnose des incidents firmware divisé par 3 grâce à l'observabilité distribuée
- Onboarding d'un nouveau dev sur la chaîne IoT réduit de 4 semaines à 1 grâce à la doc d'archi unifiée
Le trade-off que j'ai défendu
J'ai défendu le choix de DynamoDB vs un time-series DB dédié (TimescaleDB) sur la télémétrie — coût opérationnel et complexité jugés trop élevés vs le besoin réel d'agrégat. Bénéfice : 1 seul service AWS à opérer, scaling automatique. Coût accepté : si Gecko monte à 10× le volume actuel, il faudra rebasculer.
Apps terrain utilisées par 250 000+ techniciens télécoms
Offline-first, BLE bas niveau, 100 pays, 95 des 100 plus grands opérateurs
- 250 000+
- Techniciens utilisateurs
- 100
- Pays couverts
- 0
- Régressions BLE en prod
Situation— le contexte qui rendait le projet difficile
EXFO est la référence mondiale du test télécoms — 2 000+ clients, présent dans 100 pays. Leurs techniciens fibre / 5G travaillent sur le terrain, souvent sans réseau, et doivent communiquer en Bluetooth Low Energy avec des appareils de mesure propriétaires. Tolérance zéro à la perte de données terrain — un test raté = un déplacement à refaire à 200 € la visite.
Task— ce que le projet exigeait précisément
Rejoindre l'équipe mobile pour développer / maintenir les apps Flutter / C# utilisées par 250 000+ techniciens. Intégrer les nouveaux protocoles BLE bas niveau pour la prochaine génération d'appareils de mesure. Garantir l'intégrité offline et la sync bidirectionnelle au retour réseau.
Action— ce que j'ai fait, décision par décision
- Intégré les protocoles Bluetooth Low Energy + Wi-Fi bas niveau pour la communication directe avec les appareils de mesure propriétaires — reverse engineering partiel du protocole legacy
- Contribué à l'architecture offline-first avec sync bidirectionnelle au retour réseau, sans perte de mesure même sur 8 h en zone blanche
- Renforcé les tests d'intégration BLE en simulation (mock du firmware côté Dart) — pas besoin du matériel physique pour la CI
- Documenté les patterns de comm BLE pour que les futures features ne réinventent pas la roue à chaque nouveau modèle d'appareil
Result— mesures, pas adjectifs
- Apps déployées dans 100 pays, utilisées par 250 000+ techniciens en quotidien
- Aucune régression sur les patterns BLE existants pendant l'intégration de la nouvelle génération d'appareils
- Couverture des tests d'intégration BLE passée de manuelle à automatisée sur la CI
Le trade-off que j'ai défendu
J'ai poussé pour étendre l'offline-first à toutes les nouvelles features par défaut, même quand le scope initial demandait juste "online avec cache". Coût : sprint allongé de ~20 %. Bénéfice : 0 régression terrain sur la zone fibre rurale, où les techniciens ont confirmé que c'était "le seul outil qui ne les lâche jamais".
OneRP — Framework temps réel multi-tenant via ActualLab Fusion RPC
2 048 connexions concurrentes — l'échelle d'un MMORPG · pattern repris sur 3 autres SaaS
- 2 048 (4× la concurrence)
- Connexions concurrentes ciblées
- 1 150+
- Tests cumulés
- 3 autres SaaS
- Pattern réutilisé sur
Situation— le contexte qui rendait le projet difficile
Les frameworks RP classiques empilent les API REST entre serveur, UI et admin. Au-delà d'un certain volume d'évènements concurrents, la latence cumulée tue l'UX. Le brief : un framework positionné comme une plateforme SaaS multi-tenant, capable d'héberger plusieurs instances en parallèle, sur une archi Event-Driven pure (zéro REST entre domaines) qui survive aux contraintes brutales d'un runtime in-game Mono 5.16.
Task— ce que le projet exigeait précisément
Concevoir une plateforme RP multi-tenant Event-Driven en .NET 9/10. La même archi doit servir le serveur cloud, l'admin Blazor .NET 10 (MudBlazor 8), les DLLs in-game Mono 5.16 et 48 mini-applications React 19.
Action— ce que j'ai fait, décision par décision
- Fusion RPC bout-en-bout (NUI ↔ serveur via WebSocket dédié /rpc/ws, MessagePack) — auto-invalidation des computed values, zéro endpoint REST entre domaines
- Multi-tenant imposé par InstanceId + Global Query Filters EF Core + TenantMiddleware — isolation par construction, impossible de fuiter une donnée entre instances
- Pattern dual-path MutateAsync vs MutateSerializableAsync pour les read-then-write monétaires (transactions atomiques)
- Analyzers Roslyn custom (codes ONERP00x) qui bloquent les anti-patterns à la compilation — la convention devient un check de build
- Wrapper SafeTriggerAsync pour contourner le bug Mono 5.16 où ScriptContext [ThreadStatic] est perdu après await (47 règles de contrainte Mono documentées dans CLAUDE.md)
- Dev harness NUI offline avec 68 callbacks mockés : tester les 48 UIs dans Chrome sans lancer le client lourd
- Type generation C# → TypeScript automatique : aucune divergence backend ↔ NUI
Result— mesures, pas adjectifs
- 2 048 connexions concurrentes ciblées sur le même monde virtuel — 4× ce que tient la concurrence directe (~500 connexions avant écroulement)
- 1 150+ tests cumulés (842 xUnit unit + 9 integration + 303 Vitest NUI)
- Pattern Fusion + multi-tenant query filter réutilisé sur SaleCast, PromptVault, Racine — sur des contextes business très différents
- Stack obs Docker prête : Prometheus + Grafana + Seq + OpenTelemetry + Serilog
Le trade-off que j'ai défendu
Fusion vs SignalR : Fusion impose une courbe d'apprentissage (2-3 semaines pour un dev .NET classique) et a une doc plus rare. En contrepartie, on récupère l'invalidation réactive automatique multi-serveur que SignalR ne fournit pas, et les analyzers Roslyn font respecter le pattern à la compilation.
PromptVault — Transformer les prompts IA d'une équipe en outils internes réutilisables
Même prompt dans le navigateur ET dans VS Code · PII masquées avant OpenAI (RGPD-ready)
- RGPD-ready
- PII masquées avant le LLM
- 3 (Web · Chrome · VS Code)
- Surfaces sur la même API
- 34
- Feature slices Fusion
Situation— le contexte qui rendait le projet difficile
Dans la plupart des boîtes, les prompts ChatGPT / Claude qui marchent finissent collés dans des notes Notion ou Docs perso. Pas de capitalisation, les non-tech ne peuvent pas exécuter un prompt complexe sans en comprendre la mécanique, et quand un membre part la connaissance part avec.
Task— ce que le projet exigeait précisément
Bâtir un SaaS B2B qui prend ces prompts ad-hoc et les transforme en outils internes : variables `{{champ}}` détectées automatiquement → formulaire généré pour les non-tech, chaînes multi-étapes, ContextPacks (ton/glossaire entreprise), Privacy Shield pour masquer les PII avant envoi LLM, workspaces multi-sièges avec billing Stripe, extensions Chrome MV3 + VS Code pour injecter les prompts dans les outils existants.
Action— ce que j'ai fait, décision par décision
- Architecture Feature Slices : chaque feature = I{Name}ComputeService Fusion (cache + invalidation cascade) + {Name}ApiEndpoints + composants Blazor dédiés — 34 slices au total
- Blazor Web App SSR pour le SEO landing + Interactive Server pour l'app (WASM écarté à cause du download initial de 5-10 MB)
- Deux extensions natives co-développées avec le backend : Chrome (Manifest V3, TypeScript, Vite) + VS Code (TypeScript, esbuild) — même API contract
- Privacy Shield isolé en couche transverse (plan dédié de 26 KB de specs) — PII masquées avant envoi LLM côté navigateur
- Observabilité OpenTelemetry + Seq + Hangfire jobs Postgres
Result— mesures, pas adjectifs
- Privacy Shield PII en couche transverse : les données personnelles sont masquées AVANT d'arriver chez OpenAI / Claude — l'un des rares moyens d'utiliser ChatGPT en boîte tout en respectant le RGPD
- 3 surfaces parallèles consommant la même API : Blazor Web + Chrome MV3 + VS Code
- Auth multi-providers (ASP.NET Identity + JWT + OAuth Google/GitHub/Microsoft) + workspaces multi-sièges
- Pas encore de prod publique — projet en dev actif, objectif documenté 500 users payants à 12 mois
Le trade-off que j'ai défendu
Blazor Web App SSR + Interactive Server vs WASM : j'ai écarté WASM à cause du download initial 5-10 MB qui aurait flingué la perception de réactivité sur la landing. Coût : pas de mode offline natif. Bénéfice : page d'accueil indexable SEO et premier rendu instantané — critique pour un SaaS B2B en acquisition.
Poisson Engine — 100 000 entités à 60 FPS dans un navigateur
Open-source MIT, pipeline GPU 8 passes, dégradation gracieuse WebGPU→WebGL→Canvas2D
- 100 000
- Entités simulées à 60 FPS
- 60× plus rapide
- vs implémentation CPU
- Démo publique + MIT
- Preuve
Situation— le contexte qui rendait le projet difficile
Tout le monde dit que "le web est lent pour les simulations". Avec WebGPU stabilisé en 2024, c'est devenu faux — mais quasiment personne ne le sait. Je voulais publier une preuve open source : 100 000 agents autonomes simulés à 60 FPS dans un onglet Chrome, sans appel serveur, sans WASM, juste du WebGPU pur.
Task— ce que le projet exigeait précisément
Construire un moteur de simulation WebGPU + WGSL, publier en package npm réutilisable, supporter la dégradation gracieuse (WebGPU → WebGL → Canvas2D) pour la compatibilité, viser 100 000 entités à 60 FPS sur un MacBook récent.
Action— ce que j'ai fait, décision par décision
- Pipeline GPU en 8 passes séquentielles dans un seul batch — zero allocation pendant la simulation
- Recherche de voisins par partitionnement spatial parallèle à 3 niveaux (algorithme académique adapté pour compute shader)
- 5 niveaux de détail (LOD) selon la distance — rendu précis au premier plan, densité agrégée en arrière-plan
- Détection automatique du matériel : bascule WebGPU → WebGL → Canvas2D selon ce qui est dispo
- Génétique optionnelle : chaque entité a un génome (vitesse, perception, taille), évolution par sélection naturelle — tout sur GPU
Result— mesures, pas adjectifs
- 100 000 entités à 60 FPS constants validé sur MacBook M3 Pro
- 60× plus rapide que l'implémentation CPU équivalente
- 70 tests automatisés couvrant la correctness du partitionnement spatial (validation cross-renderer)
- Open-source MIT — démo live publique poisson.floriansola.fr (deep dives architecture + simulation + sandbox)
Le trade-off que j'ai défendu
J'ai choisi de publier en npm sans CDN distribué (pas de jsDelivr / unpkg manuels). Coût : adoption plus lente. Bénéfice : pas de dépendance externe au moment de l'import, le bundle reste minimal et auditable.
Votre cas ressemble à l'un des six ?
Le premier échange est gratuit et sans engagement — on regarde ensemble si l'archi a une issue propre, et si je suis le bon profil.