Étude de cas

Une entreprise qu'on regarde travailler.

Château Tire-Bouchon n'existe pas. C'est un domaine viticole basque inventé pour montrer ce qu'on peut construire pour un métier physique : une map 3D du site où tout bouge selon les données, et le back-office complet qui tourne derrière.

30migrations SQL rejouables
70tables Postgres
238règles RLS
312tests automatisés (Vitest et Playwright)

Chiffres relevés dans le dépôt du projet le 10 novembre 2026.

La map 3D du chai avec les compteurs du jour et l'activité de l'équipe
  1. Les cuves. Chacune affiche sa température et son lot ; au-dessus de 26 °C elle rougit et fume.
  2. Le caveau. Les visiteurs entrent par le parking et s'installent au bar pendant la dégustation.
  3. Le quai. Le camion du transporteur se gare, le chariot élévateur charge la palette de la commande.
  4. Les compteurs du jour. Ils lisent les mêmes vues SQL que le tableau de bord du back-office.
  5. L'équipe en temps réel, d'après la badgeuse : au poste, en réunion, en pause.

Le contexte

Beaucoup de logiciels de gestion se ressemblent : des listes, des formulaires, des onglets. Ils font le travail, mais on n'y voit pas l'entreprise. Pour une activité qui se passe dans un lieu (un chai, un atelier, un dépôt), j'ai voulu partir du lieu.

Le domaine est fictif, avec ses employés, ses clients, ses cuvées et ses chiffres. L'humour reste dans les noms : la cuvée « Gueule de Bois Noble », le restaurant Le Piment Rieur, le transporteur Palette & Fils. Le logiciel, lui, est construit comme un vrai : base de données, droits, tests, documentation.

Le problème type d'un domaine viticole

Un domaine de vingt personnes vit avec des outils qui ne se parlent pas.

  • Les commandes, le stock et les plannings vivent dans des fichiers Excel, chacun le sien.
  • Au rush de fin d'année, une commande d'entreprise peut dormir dans une boîte mail jusqu'à ce que le client relance.
  • Le stock de bouteilles se compte à peu près. Celui des matières sèches (bouchons, étiquettes, cartons) se découvre le jour où il manque.
  • Les saisonniers des vendanges arrivent et repartent, avec leurs heures, leurs contrats et leurs badges.
  • Personne n'a la vue d'ensemble : qui est là, ce qui part aujourd'hui, quelle cuve demande de l'attention.

La solution : une map et un back-office sur les mêmes données

La map n'est pas une maquette décorative. C'est une vue sur les mêmes tables que le back-office. Quand une commande avance dans le kanban, le dossier se déplace sur la map. Quand un employé badge sa pause, son personnage part au fronton. Chaque objet visible est cliquable et ouvre sa fiche, avec un bouton vers l'écran complet du back-office.

Fiche d'une cuve en fermentation ouverte sur la map
Un clic sur une cuve ouvre sa fiche : cuvée et millésime, étape, température et densité. Au-dessus de 26 °C, la fiche signale l'alerte, la cuve rougit et fume, et le maître de chai part la vérifier.
Le caveau de dégustation avec deux visiteurs au bar
Pendant le scénario de démo, deux visiteurs arrivent au caveau. La fiche de la zone affiche la dégustation en cours et qui l'anime.

Le back-office couvre le reste du métier : clients et devis guidés, commandes, planning, stock et fournisseurs, RH (présence, congés, feuilles de temps, salaires, recrutement), factures et relances, messagerie, assistant IA, automatisations, rôles et journal d'audit. Chaque action courante se fait en un clic, avec un contenu pré-rempli qu'on relit plutôt qu'on écrit.

Kanban des commandes par étape dans le back-office
Les commandes par étape. Un glisser-déposer n'accepte que l'étape suivante, et la base refuse aussi tout saut d'étape. La map voit le changement par Realtime.
Fiche d'une employée ouverte sur la map, salaire flouté
La fiche d'une employée sur la map : statut d'après la badgeuse, agenda du jour, solde de congés, contrat. Le salaire reste flouté et marqué « montant fictif » tant qu'on ne clique pas. Dans le back-office, sa feuille de temps du mois sort des badges.
Tableau de bord « Aujourd'hui » avec les tuiles à faire
« Aujourd'hui » : les devis à relancer, les factures en retard, les congés à valider et le stock bas. Chaque tuile agit en un clic.

Les choix techniques

Next.js 15 et Supabase

L'application est un seul projet Next.js 15 (App Router, TypeScript strict). Les pages lisent les données côté serveur, avec la session de l'utilisateur. Supabase fournit Postgres, l'authentification, le stockage de fichiers et Realtime.

Les droits dans la base, pas dans l'écran

