A dental clinic web app: pick a service, a doctor and a time, then share your health details with the clinic before you even arrive.

Dentis is a booking and patient portal for a fictional dental clinic. A patient chooses a service, a doctor and a time in three steps, and keeps their health information in one account so the doctor already knows them when they walk in.
See the duration and price
Only doctors who offer it
Open days and free slots
Rules and overlaps
Starts as processing
Every service shows how long it lasts and what it costs. A side summary follows the patient through all three steps, so they always know what they have chosen so far.

The best appointment is the one where the doctor already knows you. Dentis lets patients share their health details before the visit, not at the front desk.
The account opens with what matters most: the next appointment, how complete the health profile is, and a place for notifications.

A time is stored as minutes from midnight, so 540 is 09:00. A date is a plain string like 2026-11-27, which keeps time zones out of the way.
Only logged-in patients can book, only on weekdays between 09:00 and 18:00, and never today or in the past. The interface hides bad options, the server refuses them.
An appointment keeps its own copy of the price at the moment of booking, so changing a service later never rewrites an old visit.
Allergies, medications and conditions are lists, with notes on top. Each section can be marked complete, and that is what fills the progress bar.
Two appointments must never overlap for the same doctor, even when a 45 minute visit meets a 30 minute slot.
Every appointment stores its start and end in minutes. Before saving, the server looks for any active appointment of that doctor on that day that starts before the new one ends and ends after it starts. Cancelled ones do not count.
Patients, doctors, services and appointments all depend on each other, and the first model I drew did not hold up.
A user can be a patient account or a doctor account, doctors are linked to the services they offer, and an appointment ties patient, doctor and service together.
Dates and times are easy to get wrong, especially around time zones and weekdays.
I stopped passing Date objects around. The date travels as a string and the time as minutes, and the Date object is only used for the weekday check.
Interface and server actions in one codebase, with the booking rules living on the server.
Patients, doctors, services, appointments and health profiles with clear relations and indexes.
Registration and login, with patient and doctor accounts built on top of the user.
Accessible components for the basics, so the time went into the custom look.
Small animations that make the fully rounded interface feel alive.
Dentis is designed straight in code, set in Manrope. Green is the colour most people connect with dentistry, and a warm cream replaces plain white because it is simply nicer to look at. Everything is fully rounded, in the iOS spirit, to make a dental visit feel less clinical.




Minutes from midnight made overlaps a simple comparison, and I finally understand how the Date object behaves.
Hiding a bad option in the interface is a courtesy. Refusing it on the server is the actual rule.
Prisma, React and TypeScript details I used to follow along with are now things I can explain on my own.