A self-hosted, real-time browser quiz game built with React, Node.js, Socket.io, and SQLite.
Create and manage quizzes, then start a game session:
Monitor players joining and start the game:
Join with a username and game code:
Answer questions with the countdown timer:
Rankings update after each question:
- Admin Panel — Create, edit, and manage quizzes with a web UI
- Real-time Gameplay — Socket.io-powered live quiz sessions
- Exponential Scoring — Faster answers earn more points (max 1000)
- Live Leaderboard — Rankings update after each question
- Configurable Timer — Set time limit per quiz
- Unlimited Players — No maximum concurrent participants
- Self-hosted — SQLite database, no external services required
cd server && npm install
cd ../client && npm installcd server
cp .env .env.local
# Edit .env.local if needed (defaults are fine for local development)npm run seedDefault admin credentials: admin / admin
# Terminal 1 — Backend
cd server && npm run dev
# Terminal 2 — Frontend
cd client && npm run dev- Players: http://localhost:5173
- Admin Panel: http://localhost:5173/admin
- Admin logs in at
/admin, creates a quiz, and clicks Play - A 6-character game code is generated and displayed
- Players go to
/, enter the game code and a username - Admin clicks Start Game to begin
- Questions are shown one at a time with a countdown timer
- Players select an answer — faster = more points
- After each question, the correct answer and leaderboard are shown
- Final standings are displayed at the end
Points use exponential decay: 1000 × e^(-3 × time/limit)
| Answer Speed | Points |
|---|---|
| Instant (0s) | 1000 |
| 25% of time | ~472 |
| 50% of time | ~223 |
| 75% of time | ~105 |
| At deadline | ~50 |
- Frontend: React 19 + TypeScript + Vite
- Backend: Node.js + Express + TypeScript
- Real-time: Socket.io
- Database: SQLite (via better-sqlite3)
- Auth: JWT + bcrypt