Chaque table a ses règles RLS (Row Level Security) : une personne ne lit que les lignes de son organisation, et seulement les modules que son rôle autorise. Les écritures passent par des fonctions SQL qui vérifient le droit, appliquent la règle métier et écrivent l'événement dans la même transaction. Un écran mal codé ne peut donc pas contourner un droit.

Un journal d'événements partagé

Toute action écrit une ligne dans activity_events. La map s'abonne à ce journal et aux tables d'état par un seul canal Realtime filtré sur l'organisation. Les notifications, les compteurs et les animations en découlent. Les KPI sont des vues SQL : la map et le tableau de bord lisent la même définition.

React Three Fiber et de la géométrie procédurale

La scène est construite en React Three Fiber, sans aucun fichier de modèle 3D. Bâtiments, cuves, personnages et véhicules sortent de formes simples et de textures dessinées au canvas. Le plan du site est un JSON versionné en base, modifiable dans un éditeur intégré (glisser, tourner, lier un objet à un employé ou à une cuve, publier). Le mouvement passe par un moteur pur frame(dt), testé sans navigateur.

Une configuration par secteur

Le vocabulaire, les zones, les étapes d'un dossier, les KPI et le scénario de démo viennent d'un fichier de configuration validé par Zod, pas de textes codés dans les composants. Passer à un garage, c'est surtout écrire ce fichier et dessiner le plan.

Des tests à chaque couche

Vitest couvre les règles métier pures (TVA, arrondis, soldes de congés, alertes de budget) et, contre une base Supabase locale, les fonctions SQL et les règles RLS. Playwright pilote les parcours complets dans un vrai navigateur et refuse toute erreur dans la console.

Le code a été écrit avec des agents de code IA, sous ma direction : spécification, découpage en phases, revue et tests à chaque étape.

Les défis, et ce qui a marché

La performance de la scène

Le navigateur des tests automatiques n'a pas de carte graphique : il dessine la scène en logiciel, à environ une image par seconde. Les tests accélèrent donc l'horloge du scénario (?scenarioSpeed) et de la scène (?animationSpeed) au lieu de relâcher leurs contrôles. Sur une vraie carte graphique, la map tourne à 60 images par seconde (1440 × 900, Chromium sur une RTX 4070 Super de bureau). Pour tenir ce rythme : des géométries et des matériaux mis en cache par clé, les 40 barriques regroupées en deux maillages instanciés, un pas de temps plafonné à 50 ms.

La synchronisation en temps réel

Règle de départ : la base dit où se trouve chaque chose (zone, statut, étape), le navigateur anime le trajet et n'écrit jamais de position. Les tests mesurent le chemin Realtime sous les droits de l'utilisateur : entre 62 et 521 ms pour qu'une commande signée arrive, sur six mesures.

Un piège est apparu en route. Les comptes du personnel travaillaient dans l'organisation modèle que la démo publique copie. Le simulateur et leurs actions la modifiaient, et chaque visiteur recevait un domaine un peu différent. Le personnel a maintenant sa propre organisation, le modèle ne change plus que par les migrations, et un test vérifie qu'il reste identique après une simulation.

Les droits sur les salaires

Les salaires vivent dans une table à part, que seules la direction et les RH peuvent lire. Même pour elles, un montant ne s'affiche qu'après un clic, par une fonction qui vérifie le rôle et inscrit la consultation au journal d'audit. Les tests se connectent comme employé ou commerciale et vérifient que rien ne revient. Dans la démo publique, le visiteur voit des montants fictifs, floutés par défaut.

Ce qui changerait pour un vrai client

Ici, tout ce qui sort de l'application tourne en mode simulé, et l'écran le dit. Pour une vraie entreprise :

  • Les vraies intégrations : mail, agenda et fichiers Google Workspace ou Microsoft 365, l'outil comptable, la badgeuse, la signature électronique. Chacune demande ses accès et ses tests.
  • Les vraies données : reprise des fichiers Excel et des outils en place, plan des locaux dessiné dans l'éditeur, vocabulaire et étapes du métier.
  • L'hébergement : un projet Supabase en région Paris, le site sur Vercel, des sauvegardes et une surveillance. Les données restent en Europe.
  • La maintenance : mises à jour de sécurité, corrections, petites évolutions au fil des besoins, et quelqu'un à appeler quand quelque chose bloque.
  • Des points encore ouverts dans la démo : la facture électronique n'est pas validée par un outil Factur-X officiel, et la performance sur un ordinateur portable reste à mesurer.

Voir le domaine tourner.

La démo s'ouvre sans compte, sur votre propre copie des données. Le scénario dure 75 secondes, ensuite c'est à vous.

Une question sur votre propre activité ? Lire aussi à quoi ça sert pour une entreprise.