Clinic appointment platform
A two-sided scheduling platform where patients book and reschedule from their phone, clinics run their calendar and doctor schedules, and cancelled slots are refilled from the waitlist within minutes.
Whose need
For a clinic, the most expensive thing is an empty slot. Patients cancel at the last minute or simply don't show up; the front desk calls down a list one by one, and the time usually goes to waste. Meanwhile, other patients are waiting for an earlier appointment and never hear that one just opened. On the patient side, booking, remembering and rescheduling still mean phone calls and hold music.
What I built
I designed Gapless as a two-sided product. In the mobile app, patients book in three taps, confirm a reminder with one tap or move their appointment to another time. On the clinic side there's a desktop panel: doctors as columns, appointments as blocks, and every cancelled slot shows up as a visible gap in the calendar. The moment a slot opens, Gapless ranks matching patients from the waitlist, sends them an offer, gives the slot to the first who accepts and closes the gap on the calendar. With auto-fill on, it does this for the whole day on its own. Doctor schedules, time off and extra reminders for appointments likely to be missed live in the same panel.
The flow
- The patient picks a visit type and the first available time, and books in three taps.
- Reminders arrive 48 and 2 hours before; the patient confirms with one tap or moves to another time.
- A cancelled or released slot appears as an open gap on the calendar and goes to the waitlist.
- Gapless sends offers to matching patients; the first to tap "Take it" gets the slot, and the gap closes on the panel instantly.
- The clinic manages doctor schedules and time off, nudges at-risk appointments, and sees the day's fill rate on one screen.
Key decisions
A slot is never given to two people
Conflict checking lives in the database, not in application code: appointments are stored as time ranges in Postgres, and an exclusion constraint makes overlaps impossible. If two patients tap "Take it" in the same second, one wins and the other sees the next slot.
A cancellation is an event with a workflow behind it
The moment a slot opens, an offer workflow starts on Temporal: offers go out in waves, each is held for 10 minutes, and when time runs out it moves to the next patient. Reminders run on the same durable timers, so none are lost when a server restarts.
Patients and the clinic look at the same calendar
The Expo mobile app and the Next.js panel share the same schemas, and every change reaches every screen within the same second over WebSockets. Sync with clinic systems uses FHIR R4 Schedule, Slot and Appointment resources.
Notifications say only what they need to
Push and SMS carry just the time and the clinic name, never health details; the specifics live inside the app, visible to the signed-in patient. In the interface, color means exactly two things: aqua "this slot is open", red "this slot was refilled".
Technology
- Expo
- React Native
- Next.js 16
- TypeScript
- Postgres
- Temporal
- WebSockets
- Twilio
- FHIR R4
Screens
Related serviceFull-stack apps and automation
Need something similar?
Tell me in a few sentences what you want to build.
Start a project