Overview
A production-grade real-time multiplayer quiz platform built as a multi-tenant architecture, designed to handle 100+ concurrent users across multiple simultaneous game rooms. Currently running two production sites:
- PistolQuiz (general knowledge: culture, science, history, sports)
- FreestyleQuiz (freestyle football trivia: battles, events, champions, legends)
Une plateforme de quiz multijoueur en temps réel de qualité production construite sur une architecture multi-tenant, conçue pour gérer 100+ utilisateurs simultanés répartis sur plusieurs salles de jeu en parallèle. Deux sites de production sont actuellement en ligne :
- PistolQuiz (culture générale : culture, science, histoire, sport)
- FreestyleQuiz (trivia freestyle football : battles, événements, champions, légendes)
Production Architecture
Scalability & Performance
The system is built for production workloads with a focus on low-latency, high-concurrency real-time communication:- Socket.IO WebSockets with sub-100ms event delivery across all connected clients
- Event-driven game engine processing buzz events, answer submissions, and state transitions with zero blocking I/O
- In-memory game state for instant read/write (no database round-trips during gameplay)
- Per-room isolation ensures game logic is independent, allowing 20+ rooms running simultaneously
- Graceful shutdown with full timer cleanup, socket disconnection, and state persistence
Infrastructure
| Component | Technology | Role |
|---|---|---|
| Frontend CDN | Vercel + Cloudflare | Global edge caching, SSL termination, DDoS protection |
| Backend | Hetzner VPS (Node.js) | WebSocket server, game engine, JWT auth |
| Process Manager | PM2 | Auto-restart, log management, zero-downtime reloads |
| CI/CD | GitHub Actions | Automated lint, type-check, build, and test pipeline |
| Monitoring | Custom /stats endpoint | Real-time room count, player count, memory usage |
Security
- JWT authentication with per-room scoped tokens and host privilege escalation
- Server-side state authority prevents client-side tampering (scores, answers, timers all server-authoritative)
- Sanitized spectator data strips all answer fields before broadcasting to spectators
- Rate limiting on all socket events with IP-based throttling
- Input validation with XSS sanitization via DOMPurify on all user inputs
- CORS whitelisting per-site with origin validation
Multi-Tenant Architecture
A single codebase serves multiple quiz brands with full isolation:- Site resolution via HTTP Origin or X-Site-ID header on every request
- Per-site configuration: timers, categories, themes, branding, SEO metadata, OG images
- Shared game logic with site-specific data directories (questions, assets)
- Dynamic asset pipeline: prebuild script generates site-specific index.html, copies branded assets
Real-Time Features
- Reconnection resilience: 30s grace period with cancellable forfeit timers, auto-reconnect with exponential backoff
- Fuzzy answer matching: Levenshtein distance + Jaro-Winkler similarity with adaptive thresholds based on answer length
- Live spectator mode: Real-time game viewing with server-side answer sanitization
- Bilingual support: Full French/English i18n with 346 translation keys
Scalabilité & Performance
Le système est conçu pour des charges de production avec un accent sur la communication temps réel à faible latence et haute concurrence :- Socket.IO WebSockets avec une livraison des événements en moins de 100ms à tous les clients connectés
- Moteur de jeu événementiel traitant les événements de buzz, les soumissions de réponses et les transitions d'état sans aucune I/O bloquante
- État de jeu en mémoire pour des lectures/écritures instantanées (aucun aller-retour base de données pendant le gameplay)
- Isolation par salle garantissant une logique de jeu indépendante, permettant 20+ salles simultanées
- Arrêt gracieux avec nettoyage complet des timers, déconnexion des sockets et persistance de l'état
Infrastructure
| Composant | Technologie | Rôle |
|---|---|---|
| CDN Frontend | Vercel + Cloudflare | Cache en edge global, terminaison SSL, protection DDoS |
| Backend | Hetzner VPS (Node.js) | Serveur WebSocket, moteur de jeu, auth JWT |
| Gestionnaire de Processus | PM2 | Redémarrage automatique, gestion des logs, rechargement sans interruption |
| CI/CD | GitHub Actions | Pipeline automatisé de lint, vérification de types, build et tests |
| Monitoring | Endpoint /stats personnalisé | Nombre de salles, de joueurs et utilisation mémoire en temps réel |
Sécurité
- Authentification JWT avec tokens scopés par salle et élévation de privilèges hôte
- Autorité d'état côté serveur empêchant toute altération côté client (scores, réponses, timers entièrement gérés par le serveur)
- Données spectateur nettoyées supprimant tous les champs de réponse avant diffusion aux spectateurs
- Rate limiting sur tous les événements socket avec throttling basé sur l'IP
- Validation des entrées avec sanitisation XSS via DOMPurify sur toutes les saisies utilisateur
- Liste blanche CORS par site avec validation d'origine
Architecture Multi-Tenant
Un seul codebase dessert plusieurs marques de quiz avec une isolation complète :- Résolution du site via l'Origin HTTP ou le header X-Site-ID sur chaque requête
- Configuration par site : timers, catégories, thèmes, branding, métadonnées SEO, images OG
- Logique de jeu partagée avec répertoires de données spécifiques par site (questions, assets)
- Pipeline d'assets dynamique : le script prebuild génère un index.html spécifique au site et copie les assets de marque
Fonctionnalités Temps Réel
- Résilience à la reconnexion : période de grâce de 30s avec timers de forfait annulables, reconnexion automatique avec backoff exponentiel
- Correspondance floue des réponses : distance de Levenshtein + similarité de Jaro-Winkler avec seuils adaptatifs basés sur la longueur de la réponse
- Mode spectateur en direct : visionnage du jeu en temps réel avec sanitisation des réponses côté serveur
- Support bilingue : i18n complète français/anglais avec 346 clés de traduction
Tech Stack
| Layer | Technologies |
|---|---|
| Frontend | React 18, TypeScript, Vite, Tailwind CSS, Framer Motion, Zustand, i18next |
| Backend | Node.js, Express, Socket.IO, JWT, Zod |
| Infrastructure | Vercel, Cloudflare, Hetzner VPS, PM2, Docker |
| CI/CD | GitHub Actions (lint, build, test) |
| Testing | Jest (unit), Playwright (E2E) |
| Security | Helmet, CORS, DOMPurify, rate limiting, JWT |
| Couche | Technologies |
|---|---|
| Frontend | React 18, TypeScript, Vite, Tailwind CSS, Framer Motion, Zustand, i18next |
| Backend | Node.js, Express, Socket.IO, JWT, Zod |
| Infrastructure | Vercel, Cloudflare, Hetzner VPS, PM2, Docker |
| CI/CD | GitHub Actions (lint, build, test) |
| Tests | Jest (unitaires), Playwright (E2E) |
| Sécurité | Helmet, CORS, DOMPurify, rate limiting, JWT |
