Bienvenue

Plateforme

GRAMA

Next.js 16TypeScriptSupabasePostgreSQLpgvectorGemini APIMCPTailwind CSS 4Vercelk6

Moteur d'apprentissage axé sur l'IA et LMS pour la formation des enseignants de plusieurs établissements, conçu pour Industrias Roland Print S.A.C. et en production depuis juin 2026. Un assistant d'apprentissage RAG sur Google Gemini, une intégration MCP et du contenu de cours généré automatiquement, sur un monolithe modulaire hexagonal/DDD avec un schéma PostgreSQL multi-tenant sécurisé par Row Level Security.

Le problème

Industrias Roland Print avait besoin d'une plateforme de formation unique pour les enseignants de plusieurs établissements. Les LMS génériques comme Moodle demandaient beaucoup de configuration et n'offraient toujours pas les règles de progression, l'analytique par établissement et l'assistance IA souhaitées par le client. Le défi : construire une plateforme prête pour la production capable de servir de nombreux établissements depuis un seul déploiement, d'isoler les données de chaque tenant et de monter à des dizaines de milliers d'utilisateurs avec un budget d'infrastructure serré.

Décisions clés

Architecture hexagonale et DDD avec 12 bounded contexts

Cours, progression, évaluations, analytique, IA et multi-tenancy évoluent chacun pour des raisons différentes. Les modéliser comme des bounded contexts dans un monolithe modulaire garde la logique métier indépendante de Next.js et de Supabase derrière des ports et des adaptateurs : chaque contexte peut être testé et évoluer seul, sans payer le coût opérationnel des microservices.

Multi-tenancy garantie par la Row Level Security, pas seulement par le code applicatif

Avec plusieurs établissements et rôles partageant une même base, une seule clause WHERE oubliée ferait fuiter des données d'un tenant à l'autre. Les politiques de Row Level Security font rejeter par PostgreSQL lui-même les lignes hors de l'établissement et du rôle de l'appelant, et chaque server action redérive le rôle depuis la session au lieu de faire confiance au client. Le schéma a été dimensionné pour 30 000 utilisateurs et des pics de 8 000 connexions simultanées, et validé par des tests de charge k6.

pgvector dans la même instance Postgres pour l'assistant RAG

Une base vectorielle dédiée aurait été un service de plus à provisionner, sécuriser et payer. Les embeddings sont toujours interrogés avec des données relationnelles comme l'inscription et le tenant : les garder dans Postgres permet à l'assistant de combiner recherche par similarité et contrôle des droits en une seule requête, sous les mêmes politiques RLS.

Analytique sur des agrégats et des RPC PostgreSQL

Les tableaux de bord des établissements agrègent les données d'avancement et de progression de nombreux utilisateurs. Calculer ces agrégats dans la base et les exposer via des RPC évite d'envoyer des lignes brutes au serveur et garde les requêtes lourdes au plus près des données, sous les mêmes règles d'accès que le reste de la plateforme.

Server Components pour la lecture, état côté client seulement là où il apporte quelque chose

Rendre les pages avec des données déjà récupérées côté serveur évite les cascades de chargement : les enseignants voient tout de suite une page complète. L'état côté client est réservé aux parcours interactifs comme l'envoi de quiz, la mise à jour de la progression et l'assistant en streaming.

Résultat

GRAMA est en production depuis juin 2026 et sert la formation des enseignants de plusieurs établissements. Au-delà des fonctionnalités, le projet m'a montré à quel point la fiabilité dépend des décisions prises tôt : des frontières de domaine claires, une sécurité appliquée dans la base de données et des tests de charge avant l'arrivée du vrai trafic.

Fonctionnalités

Architecture

  • Monolithe modulaire hexagonal / DDD avec 12 bounded contexts
  • Schéma multi-tenant avec accès par rôles et Row Level Security
  • Dimensionné pour 30 000 utilisateurs et des pics de 8 000 connexions simultanées, testé en charge avec k6
  • Données existantes migrées avec des chargeurs idempotents

Couche IA

  • Assistant d'apprentissage RAG sur Google Gemini avec streaming et appels d'outils
  • Recherche sémantique avec pgvector, limitée par inscription et par tenant
  • Intégration MCP
  • Contenu de cours généré automatiquement

Moteur d'apprentissage

  • Hiérarchie Cours → Module → Leçon → Élément avec plusieurs types de contenu
  • Progression séquentielle : une leçon se débloque quand la précédente est terminée
  • Notation automatique liée aux mises à jour de la progression

Analytique et infra

  • Module d'analytique sur des agrégats et des RPC PostgreSQL
  • Déployé sur Vercel avec Supabase (PostgreSQL, Auth, Storage)
  • DNS et cache en edge avec Cloudflare

Travaillons ensemble