Avril 2025 → Mise en production Mars 2026
Charles d'Oiron · Mai 2026
Développeur full-stack depuis plus de 10 ans, avec plus de 300 missions réalisées sur des projets web, mobile et IA.
Passé par le design avant le code — j'ai une vision très produit / biz / impact.
J'accompagne des organismes publics et des startups.
Chez beta.gouv.fr, c'est ma troisième mission : j'ai d'abord développé Recosanté, une application native, puis refondu entièrement la plateforme Toutes et tous connecté.e.s, et je travaille maintenant sur Administration+.
Entrepreneur en parallèle — je développe plusieurs projets en parallèle que je documente sur Linkedin. www.spencer.club
Je suis développeur. J'ai pris la vague de l'IA.
Aujourd'hui, je ne code plus du tout — je ne fais que du prompt.
Ce projet de refonte est mon projet qui valide cette nouvelle façon de faire.
Ça marche parce que je suis un développeur senior passionné par le code, mais je n'ai jamais vu le code comme une finalité. Ce qui m'intéresse, c'est ce qu'on peut faire avec du code. L'arrivée de l'IA n'est donc pas du tout un problème pour moi — c'est juste un changement dans ma façon de construire les choses.
aplus.beta.gouv.frService public qui débloque les situations administratives complexes ou urgentes — quand les démarches classiques sont dans l'impasse.
Next.js pour les temps de chargement. TypeScript partout — back-end et front-end, tout est typé.
ZOD, Prisma, tRPC : types rigides du schéma à l'UI, validation stricte, capacité à bien fonctionner avec les LLM.
DSFR natif via composants React DSFR — super accessibilité par défaut. Tests unitaires sérieux. Onboarding < 1 journée.
Refondre intégralement un service public en production, à effectif réduit.
Au-delà des données et fichiers, il a fallu migrer une grosse logique métier complexe : 15 000 utilisateurs répartis dans 5 rôles différents, avec des permissions et une cohérence organisationnelle à préserver et simplifier.
Refondre un service public, ce n'est pas seulement réécrire du code : c'est préserver les données, les fichiers, les droits d'accès, les traitements historiques et la continuité de service.
Snapshot develop · 2026-05-12 · périmètre src/ hors generated/
Je code directement dans Cursor avec Claude Code dans le terminal.
2-3 terminaux ouverts en même temps.
Modèles : Opus 4.6 puis Opus 4.7
Plan 100 $/mois
Skills Vercel pour les bonnes pratiques front-end.
Skills Etalab pour la sécurité et l'audit RGAA.
Structuré en 9 sections : Project Overview → Commands → Architecture → Code Style → Testing → Task Management → Principles + Next.js Docs Index. Un guide complet pour Claude : qui je suis, comment je code, quelles règles respecter.
createMockReport()Documentation de toutes les librairies intégrée — React, Next.js, Prisma, tRPC, Zod, DSFR, Testing Library, etc. À chaque fois qu'on code, Claude consulte les bonnes pratiques directement.
Je n'ai jamais regardé le code ancien et très peu regardé l'ancienne prod. Volontairement. Partir des maquettes créées, partir du besoin — jamais de l'existant.
Les questions que je me pose :
Éliminer le problème est plus efficace que de le résoudre.
Une refonte, c'est beaucoup de liberté. Mais aussi une grosse migration à faire.
Quand on change le schéma, on doit écrire des scripts de migration — et s'assurer que les données s'intègrent bien.
Claude Code m'a énormément aidé. Le modèle avait accès à l'ancien schéma et au nouveau schéma en simultané — il pouvait proposer les adaptateurs de type directement.
J'ai construit une vingtaine de scripts asynchrones que je peux lancer via une clé. Chacun remplit une fonction spécifique : alléger la base, modifier les structures, tester les migrations. Le tout est logué en direct — je vois ce qui passe en temps réel.
Cette approche a accéléré la migration dans une proportion énorme.
init-production-db.tsDirige les 16 scripts en séquence stricte, chaque étape attendant la précédente.
Les 16 étapes
① Import areas depuis source
② Suppression area spécifique
③ Import organisations (hiérarchie)
④ Import utilisateurs (delta support)
⑤ Import équipes & groupes
⑥ Connexions users ↔ teams
⑦ Import signalements & réponses
⑧ Import fichiers métadonnées
⑨ Correction types TZNR
⑩ Snapshot users inactifs (6+ mois)
⑪ Import superviseurs
⑫ Import pilotes nationaux
⑬ Assign managers équipes orphelines
⑭ Désactiver notifs managers
⑮ Marquer tout comme consulté
⑯ Cleanup équipes sans membres
Contrôle précis de l'orchestration
--since=DATE — filtre technique : rattrape uniquement les entités (users, teams, connexions, rapports) créées après cette date. Utile après une interruption.
--reports-since=DATE — filtre métier : importe rapports/réponses créés après cette date, mais users/teams/connexions en totalité. Pour développement avec petit volume.
--staging — active l'anonymisation inline pendant l'import. Données fictives pour dev/tests.
--skip-reports — saute complètement l'import des 70K rapports. Accélère les imports de structure.
Combinaisons courantes : --since="2026-05-10T14:30:00Z" (delta), --reports-since="2026-05-01" --staging (dev léger), --skip-reports --staging (structure seule).
Intelligence — continue même en cas d'erreur, enregistre chaque timing, génère un récap avant/après (users, teams, rapports, réponses), écrit les erreurs et les stats en temps réel.
Développer sans risque sur des données réelles : générateurs de fausses données + anonymisation bidirectionnelle.
Factories de test
Fonctions dédiées qui génèrent des données fictives cohérentes : createMockUser(), createMockReport(), createMockTeam(), etc.
Support des overrides : créer un user inactif, un rapport complété, etc. sans dupliquer le code.
Données stables et prévisibles pour les tests — jamais de flakiness liée aux données.
Anonymisation & Désanonymisation
--staging pendant l'import : remplace automatiquement noms, emails, numéros en données fictives cohérentes.
Coder sur 70K rapports réels, 15K users réels, sans jamais exposer de données sensibles. La base de test est complète, pas une version réduite.
Règle : chaque nouveau fichier créé doit être associé à un test unitaire. Un fichier = un test.
Anatomie du test
Fichier : component.tsx
Test : component.spec.tsx (colocalisé)
3 cas de base couverts : cas vide, cas plein, cas erreur.
Claude Code génère les tests automatiquement
À partir du composant/fonction, il propose les cas de test pertinents avec les mocks tRPC, factories et assertions.
Réutilise les factories existantes : createMockUser(), createMockReport(), plutôt que de dupliquer.
Résultat : 46K lignes de tests pour 41K lignes de code.
Une fois les tests en place, Claude Code peut refactor avec confiance — les tests passent ou échouent, on sait immédiatement si le comportement a changé.
Model Context Protocol — étendre l'agent
Un protocole standard qui permet à Claude Code de parler à des outils tiers — Figma, Notion, Sentry, base de données, n'importe quoi.
Concrètement : l'agent peut lire une maquette Figma, écrire dans Notion, résoudre un ticket Sentry, sans qu'on lui colle l'info à la main.
« voici le screenshot de la maquette, code-moi ça »
« regarde le frame X dans Figma et implémente-le selon le DSFR »
Design → code
Lecture des frames + tokens
Extraction des variables (couleurs, espacements)
Génération du markup React/DSFR fidèle
Doc → contexte
Specs produit consultées directement
ADR (décisions) lus par l'agent
Création de tickets / pages depuis Claude
Prod → fix
Liste des erreurs en production
Stack trace + breadcrumbs accessibles
Reproduction → fix → PR
Effet de bord — la documentation devient utile à un agent, donc on l'écrit mieux.
/sentry-issuesL'IA rend toute l'équipe plus productive — pas seulement le développeur. Les widgets internes accélèrent le testing, le debugging, l'exploration du produit.
Certains de ces outils internes sont devenus publics. Ils permettent à n'importe quel membre de l'équipe de :
Impersonnification
Changer d'utilisateur et de rôle en un clic. Voir immédiatement les changements de page, les affectations, les permissions.
Email Debug
Liste complète de tous les emails envoyés pendant une session. Overview détaillée, inspection, debugging facile.
Impact Analysis
Avant de supprimer/désactiver un membre : rapport détaillé de l'incidence (entités affectées, mails, notifications, changements d'auteur). Maintenant utile en production.
L'IA a permis de brancher Mattermost directement à l'application. Résultat : monitoring et analytics intégrés au workflow de l'équipe.
Ce qui est maintenant possible
🔔 Tracking des mails — logs des emails envoyés directement dans Mattermost
⚠️ Alertes utilisateurs — problèmes ou anomalies détectées immédiatement
📊 Analytics temps réel — commandes pour accéder à des statistiques live (rapports, utilisateurs actifs, performance)
L'équipe n'a plus besoin de quitter Mattermost pour avoir une vue sur la santé et l'activité de l'application.
Je n'ai jamais autant fait d'audits de sécurité et corrigé de failles de sécurité sur un code auparavant.
Mesures mises en place
🔍 Audits de sécurité lancés — plusieurs scans et analyses pour identifier les vulnérabilités
👥 Reviews de sécurité par les pairs — demandé à plusieurs collaborateurs de faire des audits manuels
🔑 Rotation des secrets — renouvelé tous les secrets avant la mise en production
🚫 Isolation de l'IA — Claude Code n'a jamais eu accès aux bases de données, ni aux variables d'environnement, ni aux points critiques de l'infrastructure
Aucune vulnérabilité critique détectée. La confiance envers l'IA dépend de limites claires.
Mis en production en mars 2026. Ce que ça représente déjà :
La migration a tenu. Le service tourne.
aplus.beta.gouv.fr
Charles d'Oiron — charles@fragile.studio
beta.gouv.fr · Mai 2026