⌨️ Type Race
Race to type a PHP snippet first. Progress, WPM, and countdown all live-update for every racer — no client logic.
waiting → countdown → racing → done. All transitions happen server-side; the client just sends keystrokes.Waiting for racers…
Click Start Race when everyone's ready. Open this page in another tab to race yourself!
⚡ Signals
username
string SESSION Racer handle, auto-assigned. Persists across tabs.
typedText
string TAB Current textarea value. Sent to server on every input event; never broadcast.
raceStatus
string Custom race scope "waiting" | "countdown" | "racing" | "done". Controls which UI panel renders.
countdown
int Custom race scope 3…2…1 before start. Broadcast each tick.
🎯 Actions
updateProgress
Called on every input event. Server counts correct leading chars, updates this racer's progress and WPM, broadcasts to race scope.
joinRace
Joins the current open race (or creates one). Starts countdown timer when MIN_RACERS reached.
👁 Views
type_race.html.twig
Lobby, countdown overlay, racing textarea + progress bars, and results podium. All driven by raceStatus signal.