Playtest feedback round 2:
- blindtest DJ can now be anyone incl. the track's contributor (pickDj only
excludes bots) — no more "immunity" for whoever isn't picked
- blindtest rounds last 90s (longer listen + typing)
- per-player volume slider (persisted), YT player setVolume + origin/enablejsapi
- theme switcher (light/dark/system) on home + room header
- clock sync: clients estimate the server-clock offset (time:sync) so the
countdown is identical across devices (was off by each device's clock skew);
also used for blindtest media sync
Note on duplicates: anti-repeat is per room code (quiz_played) — it works when
you replay in the SAME room, but a new room starts fresh. Verified e2e: two
chained games in one room share 0 questions.
Verified: typecheck 4/4, lint 4/4, 24 server tests, web build; e2e dedup (0
overlap) and clock/DJ behavior.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
From friends playtest feedback:
- blindtest "who added it?" (and mixed): hide the per-player vote status — the
contributor never validates, which gave them away
- blindtest sound: set YT player `origin`/`enablejsapi` (fixes the postMessage
origin warning) and add a per-game "Activer le son" gesture for non-DJ
(browsers block audible autoplay without a user gesture)
- track list: render each player's own tracks from a server-sent, authoritative
blindtest:myTracks event (emitted on submit/remove/reconnect) instead of local
state that desynced on remount — fixes the "3/3 but only 2 shown" case
- quiz: reset the free-answer input between questions (was pre-filled with the
previous answer)
Verified e2e: myTracks emitted on submit + reconnect.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
postgres-js failed to parse DATABASE_URL when the password contained URL-special
characters (@ : / # ...). New createSqlClient(): uses DATABASE_URL if set, else
falls back to PG* env vars (PGHOST/PGUSER/PGPASSWORD/...) which postgres-js reads
directly — password passed verbatim, no URL encoding. docker-compose.prod.yml now
sets PG* for the server instead of an inline DSN.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>