Live Buzzer
One tap, a QR code, and an honest answer to who buzzed first
Overview
Live Buzzer is a multiplayer buzzer for real parties. The host creates a session in one tap and shares a QR code. Everyone else joins from their phone with a first name and gets a full-screen buzzer, nothing else. The app ranks who pressed first and that's all it does, with no questions, scores, teams or accounts. The hard part is keeping that ranking honest when one player is on 4G and the other on wifi.
Why I built this
I wanted the buzzin.live buzzer in French, without the points, teams, timers and round modes nobody uses at a party. Stripping all that out left one problem worth solving: making the ranking fair across very uneven connections.
Features
- Latency correction. NTP-style clock sync on the app channel keeps the lowest-RTT sample out of the last eight, never an average. The server also schedules each opening 300 ms in the future, so every phone opens the buzzer at the same moment.
- Session in one tap. The host gets a 4-character code and a QR code, with no form to fill. Players join with a first name. There's no account, password or email, and identity is a random token in localStorage.
- The first buzz doesn't end the round. The list keeps filling behind the winner, each player with their gap, like +0.31 s, so the host can move on to the second player without restarting.
- Hand-written WebSocket server. Node 22 with zero npm dependencies, just node:http, node:crypto, node:sqlite and an RFC 6455 transport written by hand. It falls back to HTTP when the socket is down and sends a full state snapshot on every reconnect.
- Role filtering on the server. A player only ever receives their own buzz and their own rank. The full list stays on the host's console, so it can't leak.