Korum est une application de quiz live pensée pour l’enseignement. Son objectif n’est pas seulement de faire répondre vite, mais de rendre visible la compréhension du groupe et de favoriser l’apprentissage entre pairs quand une notion bloque.
Le projet contient une interface enseignant, une interface participant mobile, un mode live projeté, une logique de peer learning, une gestion des quiz/questions et une synchronisation temps réel via WebSocket.
Korum repose sur un cycle simple :
- L’enseignant crée un quiz composé de questions à choix multiples.
- Les participants rejoignent une session live avec un token ou un QR code.
- La question s’affiche sur l’écran enseignant, puis les réponses apparaissent après un court délai.
- Les participants répondent sur leur appareil.
- Si la majorité réussit, les scores sont affichés et le live passe à la question suivante.
- Si la classe bloque, Korum lance une phase de peer learning : un participant ayant compris peut expliquer, puis le groupe vote/repond a nouveau.
L’idée est de passer d’un quiz purement compétitif à un outil de diagnostic collectif et d’entraide.
- Authentification enseignant avec JWT.
- Gestion des utilisateurs.
- Création, édition et soft delete des quiz.
- Création, édition, soft delete et tri manuel des questions.
- Questions avec 2 à 8 réponses possibles.
- Plusieurs bonnes réponses par question.
- Temps de réponse configurable par question.
- Option de mélange des réponses par quiz, y compris lors d’une seconde tentative en live.
- Sessions live cloisonnees par ID unique et token court.
- Page
/joinpour rejoindre rapidement une session avec un token. - QR code SVG affiche dans le live enseignant.
- Interface enseignant projetable, avec lobby, plein écran, thèmes jour/nuit et compteur de participants.
- Interface participant adaptée mobile.
- Synchronisation temps réel avec Socket.io.
- Scores progressifs, podium final et animations.
- Tutoriel integre dans l espace enseignant avec option "ne plus afficher".
Korum/
backend/ API Express, Socket.io, PostgreSQL, auth JWT
frontend/ Vue 3, Vite, Pinia, Tailwind CSS
doc/ Cahier des charges initial
docker-compose.yml
.env.template
- Vue 3
- Vite
- Vue Router
- Pinia
- Tailwind CSS
- lucide-vue-next pour les icônes
- qrcode pour la génération de QR SVG
- socket.io-client pour le live
- Node.js
- Express
- Socket.io
- PostgreSQL via
pg - JWT et bcryptjs
- Swagger UI
- Winston pour les logs
Les tables principales sont :
users: comptes enseignants et utilisateurs applicatifs.projects: quiz.exercises: questions du quiz.quiz_sessions: sessions live.answers: réponses historiques des participants.comprehension_votes: votes de compréhension en peer learning.
Les suppressions de quiz et de questions sont faites en soft delete via deleted_at, afin de conserver l’historique des sessions et des réponses.
- Docker Desktop
- Docker Compose
Pour un lancement hors Docker :
- Node.js 22 ou compatible
- PostgreSQL 15 ou compatible
- Copier le fichier d environnement :
cp .env.template .envSous PowerShell :
Copy-Item .env.template .env- Lancer l application :
docker compose up --build- Ouvrir l application :
- Frontend : http://localhost:5180
- API : http://localhost:3100/api
- Swagger : http://localhost:3100/api/docs
- PostgreSQL exposé sur l’hôte :
localhost:55432
Un compte enseignant est créé automatiquement par le schéma de base.
- Email :
enseignant@korum.local - Mot de passe :
korum-demo
Voir .env.template.
Variables principales :
PORT: port HTTP du backend, par defaut3100.DATABASE_URL: URL PostgreSQL.JWT_SECRET: secret de signature JWT.JWT_EXPIRES_IN: durée de validité du token.FRONTEND_ORIGIN: origine autorisée par CORS.VITE_API_URL: URL de l’API utilisée par le frontend.VITE_SOCKET_URL: URL Socket.io utilisée par le frontend.
Dans Docker Compose, les ports actuels sont :
- Frontend :
5180 - Backend :
3100 - PostgreSQL :
55432côté hôte,5432côté conteneur
- Aller sur http://localhost:5180.
- Se connecter avec le compte enseignant.
- Créer un quiz ou ouvrir un quiz existant.
- Configurer le titre, la description et le mélange des réponses.
- Ajouter des questions, régler leur temps et cocher une ou plusieurs bonnes réponses.
- Reordonner les questions par glisser-deposer si necessaire.
- Lancer le live.
- Depuis un autre appareil ou onglet, aller sur
/joinet saisir le token affiche. - Répondre aux questions côté participant.
- Observer les phases côté enseignant : lobby, question, résultats, peer learning, podium final.
Le live est pilote par Socket.io.
Chaque session live possede :
- un ID UUID interne ;
- un token court de jointure ;
- une room Socket.io dediee ;
- son etat live courant ;
- sa liste de participants ;
- ses réponses par round.
Les sessions sont cloisonnées : les événements reçus côté frontend sont ignorés s’ils ne correspondent pas à la session active.
Phases principales :
lobby: attente des participants.question: affichage de la question et collecte des réponses.results: scores et synthese.peer-learning: explication par un participant choisi.peer-vote: seconde tentative apres explication.teacher-help: reprise par l’enseignant si la compréhension reste insuffisante.finished: podium final.
- Impossible de démarrer une question sans participant.
- Le QR code et le token permettent de rejoindre une session en cours.
- Les réponses peuvent être mélangées dans un même live, notamment entre tentative initiale et peer learning.
- Les questions archivées ne sont plus proposées dans les nouveaux lives.
- Les projets archivés ne sont plus visibles ni lançables.
- Les anciennes réponses restent conservées pour l’historique.
docker compose up --build
docker compose up --build -d backend frontend
docker compose logs --tail=100 backend
docker compose logs --tail=100 frontend
docker compose downDepuis backend/ :
npm install
npm run dev
npm run start
npm run lint
npm run formatDepuis frontend/ :
npm install
npm run dev
npm run build
npm run lint
npm run formatLe projet est prêt pour un déploiement Node.js sur une plateforme PaaS de type Heroku, Render ou Scalingo.
Le mode PaaS prévu est un déploiement en une seule application :
- le frontend Vue est compilé avec Vite ;
- le backend Express démarre le serveur HTTP ;
- Express sert les fichiers statiques du frontend depuis
frontend/disten production ; - les appels API utilisent
/api; - Socket.io utilise l’origine courante du navigateur.
Les fichiers racine utiles au déploiement sont :
package.json: scripts de build et de démarrage depuis la racine ;Procfile: commandeweb: npm startpour les plateformes compatibles Heroku ;backend/src/app.js: service du frontend statique enNODE_ENV=production.
Le backend utilise aussi SSL pour PostgreSQL en production, ce qui convient aux bases managées de type Heroku Postgres.
Variables minimales :
NODE_ENV=production
DATABASE_URL=<url PostgreSQL fournie par la plateforme>
JWT_SECRET=<secret long et aléatoire>
JWT_EXPIRES_IN=24h
Variable recommandée si le frontend et le backend ne sont pas servis par la même origine :
FRONTEND_ORIGIN=https://votre-application.example
Dans le cas standard d’une seule application PaaS qui sert à la fois le frontend et le backend, FRONTEND_ORIGIN peut être omise.
Les variables VITE_API_URL et VITE_SOCKET_URL ne sont pas nécessaires pour ce mode, car le frontend utilise par défaut /api et l’origine courante. Elles restent utiles pour un déploiement séparé frontend/backend.
heroku create korum-demo
heroku addons:create heroku-postgresql:essential-0
heroku config:set NODE_ENV=production
heroku config:set JWT_SECRET="un-secret-long-et-aleatoire"
git push heroku mainAu démarrage, le backend exécute le schéma SQL et crée le compte enseignant de démonstration si nécessaire.
Pour vérifier localement le build PaaS sans Docker :
npm run build
NODE_ENV=production DATABASE_URL=postgresql://user:password@localhost:55432/korum_db JWT_SECRET=dev_secret npm startLa documentation Swagger est disponible en local :
http://localhost:3100/api/docs
Routes principales :
/api/auth: connexion et profil./api/users: gestion des utilisateurs./api/projects: quiz./api/exercises: questions./api/sessions: sessions live et réponses./api/health: état de l’API.
Un script de seed existe pour ajouter un vrai quiz de démonstration :
backend/src/db/seed_culture_numerique_ia.sql
Il crée un quiz "Culture numérique et IA" avec des questions prêtes à tester.
Korum est un MVP évolutif. Les fondations sont en place pour tester un usage réel en classe :
- création de quiz ;
- lancement de sessions parallèles ;
- participation mobile ;
- peer learning ;
- historique conservé ;
- ergonomie de base côté enseignant.
Les prochaines améliorations naturelles seraient l’export de résultats, un tableau d’analyse post-session, une meilleure gestion des groupes/classes et des tests automatisés plus complets.
Ce projet est distribué sous licence MIT. Voir le fichier LICENSE.