DB:
- quiz_question gains `lang` ('fr' default) and `active` (true default); migration 0002
- only active questions are served to games (pool filter)
History:
- engine writes a game_history row at game end (modes + ranked results), fire-and-forget
- public GET /api/history/:code lists a room's recent games
- lobby shows a "Parties précédentes" collapsible (date, modes, winner/scores)
Back-office:
- create form has a FR/EN language select; lang stored
- per-question active toggle (PATCH /questions/:id) — disable without deleting;
inactive rows dimmed and labelled
- seeds set lang (opentdb=en, manual/pokemon=fr)
Verified e2e: migration applied; game played → /api/history returns it.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
||
|---|---|---|
| apps | ||
| packages | ||
| .gitignore | ||
| .npmrc | ||
| .prettierignore | ||
| .prettierrc | ||
| ARCHITECTURE.md | ||
| bun.lock | ||
| CLAUDE.md | ||
| docker-compose.yml | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
| turbo.json | ||
NerdWare
Party game web multi-épreuves, ambiance WarioWare, centré culture geek (jeux vidéo, manga, pop culture). Chaque joueur joue sur son propre PC/téléphone, les rooms sont synchronisées en temps réel via Socket.IO.
V1 : Quiz culture + Blindtest (YouTube), mélangeables dans une même partie.
Architecture détaillée :
ARCHITECTURE.md· consignes de dev :CLAUDE.md.
Stack
| Couche | Choix |
|---|---|
| Langage | TypeScript (strict, front + back) |
| Runtime / package manager | Bun |
| Monorepo | Turborepo |
| Backend | Fastify + Socket.IO |
| DB | PostgreSQL + Drizzle ORM (contenu quiz + historique ; rooms en mémoire) |
| Frontend | Vite + React, wouter, Zustand, TanStack Query (back-office) |
| UI | Tailwind v4 + shadcn/ui, Framer Motion, Lucide |
| Audio | YouTube IFrame Player API |
| Avatars | DiceBear (style lorelei), générés en local |
Structure
apps/
web/ Client Vite + React (jeu + back-office)
server/ Fastify + Socket.IO + Drizzle (moteur de jeu autoritaire)
packages/
shared/ Types de domaine + events WS partagés (@nerdware/shared)
ui/ Composants shadcn/ui (@workspace/ui)
Le serveur est autoritaire : timer, scores, ordre des manches et tirage du
DJ sont tranchés côté serveur ; le client n'affiche que l'état reçu. Chaque
épreuve implémente l'interface GameRound (start / submitAnswer / reveal / score) — ajouter un mode = un module, sans toucher à la plomberie.
Démarrer
Prérequis : Bun ≥ 1.3, et Docker pour la base (optionnel — sans DB, le quiz tourne sur une banque en dur).
bun install
# (optionnel) base de données
docker compose up -d
cd apps/server && cp .env.example .env
bun run db:migrate # applique les migrations
bun run db:seed # seed Open Trivia DB (~1 req/5s) + banque FR
cd ../..
# config client
cd apps/web && cp .env.example .env && cd ../..
# tout lancer (Turborepo)
bun run dev
- Client : http://localhost:5173
- Serveur : http://localhost:3001
Crée une room, choisis ton pseudo, partage le lien d'invitation, et lancez une partie (quiz, blindtest ou mixte).
Scripts (racine)
bun run dev # tout en dev
bun run build # build complet
bun run lint # lint
bun run typecheck # type-check
bun run test # tests (bun test)
bun run format # prettier
Serveur (apps/server) : db:generate, db:migrate, db:seed, db:studio.
Modes de jeu
- Quiz — QCM, vrai/faux, et réponse libre (matching tolérant). Bonus de rapidité. Questions issues d'Open Trivia DB (seed) ou du back-office.
- Blindtest — chaque joueur soumet des liens YouTube ; un DJ neutre pilote la lecture, les autres devinent (titre/artiste, qui l'a ajouté, ou mixte). Nécessite ≥ 3 joueurs. Récap des titres + liens en fin de partie.
- Mixte (défaut) — séquence mélangée de manches quiz et blindtest.
Back-office quiz
Page protégée /admin pour écrire des questions manuelles (QCM, vrai/faux,
réponse libre). Définir ADMIN_TOKEN dans apps/server/.env et une DATABASE_URL
valide. Le jeton est demandé à la connexion sur /admin.