Single Player Viewer
Choose a game, then open it here.
Multiplayer Rooms
Choose a game, create a lobby, or browse open rooms.
Lobby
Multiplayer-Adapter
Recommended structure when game rules and modes change often.
1. Core multiplayer platform
Accounts, login/logout, lobby, room codes, join/leave, reconnect handling, server timers, match history, previous results, PostgreSQL storage, Redis live room state, replay metadata.
2. Game adapter layer
Each game adapter owns settings schema, assets, attempt generation, memorization rules, recall rules, scoring, timing, results formatting, and replay event format.
getDefaultSettings()
validateSettings(settings)
loadAssets(context)
buildAttempt(settings, assets, seed)
startMemPhase(room)
handleMemEvent(room, event)
startRecallPhase(room)
handleRecallEvent(room, event)
scoreAttempt(room)
buildResults(room)
serializeReplay(room)
getClientView(room, playerId)
3. Mode layer inside each game
Examples: names/classic, names/speed, names/team, images/classic, images/category, images/story. New modes should plug into the adapter without rewriting the core backend.
Feedback
Yes — this is the easiest long-term way to keep multiplayer aligned with your intent. It does not automatically make the game 1:1 with single-player, but it makes future rule changes much easier because you update the adapter for that game instead of the entire multiplayer platform.