03 / Real-time

RITPulse

Quizzes, polls and Q&A for a whole lecture hall, live on every phone.

RIT Pulse lets a teacher run a live quiz, poll or Q&A with a room full of students. They join with a six-digit code, and the server keeps every phone on the same countdown, even if the host's browser closes.

Case file

Role
Sole developer
Built
August 2026
Capacity
Up to 1,000 players a session
Stack
Next.js 16, Convex, Better Auth, Turborepo
RIT Pulse home page: ask the hall, watch it answer

01

The idea

Ask the hall, watch it answer

A teacher opens a session, students join from their phones with a six-digit code and a nickname, and answers land on the projector as they come in. There are two modes: a scored quiz and an open Q&A floor.

  • Seven question types: four graded ones, plus polls, word clouds and rating scales.
  • The host can add a question mid-session, remove a player, or open, close and spotlight the Q&A floor.
  • Guests reconnect with a saved token, so a dropped phone doesn't lose its score.
  • AI can draft questions through Gemini, OpenRouter or a local Ollama model, rate-limited to 20 calls per 10 minutes.

02

The hard part

Every phone on the same deadline

A countdown that runs in the host's browser dies when that tab closes, and every phone's clock is slightly wrong. So the server owns time.

  • Each question stores an absolute end time. A Convex scheduled job closes it at the deadline plus a 1.2-second grace, whether or not the host is still connected.
  • Stale jobs check they still own the question before they act, so a skipped or restarted question can't be closed twice.
  • Phones sync to a /clock endpoint: five samples, keep the fastest round trip, re-sync every 60 seconds and whenever the tab comes back into view.

03

Designed for a full hall

The read that grows with the square of the room

Each player's live view re-runs whenever a document it read changes, and every answer changes one player's row. With N players each re-reading all N players, a 300-player room costs about 300 × 300 = 90,000 reads per question.

  • While a question is open, the player view skips the roster and reads a stored participant count instead.
  • Answer keys stay on the server until the reveal, answer timing is checked on the server, and speed scoring falls from full points to half at the buzzer.
  • Questions are copied into the session when it starts, so editing the quiz mid-run can't change what players see.
tables
7tables
pages
8pages

Built with

  • Next.js 16
  • React 19
  • Convex
  • Better Auth
  • Tailwind CSS 4
  • Turborepo
  • TypeScript
  • Gemini

next case file

HackFinity 3.0

I co-organised the hackathon, then built the app that judged it.

Read it