Skip to content
App Crafters
All projects

Our own tool · Diagnostic imaging · 2025

The scanner is the bottleneck, not the doctor

Your practice software gives every doctor a calendar, but the thing you run out of is the scanner - and an unsold scanner hour cannot be sold later. This is the scheduler that books against the machine, and refills a cancellation from the waitlist without anyone phoning a list.

5

Constraints checked together per appointment: practitioner, specialty, room, device, turnaround

  • Next.js
  • TypeScript
  • Postgres
  • Flutter
  • Viber

Try it here

This is the same code that runs on the sector page, not a recording of it. Put your own numbers in.

  1. Pick a procedure and click a free slot to book it.
  2. Click a booking to pick it up, then drop it in another slot.
  3. Pick a booking up and cancel it - watch the waitlist fill the gap.

0/3

clinic-schedulerinteractive

Real constraint checking, running in your browser. No patient data of any kind - the names are invented and nothing you do here is sent anywhere or stored.

The numbers

1
Solver called from everywhere, because two validators is how a double booking happens
6
Resources on one board: three practitioners, two rooms, one shared scanner

The problem

The practice software models one calendar per practitioner, which is the wrong model for a diagnostic centre: the constraint is the scanner, shared across sites, with a turnaround window between patients.

So the real schedule migrated into spreadsheets and a WhatsApp group, double bookings were caught by reception rather than by software, and a cancelled scan hour was simply lost because nobody had time to phone down a waitlist.

What we did

  1. One solver, called from everywhere. The constraints - practitioner, specialty, room, device, turnaround - are checked together and in a fixed order, and the same function answers the public booking page, the reception screen and the API. Two validators is how a double booking happens.

  2. The refusal names the collision. "Both rooms are occupied" and "the ultrasound is still in turnaround" are different problems with different fixes, and a receptionist who is told which one it is does not phone a manager.

  3. Waitlist backfill runs the moment a slot frees, matching on procedure and specialty rather than on order of arrival alone. This is the feature with the clearest commercial case in the entire build, because an unsold scanner hour cannot be sold later.

  4. Deliberately left alone: the patient record and the prescribing. Those stayed in the existing practice software, which handles them adequately, and the scheduler reads what it needs rather than becoming a second record system.

Where it got to

The scheduler on the clinic page is this solver, running in your browser, with no patient data of any kind in it. The refusals you get are the refusals reception gets, worded the same way.

A worked example

The scheduler on the clinic page is this solver. Every refusal names the constraint, because that is what reception can act on:

Practitioner time booked at the start of the day
21%
Ultrasound at 11:00
in turnaround
Ultrasound with Dr Vlachou, 2 slots
she is with another patient
Cancel the 09:00
waitlist refills it
Slot recovered
automatically

The refill is where the commercial case sits: an unsold scanner hour cannot be sold later, and nobody has time to phone down a list mid-clinic.

Try it here

Want something like this for your business?

A 20-minute call with the two people who would build it. You tell us what you need; we tell you whether it is worth building and roughly what it costs.

The full page: Clinics & diagnostics
Book a call