Offline Quiz Buzzer System — a plug-and-play desktop app for quiz competitions.
Zenith Buzzer is an offline-first desktop application built for live quiz competitions. The host runs the app on their laptop, and players join from their phones via the local Wi-Fi network — no internet required.
The admin controls rounds, buzzer timing, and scoring from a sleek dashboard, while players get a mobile-optimized buzzer page with real-time feedback.
| Feature | Description |
|---|---|
| Offline-First | Works entirely over local Wi-Fi — zero internet dependency |
| QR Code Join | Players scan a QR code to join instantly from any phone browser |
| Real-Time Buzzing | Sub-50ms latency buzz detection with millisecond-accurate rankings |
| Round Management | Open, close, reset, and advance rounds from the admin panel |
| Live Rankings | Automatic 1st/2nd/3rd placement with live leaderboard |
| Timer | Built-in countdown timer with configurable duration |
| Sound Effects | Audio cues for round start, buzzes, and timer end (toggleable) |
| Name Change Requests | Players can request team name changes; admin approves/denies |
| Lock Joins | Lock the lobby to prevent new players mid-round |
| Data Export | Export results as CSV or JSON |
| Branded UI | ZENITH'26 dark gold/bronze theme with SVG iconography |
Run the app to see the full UI. Admin panel features a dark theme with gold accents, round controls, timer, rankings, and player management.
- Desktop Shell — Electron v40
- Server — Express + Socket.IO v4
- Styling — Tailwind CSS v4
- QR Generation — qrcode
- Build — electron-builder
- Node.js v18+ and npm
git clone https://github.com/Mohammed-Asfar/zenith-buzzer.git
cd zenith-buzzer
npm installnpm run startThis builds the CSS and launches the Electron app. The admin panel opens automatically. Players can join by scanning the QR code or navigating to the displayed URL on the same Wi-Fi network.
npm run buildOutputs a Windows installer to dist/. Requires Developer Mode enabled or an elevated terminal for code signing symlinks.
zenith-buzzer/
├── build/ # Build resources (icon.ico, icon.png)
├── src/
│ ├── admin/ # Admin panel (HTML, CSS, JS)
│ │ ├── index.html # Admin dashboard UI
│ │ ├── admin.css # Source styles (Tailwind)
│ │ ├── admin.js # Admin logic & Socket.IO handlers
│ │ └── dist/ # Compiled CSS output
│ ├── assets/ # Shared assets (logo, icons)
│ ├── main/ # Electron main process
│ │ ├── main.js # App entry point & window creation
│ │ ├── server.js # Express + Socket.IO server
│ │ ├── preload.js # Context bridge (IPC)
│ │ ├── network.js # LAN IP detection
│ │ └── export.js # CSV/JSON export logic
│ ├── player/ # Player mobile interface
│ │ ├── index.html # Buzzer page UI
│ │ ├── player.css # Source styles (Tailwind)
│ │ ├── player.js # Player logic & Socket.IO handlers
│ │ └── dist/ # Compiled CSS output
│ └── shared/
│ └── events.js # Shared Socket.IO event constants
└── package.json
┌─────────────────┐ Wi-Fi LAN ┌──────────────────┐
│ Admin Panel │◄──── Socket.IO ────────► │ Express Server │
│ (Electron) │ │ (port 3000) │
└─────────────────┘ └────────┬─────────┘
│
Socket.IO
│
┌──────────────┼──────────────┐
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ Player 1 │ │ Player 2 │ │ Player N │
│ (Phone) │ │ (Phone) │ │ (Phone) │
└─────────┘ └─────────┘ └─────────┘
- The Electron app starts an Express + Socket.IO server on the local network
- Players join by scanning a QR code or entering the URL in their phone browser
- The admin opens/closes buzzer rounds from the dashboard
- Players tap the buzzer — the server ranks them by timestamp
- Results are displayed live on both admin and player screens
| Command | Description |
|---|---|
npm run start |
Build CSS + launch Electron app |
npm run dev |
Launch Electron without CSS build |
npm run build |
Build CSS + package as Windows installer |
npm run build:css |
Build admin + player CSS |
npm run watch:css:admin |
Watch & rebuild admin CSS |
npm run watch:css:player |
Watch & rebuild player CSS |
MIT — Made for ZENITH'26
