Frontend: ScoreBoard component (live per-player scores)
Frontend: GameFinished screen
game:answer WS handler — collect answers
Answer evaluation + broadcast results
Game finished: broadcast results, update DB
Frontend: multiplayer game route
Frontend: WS client singleton with reconnect
GameService: question sequence + server timer
lobby:start WS handler — broadcast first question
WS event Zod schemas in packages/shared
Frontend: lobby browser + create/join lobby
Frontend: lobby view (player list, code, start game)
WS message router: dispatch by type
Lobby join/leave handlers + broadcast lobby state
Lobby state in Valkey (ephemeral) + PostgreSQL (durable)
LobbyService: create lobby, join lobby, enforce player limit
WebSocket server: attach ws upgrade to Express
WS auth middleware: validate session on upgrade
Favicon, page titles, Open Graph meta
Drizzle schema: lobbies, lobby_players + migration