Retour d'expérience · beta.gouv.fr

Administration+

11 mois de refonte, un dev + Claude Code

Avril 2025 → Mise en production Mars 2026

Charles d'Oiron · Mai 2026

Capture d'écran Administration+

30 minutes

0 → 1'Qui je suis — parcours, ma nouvelle façon de faire
1 → 4'Le projet — Administration+, mission, pourquoi une refonte
4 → 6'Chiffres clés — code, tests, procédures
6 → 9'Workflow — ma stack, CLAUDE.md, Skills
9 → 12'Stratégie de refonte — repartir du besoin, le dilemme
12 → 17'La migration — orchestrateur, anonymisation, tests
17 → 22'Les MCP — Figma, Notion, Sentry + démo live
22 → 25'L'IA pour toute l'équipe — outils internes, Mattermost
25 → 28'Sécurité — audits, isolation, secrets · état prod aujourd'hui
28 → 30'Questions
01

Qui je suis

Charles d'Oiron

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

Ma nouvelle façon de faire

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.

02

Le projet

Administration+

aplus.beta.gouv.fr

Service public qui débloque les situations administratives complexes ou urgentes — quand les démarches classiques sont dans l'impasse.

Pourquoi une refonte ?

Avant
  • Stack historique en Scala
  • Dette technique accumulée
  • Coût d'évolution croissant
  • Onboarding dev lent
Objectif

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.

Le pari

Refondre intégralement un service public en production, à effectif réduit.

Contraintes réelles de production

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.

+1M
lignes migrées
Base de données historique
~70K
fichiers migrés
OVH → Scaleway
~5K
équipes migrées
Hiérarchie : utilisateurs → équipes → organisations → territoires
Chiffrement
fichiers & stockage
Sécurisation complète

Le vrai enjeu

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.

03

Chiffres clés de la refonte

La refonte en chiffres

28
pages
13 privées · 13 publiques · 2 hors groupe
~41k
lignes de code
329 fichiers .ts/.tsx · hors tests
~46k
lignes de tests
134 fichiers .spec
1 838
cas de test
344 blocs describe
81
procédures tRPC
10 routers
10
handlers REST
dont 5 crons
3
MCP en prod
Figma · Notion · Sentry

Snapshot develop · 2026-05-12 · périmètre src/ hors generated/

04

Workflow

Ma stack de travail

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

Investissement

Plan 100 $/mois

Skills

Skills Vercel pour les bonnes pratiques front-end.

Skills Etalab pour la sécurité et l'audit RGAA.

Mon CLAUDE.md

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.

Commands
bun dev
bun test
bun run check
bun run format
Architecture
Next.js 16 + TypeScript strict
Prisma + tRPC + Zod
DSFR + React Server Components
Code Style
function handleClick() {}
interface User {}
One folder = one test
Testing
Factories: createMockReport()
Global mocks setup
Test fails? → fix test
Settings Cursor

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.

05

Stratégie de refonte

Repartir du besoin, pas de l'existant

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 :

  • Qu'est-ce qu'on peut enlever ?
  • Qu'est-ce qu'on peut simplifier ?
  • Qu'est-ce qu'on peut optimiser ?

Éliminer le problème est plus efficace que de le résoudre.

Le dilemme de la migration

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 sur la migration

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.

06

La migration

L'orchestrateur : init-production-db.ts

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

Données de test et anonymisation

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.

Bénéfice majeur

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.

Génération des tests

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.

Les tests guident le refactor

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

07

Les MCP

Model Context Protocol — étendre l'agent

MCP, en bref

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.

Avant MCP

« voici le screenshot de la maquette, code-moi ça »

Avec MCP

« regarde le frame X dans Figma et implémente-le selon le DSFR »

Les 3 MCP qu'on utilise

Design → code

Figma

Lecture des frames + tokens
Extraction des variables (couleurs, espacements)
Génération du markup React/DSFR fidèle

Doc → contexte

Notion

Specs produit consultées directement
ADR (décisions) lus par l'agent
Création de tickets / pages depuis Claude

Prod → fix

Sentry

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.

Démo live — Les MCP en action

Démo en direct

Cycle complet sur un vrai cas

  1. Sentry — on liste les erreurs récentes via le skill custom /sentry-issues
  2. Notion — on lit la doc de la zone concernée
  3. Figma — on intègre un composant
08

L'IA pour toute l'équipe

Développer des outils internes pour les équipes

L'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 :

  • Débugger le produit sans relancer le code
  • Tester rapidement en changeant de contexte utilisateur
  • Explorer les fonctionnalités transversalement
  • Avoir une vue claire des comportements

Exemples de widgets debug

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.

Intégration Mattermost & Analytics temps réel

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.

09

Sécurité

Sécurité

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.

Administration+ en production — aujourd'hui

Mis en production en mars 2026. Ce que ça représente déjà :

22 520
rapports
78 438
messages
58 418
messages réels
615
utilisateurs créés
7 344
utilisateurs actifs
57
équipes créées
31
organisations créées
38 214
fichiers

La migration a tenu. Le service tourne.

Questions

Merci.

aplus.beta.gouv.fr

Charles d'Oiron — charles@fragile.studio

beta.gouv.fr · Mai 2026

00:00
Intro
total restant 30:00