Alternatives LifterLMS : Construire une pile LMS moderne en 2026
Traduction du guide LMS Headless 2026
J'ai construit plus de plateformes LMS que je ne le souhaiterais. Certaines sur LifterLMS, d'autres sur LearnDash, quelques-unes sur des applications Rails personnalisées qui hantent probablement encore leurs mainteneurs. Et voici la chose à laquelle je reviens constamment : le modèle traditionnel des plugins LMS WordPress -- où un monolithe gère les cours, les adhésions, les paiements, les quiz, les certificats et l'email -- est fondamentalement en contradiction avec la façon dont nous construisons de bon logiciels en 2026.
LifterLMS n'est pas mauvais. C'est en fait assez capable, surtout si vous voulez une fonctionnalité d'adhésion intégrée dès le départ. Mais une fois que vous avez passé quelques années à traiter les conflits de plugins, les goulots d'étranglement de performance sur les pages de catalogue de cours, et les limitations créatives d'un frontend rendu en PHP, vous commencez à vous demander : et si nous ne le faisions simplement pas de cette façon ?
Cet article expose une architecture moderne de pile LMS qui remplace LifterLMS (ou tout plugin LMS monolithique) par une approche composable et headless. Je couvrirai les vrais outils, les vrais compromis, et les décisions architecturales qui comptent quand vous construisez quelque chose qui doit durer.
Table des matières
- Pourquoi LifterLMS atteint un plafond
- À quoi ressemble réellement une pile LMS moderne
- La couche de contenu : CMS headless pour le contenu de cours
- Le frontend : Next.js ou Astro pour l'expérience d'apprentissage
- Authentification et gestion des utilisateurs
- Paiements et monétisation
- Suivi de la progression et couche de données
- Quiz, évaluations et contenu interactif
- Comparaison des architectures : Monolithe vs. LMS Headless
- Quand cette approche a du sens (et quand ce n'est pas le cas)
- Un exemple de pile du monde réel
- FAQ

Pourquoi LifterLMS atteint un plafond
LifterLMS fait beaucoup de choses correctement. Le noyau gratuit est véritablement utile -- vous pouvez lancer des cours sans payer quoi que ce soit. Les niveaux d'adhésion intégrés signifient moins de dépendances aux plugins. Et pour un plugin WordPress, le workflow d'administration est stable et prévisible.
Mais parlons de l'endroit où cela se casse.
Performance sous charge
Chaque chargement de page interroge la base de données plusieurs fois. Les pages de catalogue de cours avec 50 + cours, les vérifications d'inscription, la vérification du niveau d'adhésion, la tarification dynamique -- tout rendu côté serveur via PHP. J'ai vu des sites LifterLMS où l'archive de cours prend 3 à 4 secondes à rendre même avec la mise en cache des objets activée. La mise en cache des pages aide les utilisateurs déconnectés, mais vos véritables étudiants -- ceux connectés -- obtiennent l'expérience complète non mise en cache.
La spirale des coûts des modules complémentaires
Le modèle « gratuit pour commencer » de LifterLMS devient rapidement coûteux. Besoin des paiements Stripe ? C'est un module complémentaire. Quiz avancés ? Module complémentaire. Devoirs ? Module complémentaire. Groupes ? Module complémentaire. Au moment où vous avez un LMS prêt pour la production, vous regardez 300 à 500 dollars/an en packs de modules complémentaires, ce qui vous met dans la même gamme de prix que LearnDash ou même certaines plateformes SaaS comme TalentLMS (à partir de 89 $/mois en 2026).
Limitations du frontend
C'est la grosse pour moi. Votre expérience d'apprentissage est limitée par les thèmes WordPress et les remplaçants CSS que vous pouvez empiler. Vous voulez une leçon basée sur React interactive ? Vous combattez le système. Vous voulez intégrer un terrain de jeu de code, un tableau blanc collaboratif, ou un quiz en temps réel avec des mises à jour WebSocket ? Bonne chance à le faire proprement dans un modèle WordPress.
La toile de dépendance des plugins
Même si LifterLMS intègre plus que LearnDash, vous vous retrouvez toujours avec une pile de plugins : un plugin de formulaire, un plugin SEO, un plugin de mise en cache, peut-être WooCommerce pour les produits physiques, un constructeur de pages. Chacun est un point de conflit potentiel, une surface de sécurité, et une charge de maintenance.
À quoi ressemble réellement une pile LMS moderne
L'idée centrale est la décomposition. Au lieu qu'un plugin fasse tout, vous choisissez les meilleurs outils pour chaque préoccupation et les connectez via des API. C'est le même modèle qui a transformé l'e-commerce (Shopify headless, Saleor, Medusa) et l'édition de contenu (CMS headless + frontends statiques).
Voici l'architecture de haut niveau :
┌─────────────────────────────────────────────┐
│ Frontend (Next.js / Astro) │
│ Course pages, lessons, quizzes, dashboard │
└──────────────┬──────────────────────────────┘
│ API calls
┌──────────┼──────────────┐
│ │ │
┌───▼───┐ ┌───▼────┐ ┌──────▼──────┐
│Headless│ │Auth │ │ Progress │
│ CMS │ │Service │ │ Tracking DB │
│(Sanity/│ │(Clerk/ │ │(Supabase/ │
│Strapi) │ │Auth0) │ │PlanetScale) │
└────────┘ └────────┘ └─────────────┘
│ │
┌───▼────────────────────────▼───┐
│ Payment Layer │
│ (Stripe / Lemon Squeezy) │
└────────────────────────────────┘
Chaque pièce est indépendamment scalable, remplaçable, et testable. Décomposons chaque couche.
La couche de contenu : CMS headless pour le contenu de cours
Votre contenu de cours -- leçons, modules, intégrations vidéo, ressources téléchargeables, biographies d'instructeurs -- vit dans un CMS headless. C'est le plus grand gain architectural car il sépare la gestion de contenu de la livraison de contenu.
Pourquoi ne pas simplement utiliser des fichiers Markdown ?
Vous pourriez, et pour une équipe composée uniquement de développeurs construisant une plateforme de formation interne, les fichiers MDX dans un dépôt Git pourraient être parfaits. Mais dès que vous avez des instructeurs non techniques créant du contenu, vous avez besoin d'une interface d'édition appropriée.
Meilleurs choix pour 2026
Sanity est mon incontournable pour les modèles de contenu complexes. Vous pouvez définir un schéma de cours avec des modules, des leçons, des quiz et des prérequis en tant que données structurées. L'édition collaborative en temps réel est excellente, et Portable Text vous donne du contenu riche sans le problème du blob HTML. Le niveau gratuit gère jusqu'à 100 K demandes API/mois, ce qui couvre la plupart des déploiements LMS petits à moyens.
Strapi (v5, lancé en 2025) est l'option open-source la plus forte. Auto-hébergez-le sur un VPS à 20 $/mois et vous avez le contrôle total sur votre API de contenu. Le générateur de type de contenu vous permet de modéliser les cours, les leçons et les évaluations visuellement, ce que les instructeurs apprécient vraiment.
Payload CMS mérite une mention -- il est natif de TypeScript, auto-hébergé, et dispose d'un contrôle d'accès excellent intégré. Si votre équipe est déjà profonde dans l'écosystème TypeScript, Payload s'adapte comme un gant.
Nous avons construit plusieurs implémentations de CMS headless pour des clients de l'éducation via notre pratique de développement CMS headless, et la phase de modélisation du contenu est là où la plupart des décisions importantes se produisent.
// Exemple : schéma Sanity pour une leçon de cours
export default {
name: 'lesson',
title: 'Lesson',
type: 'document',
fields: [
{ name: 'title', type: 'string', validation: Rule => Rule.required() },
{ name: 'slug', type: 'slug', options: { source: 'title' } },
{ name: 'module', type: 'reference', to: [{ type: 'module' }] },
{ name: 'order', type: 'number' },
{ name: 'content', type: 'array', of: [{ type: 'block' }, { type: 'code' }, { type: 'videoEmbed' }] },
{ name: 'duration', type: 'number', description: 'Estimated minutes' },
{ name: 'isFree', type: 'boolean', initialValue: false },
{ name: 'prerequisites', type: 'array', of: [{ type: 'reference', to: [{ type: 'lesson' }] }] },
],
}

Le frontend : Next.js ou Astro pour l'expérience d'apprentissage
C'est là que vos étudiants passent réellement leur temps, il doit donc être rapide, accessible et suffisamment flexible pour gérer des types de contenu divers.
Next.js : le choix complet
Next.js (App Router, RSC) est le choix naturel quand votre LMS a besoin de logique côté serveur : vérifications d'inscription, sauvegarde de progression, soumission de quiz, génération de certificats. Les composants serveur vous permettent d'récupérer les données du cours sans envoyer JavaScript au client. Les actions serveur gèrent les soumissions de formulaire (réponses de quiz, mises à jour de profil) sans créer une API distincte.
Nous faisons beaucoup de développement Next.js chez Social Animal, et pour les projets LMS spécifiquement, la combinaison de ISR (Incremental Static Regeneration) pour les pages de catalogue de cours et le rendu dynamique pour les tableaux de bord des étudiants vous donne le meilleur des deux mondes.
Astro : le choix riche en contenu
Si votre LMS est principalement la livraison de contenu -- pensez aux cours de style documentation, aux tutoriels écrits, aux cours vidéo sans interactivité lourde -- Astro envoie considérablement moins de JavaScript. Une page de cours qui est du contenu statique à 95 % avec un seul composant de quiz interactif ? L'architecture d'îles d'Astro gère cela magnifiquement.
---
// src/pages/courses/[slug]/lessons/[lesson].astro
import { sanityClient } from '../../../lib/sanity';
import LessonLayout from '../../../layouts/LessonLayout.astro';
import QuizWidget from '../../../components/QuizWidget'; // React island
import ProgressTracker from '../../../components/ProgressTracker'; // React island
const { slug, lesson } = Astro.params;
const lessonData = await sanityClient.fetch(
`*[_type == "lesson" && slug.current == $lesson][0]{...}`,
{ lesson }
);
---
<LessonLayout title={lessonData.title}>
<article class="lesson-content">
<PortableText value={lessonData.content} />
</article>
{lessonData.quiz && (
<QuizWidget client:visible quizId={lessonData.quiz._ref} />
)}
<ProgressTracker client:idle lessonId={lessonData._id} />
</LessonLayout>
La directive client:visible signifie que le composant de quiz ne s'hydrate que lorsque l'étudiant le fait défiler. Zéro coût JavaScript jusqu'à ce qu'ils en aient réellement besoin.
Authentification et gestion des utilisateurs
C'est là que beaucoup de messages de blog sur « LMS headless » agitent les mains et disent « utilisez Auth0 ». C'est plus nuancé que cela.
Votre couche d'authentification doit gérer :
- L'inscription et la connexion des étudiants
- L'accès basé sur les rôles (étudiant, instructeur, administrateur)
- La vérification de l'inscription au cours (cet utilisateur est-il autorisé à voir cette leçon ?)
- La gestion des sessions sur les appareils
Clerk
Clerk est devenu la valeur par défaut pour les projets Next.js, et pour une bonne raison. Les composants <SignIn /> et <UserProfile /> économisent des semaines de travail UI. Les revendications personnalisées vous permettent de stocker les données d'inscription et les rôles. La tarification commence gratuitement pour jusqu'à 10 000 utilisateurs actifs par mois -- plus que suffisant pour la plupart des plateformes de cours.
Supabase Auth
Si vous utilisez déjà Supabase pour votre couche de données (plus sur cela ci-dessous), son authentification intégrée est solide et gratuite. Les politiques de sécurité au niveau des lignes signifient que vous pouvez appliquer « seuls les étudiants inscrits voient cette leçon » au niveau de la base de données, ce qui est un modèle de sécurité fort.
Auth.js (anciennement NextAuth)
L'option open-source. Plus de configuration, plus de flexibilité, pas de verrouillage des fournisseurs. Si vous auto-hébergez tout, c'est le chemin à suivre.
Paiements et monétisation
LifterLMS regroupe le traitement des paiements, et honnêtement, il le fait assez bien. Répliquer cela dans une pile headless nécessite une réflexion approfondie.
Stripe est le choix évident. Stripe Checkout gère l'interface utilisateur de paiement, et les webhooks Stripe avertissent votre backend quand un achat est effectué. Pour l'accès basé sur l'abonnement (adhésion mensuelle à tous les cours), Stripe Billing gère le travail lourd.
Lemon Squeezy mérite d'être considéré si vous vendez des cours à l'international et ne voulez pas traiter la conformité TVA/GST vous-même. Ils agissent en tant que votre marchand. Le compromis est des frais légèrement plus élevés (5% + 50 ¢ par transaction contre 2,9% + 30 ¢ de Stripe).
Voici un flux d'inscription simplifié :
// Server Action: handle successful payment webhook
export async function handleStripeWebhook(event: Stripe.Event) {
if (event.type === 'checkout.session.completed') {
const session = event.data.object;
const userId = session.metadata.userId;
const courseId = session.metadata.courseId;
await db.enrollment.create({
data: {
userId,
courseId,
enrolledAt: new Date(),
status: 'active',
},
});
// Trigger welcome email, unlock first module, etc.
await triggerEnrollmentWorkflow(userId, courseId);
}
}
Suivi de la progression et couche de données
C'est le cœur de tout LMS -- savoir où se trouve chaque étudiant, ce qu'il a complété et comment il se porte.
Options de base de données
Supabase (Postgres) vous donne une base de données relationnelle avec abonnements en temps réel, sécurité au niveau des lignes, et un niveau gratuit généreux. Pour la plupart des déploiements LMS de moins de 50 000 utilisateurs, le plan gratuit fonctionne. Le plan Pro à 25 $/mois gère considérablement plus.
PlanetScale (MySQL) offre d'excellents flux de branching pour les changements de schéma. Si vous itérez rapidement sur votre modèle de données -- ce que vous ferez dans les étapes initiales -- le branching de base de données est véritablement utile.
Neon (Postgres serverless) est mon favori actuel pour les projets Next.js. Les démarrages à froid sont rapides, et vous ne payez que pour ce que vous utilisez. Le niveau gratuit inclut 0,5 Go de stockage et 100 heures de calcul.
Le schéma de progression
CREATE TABLE enrollments (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id TEXT NOT NULL,
course_id TEXT NOT NULL,
enrolled_at TIMESTAMP DEFAULT NOW(),
completed_at TIMESTAMP,
status TEXT DEFAULT 'active',
UNIQUE(user_id, course_id)
);
CREATE TABLE lesson_progress (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id TEXT NOT NULL,
lesson_id TEXT NOT NULL,
started_at TIMESTAMP DEFAULT NOW(),
completed_at TIMESTAMP,
time_spent_seconds INTEGER DEFAULT 0,
UNIQUE(user_id, lesson_id)
);
CREATE TABLE quiz_attempts (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id TEXT NOT NULL,
quiz_id TEXT NOT NULL,
score DECIMAL(5,2),
answers JSONB,
submitted_at TIMESTAMP DEFAULT NOW()
);
Pour la conformité xAPI (que certains clients d'entreprise nécessitent parfois), vous pouvez enregistrer les événements d'apprentissage à un Learning Record Store (LRS) comme Learning Locker ou Veracity aux côtés de votre base de données principale.
Quiz, évaluations et contenu interactif
C'est là que LifterLMS -- et surtout LearnDash -- ont un avantage véritable avec leurs moteurs de quiz intégrés. Dans une pile headless, vous construisez cela vous-même ou utilisez un service.
Construisez-le vous-même
Pour les quiz de base (choix multiple, vrai/faux, remplissage à trous), un composant React personnalisé soutenu par votre base de données est simple. Stockez les questions et les bonnes réponses dans votre CMS, rendez-les côté client, validez côté serveur.
Utilisez un service
Typeform ou Tally peuvent gérer les évaluations avec les rappels webhook pour enregistrer les scores. Pas idéal pour les tests à enjeux élevés mais utilisable pour les quiz de cours.
Pour des besoins d'évaluation complexes -- banques de questions, randomisation, limites de temps, mesures anti-triche -- vous regardez le développement personnalisé. C'est exactement le type de projet où travailler avec un partenaire de développement a du sens, car obtenir la sécurité d'évaluation correctement est non-trivial.
Comparaison des architectures : Monolithe vs. LMS Headless
| Aspect | LifterLMS (Monolite) | Pile LMS Headless | SaaS LMS (p. ex. Teachable) |
|---|---|---|---|
| Temps de lancement | Jours à semaines | Semaines à mois | Heures à jours |
| Coût initial | 0 à 500 $/an | 0 à 200 $/mois (hébergement + services) | 39 à 199 $/mois |
| Performance | Modérée (PHP-rendu) | Excellente (statique + edge) | Varie selon le fournisseur |
| Personnalisation | Thème + CSS limité | Illimité | Très limité |
| Flexibilité du contenu | Éditeur WordPress | N'importe quel type de contenu | Spécifique à la plate-forme |
| Scalabilité | Verticale (serveur plus gros) | Horizontale (edge + CDN) | Gérée par le fournisseur |
| Verrouillage du fournisseur | Écosystème WordPress | Faible (échangez n'importe quelle pièce) | Élevé |
| Développeur requis | Parfois | Oui | Non |
| Complexité du quiz | Modérée (avec modules complémentaires) | Construisez ce dont vous avez besoin | Basique |
| Maintenance | Mises à jour des plugins, conflits | Mises à jour des services, moins de conflits | Le fournisseur s'en charge |
Quand cette approche a du sens (et quand ce n'est pas le cas)
Allez headless quand :
- Votre expérience d'apprentissage a besoin d'interactivité personnalisée (terrains de jeu de code, simulations, exercices collaboratifs)
- Vous avez plus que quelques centaines d'apprenants simultanés et la performance compte
- Vous souhaitez intégrer le LMS avec les systèmes existants (CRM, RH, applications personnalisées)
- Vous vous souciez de l'expérience utilisateur du frontend et voulez le contrôle total sur la conception
- Vous construisez quelque chose que vous prévoyez d'exploiter pendant 3 + ans
Restez avec LifterLMS quand :
- Vous êtes un créateur individuel lançant votre premier cours
- Le budget est serré et vous devez lancer cela cette semaine, pas ce trimestre
- Votre contenu de cours est simple (leçons vidéo, texte, quiz de base)
- Vous n'avez pas de développeur dans l'équipe et ne prévoyez pas d'en embaucher un
- L'intégration des adhésions + cours prêtes à l'emploi compte plus que l'expérience utilisateur personnalisée
Je ne vais pas prétendre que l'approche headless est toujours meilleure. C'est plus de travail en amont. Cela nécessite des décisions techniques continues. Pour beaucoup de cas d'usage, LifterLMS ou Tutor LMS sur un hôte WordPress bien configuré est le bon choix.
Mais pour les organisations construisant une vraie plateforme d'apprentissage -- pas seulement « des cours sur un site web » -- la pile headless vous donne une fondation qui ne vous combat pas à mesure que les exigences se développent.
Un exemple de pile du monde réel
Voici une pile concrète que nous recommanderions pour une académie en ligne de taille moyenne avec 20 à 50 cours et quelques milliers d'étudiants actifs :
| Couche | Outil | Coût mensuel |
|---|---|---|
| Frontend | Next.js sur Vercel | 20 $ (plan Pro) |
| CMS | Sanity | 0 à 99 $ (plan Growth) |
| Auth | Clerk | 0 $ (jusqu'à 10 K MAU) |
| Base de données | Neon Postgres | 0 à 19 $ |
| Paiements | Stripe | 2,9% + 30¢ par transaction |
| Resend | 0 à 20 $ | |
| Hébergement vidéo | Mux | Pay-per-use (~0,007 $/min visualisé) |
| Recherche | Algolia ou Meilisearch | 0 à 29 $ |
| Total | ~60 à 190 $/mois + frais Stripe |
Comparez cela à LifterLMS avec le pack Infinity (999 $/an = ~83 $/mois) plus l'hébergement WordPress géré (30 à 50 $/mois), et les coûts sont étonnamment similaires. Mais la pile headless vous donne des chargements de page inférieur à une seconde, un frontend personnalisé, et la capacité d'échanger n'importe quelle pièce sans tout reconstruire.
Pour une conversation plus approfondie sur la bonne architecture pour votre situation spécifique, consultez notre page de tarification ou contactez-nous directement. Nous avons une expérience particulière avec ces types de constructions de plateformes d'éducation.
FAQ
Puis-je migrer mes cours LifterLMS existants vers une pile headless ?
Oui, mais ce n'est pas une opération push-button. LifterLMS stocke le contenu des cours dans des messages WordPress et des types de message personnalisés. Vous pouvez exporter ces données via l'API REST WordPress ou WP-CLI et les transformer dans le modèle de contenu du nouveau CMS. Les données de progression des étudiants (inscriptions, scores de quiz, enregistrements d'achèvement) vivent dans des tables de base de données personnalisées que vous devrez interroger et migrer séparément. Budgétez 2 à 4 semaines pour une migration complète d'un site avec 20 + cours.
Une pile LMS headless est-elle plus chère que LifterLMS ?
Pas nécessairement. Le noyau gratuit de LifterLMS est trompeur -- les déploiements de production coûtent généralement 300 à 1 000 $/an en modules complémentaires, plus 360 à 600 $/an pour un hébergement WordPress de qualité. Une pile headless utilisant les niveaux gratuits de Sanity, Clerk et Neon sur le plan Pro de Vercel coûte environ 240 $/an en coûts fixes. La vraie différence de coût est le temps du développeur : une pile headless nécessite plus d'ingénierie initiale.
Est-ce que je perds les avantages SEO en me détournant de WordPress ?
Non -- vous les gagnez probablement. Next.js et Astro produisent tous deux du HTML rapide et analysable. La génération statique signifie que vos pages de cours se chargent plus rapidement que les pages WordPress rendues en PHP, et les scores Core Web Vitals sont généralement meilleurs. Vous devrez implémenter vous-même les données structurées (marquage du schéma de cours), mais c'est quelques lignes de JSON-LD.
Comment gère-t-on les certificats de cours dans une pile headless ?
Générez les certificats PDF côté serveur en utilisant des bibliothèques comme @react-pdf/renderer ou Puppeteer. Stockez le modèle de certificat dans votre CMS, remplissez-le de données d'étudiant et de la date d'achèvement, générez le PDF à la demande ou via une tâche en arrière-plan, et servez-le depuis le stockage en nuage (S3 ou Cloudflare R2). C'est plus de travail que les certificats intégrés de LifterLMS, mais vous avez un contrôle de conception complet.
Qu'en est-il de la conformité SCORM et xAPI ?
Si vous avez besoin de la conformité SCORM (courant dans la formation d'entreprise), vous aurez besoin d'un composant de lecteur SCORM -- SCORM Cloud de Rustici (125 $/mois et plus) est le choix standard. Pour xAPI (Tin Can API), vous pouvez enregistrer les instructions d'apprentissage à un Learning Record Store soit directement depuis votre frontend soit via votre couche API. La plupart des exigences LMS d'entreprise modernes penchent vers xAPI en 2026.
Est-ce que les instructeurs non techniques peuvent créer des cours dans un CMS headless ?
Absolument. C'est l'un des avantages clés des outils comme Sanity Studio et du panneau d'administration de Strapi. Vous définissez le modèle de contenu (cours → modules → leçons), et les instructeurs obtiennent une interface d'édition propre et ciblée. C'est souvent plus simple que WordPress car il n'y a pas de tentation d'installer des plugins aléatoires ou de casser des mises en page avec l'éditeur de blocs. Vous concevez exactement l'expérience d'édition dont vos instructeurs ont besoin.
Comment cela se compare-t-il aux plateformes SaaS comme Teachable ou Thinkific ?
Les plateformes SaaS sont excellentes pour la rapidité de mise sur le marché mais terribles pour la personnalisation et l'économie à long terme. Teachable prélève des frais de transaction de 5 % sur leur plan de base et limite considérablement vos options de conception. Une pile headless coûte plus de temps de développement mais vous donne la propriété complète de votre plate-forme, vos données et vos relations avec les étudiants. Si vous prévoyez de générer plus de 5 000 $/mois de revenus de cours, l'économie favorise une pile personnalisée dans la première année.
Quel est le plus grand risque de la construction d'un LMS headless ?
La dérive du périmètre. Les fonctionnalités LMS sont trompeusement complexes -- diffusion de contenu, chaînes de prérequis, inscriptions de groupe, tableaux de bord d'instructeurs, analyses, séquences d'e-mail. Si vous essayez de répliquer chaque fonction LifterLMS avant de lancer, vous brûlerez votre budget. Commencez par la boucle centrale (parcourir les cours → s'inscrire → consommer les leçons → suivre la progression), lancez avec cela, et ajoutez des fonctionnalités en fonction des commentaires réels des étudiants. La beauté de l'architecture composable est que vous pouvez ajouter des pièces de manière incrémentielle.