Back to projects

Live Buzzer

One tap, a QR code, and an honest answer to who buzzed first

Live Buzzer screenshot

Overview

Live Buzzer is a real-time multiplayer buzzer built for actual 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 does exactly one thing — rank who pressed first — and holds no questions, no scores, no teams and no accounts. The whole engineering problem is doing that honestly when one player is on 4G and the other is on wifi.

Why I Built This

I wanted the buzzer from buzzin.live in French and without the pile of points, teams, timers and round modes nobody ever uses at a party. Stripping it down left exactly one problem worth solving: making the ranking fair across wildly uneven connections.

Features

  • Latency Correction, Not Guesswork — NTP-style clock sync on the app channel keeps the lowest-RTT sample of the last eight (never an average), and the server dates each opening 300 ms in the future — so the fastest thumb wins, not the best connection
  • 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 — no account, no password, no email, identity is a random localStorage token
  • The First Buzz Locks Nobody — The list keeps filling behind the winner, each player with their gap (+0,31 s), so the host can move on to the 2nd without restarting the round
  • Hand-Written WebSocket Server — Node 22 with zero npm dependencies: node:http, node:crypto, node:sqlite and an RFC 6455 transport written by hand, with an HTTP fallback when the socket is down and 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 ordered list never leaves the host's console, so it cannot leak

Tech Stack

Frontend

React 19 TypeScript Tailwind 4 Vite vitest

Backend

Node 22 WebSocket (RFC 6455) node:sqlite Zero npm deps

Infrastructure

Docker Caddy GitHub Actions