Queue Cure: Live clinic queue with real-time wait estimates
Replaced paper tokens with a 2-screen live queue — check-in in under 10 seconds, zero page refreshes.
- Expert reviewed
Overview
76% of India's 1.5 million clinics still run on paper token slips. Patients wait 2-3 hours with no idea when they'll be called. Receptionists track the queue from memory. Doctors have no visibility.
I built Queue Cure to give clinics one shared queue state: reception controls it on one screen, patients follow it on a waiting room display or their phone. No shouting token numbers, no refreshing the page, no guessing wait times.
I started by mapping the two users: receptionist (fast check-in, call next, recover from mistakes) and patient (see current token, position, estimated wait).
For real-time sync I chose Socket.io with full queue snapshots on every change. Partial updates risk the two screens disagreeing; a snapshot keeps reception and waiting room identical.
Wait time uses patientsAhead × effectiveAvgMinutes. The average comes from the last 20 completed consultations, falling back to a receptionist-set baseline until enough data exists. That way estimates reflect today's pace, not a hardcoded guess.
Backend: Express + MongoDB Atlas on Render. Frontend: React + Vite on Vercel. I used atomic findOneAndUpdate so two "call next" clicks don't break the queue. Tested live sync by running reception and /waiting
Live app: queue-cure-visshva.vercel.app
- Patient check-in in 1 step (name + Enter, auto token)
- 0 page refreshes: waiting room updates when reception adds or calls a patient
- Wait time switched from receptionist baseline (12 min) to rolling average after 2 completed visits (0.8 min in demo)
- 2 screens stay in sync via Socket.io queue:update events
- Automated smoke tests: 20/20 API and socket checks passed
Stack: React, Express, Socket.io, MongoDB Atlas. GitHub: github.com/visshva-r/Queue-Cure
I would add QR self check-in so reception only handles edge cases, not every patient. Multi-clinic support is half-built in the schema but not exposed in the UI yet.
On Render free tier the backend sleeps when idle, so the first load can take 30-60 seconds. I'd use a paid instance or a keep-alive ping for production clinics.
I'd also add SMS or WhatsApp when a patient is 2 tokens away, and a simple doctor dashboard for daily stats. The core queue logic is solid; the gaps are mostly around scale and notifications.