Danny Kukic
    • EasyPointmentOnline booking for clinics.
    • PillRemindA medication alarm for Android.
    • Toivoa TassuilleCanine massage & laser therapy.
    • Kennel UnlockSpringer Spaniel breeders.
← Projects
Case study
Easy Pointment

Booking software that
runs itself

Online booking, automated reminders and post-visit follow-ups for clinics. I designed and built the whole thing, from the booking page to the scheduler that sends the reminders.

6services2languages2026built
Today's schedule 08:52
SK
Sarah Klein09:00
Pending
MR
Marc Reuter10:30
Pending
AL
Anna Lange11:15
Pending

Nobody has this page open. The scheduler wakes on its own, works through what is due, and moves each appointment on.

What it is

What a clinic gets

Each clinic gets its own booking link, its own opening hours and its own list of services. Clients pick a slot without phoning anyone, the confirmation goes out immediately, and the reminder goes out two days before. After the visit, a follow-up sequence asks for a review and invites a rebooking. I wrote every layer of that, the interface, the API, the database and the jobs that run between them.

The public booking page
The booking page, showing available time slots for a chosen service
The spine

Why it needed a back end

This is the only one of my projects that is a system rather than a site. The back end exists because of four things that cannot happen in a browser.

01

A free slot has to be computed

The opening hours for that weekday, the days the clinic is closed, how long the chosen service takes, and every appointment already on the books. A free slot is what is left after all four, and it is only correct if the server works it out.

02

A reminder fires two days before the appointment

That cannot live in a browser tab. A scheduler wakes on its own, hands the work to a queue, and a worker sends it. A send can fail with no one watching it, so failures are retried.

03

An appointment's status moves on its own

Pending, reminded, confirmed, completed. Every transition is written to a history table as it happens, so the record of what the system did outlives the session that started it.

04

Every clinic has to be sealed off from the others

One deployment serves many clinics, each with its own link, services and hours. Every protected request resolves which clinic the caller owns and scopes the query to it. Getting that wrong would leak one clinic's patient list into another's dashboard.

Dashboard, appointments
The dashboard appointment list, showing bookings with their current status
In production

What actually runs

Six containers. The Nuxt front end proxies to the API rather than calling it from the browser, so the session cookie never leaves the server. Postgres holds the data and Redis is the queue, with two Celery processes behind it, a worker that sends and a scheduler that decides when. Nothing starts until whatever it depends on reports healthy.

Browser
▼
Nuxt 4 · frontend
▼
FastAPI · backend
▼
PostgreSQL
Redis
▼
Celery worker
Celery beat
Dashboard, calendar
The dashboard calendar, showing a month of appointments across the clinic's opening days
Upkeep

Migrations, tests and rate limits

Schema changes go through migrations rather than being applied by hand, so the database can be rebuilt from nothing and arrive in the same place. Ten test suites cover the routes, the slot generation, the scheduling and the rate limits, with component and composable tests on the front end. The public endpoints sit behind rate limiting, because anyone on the internet can reach a booking form.

The stack

  • Nuxt 4
  • Vue 3
  • TypeScript
  • Tailwind 4
  • PrimeVue
  • Firebase Auth
  • FastAPI
  • Python
  • SQLAlchemy
  • Alembic
  • PostgreSQL
  • Redis
  • Celery
  • Docker

That list includes PrimeVue, which this page does not use. The components you're looking at are rebuilt by hand in Tailwind. Carrying a whole component library here to draw six cards would be a strange trade.

Dashboard, analytics
The dashboard analytics view, showing booking volume and returning clients over time

So why can't you buy it?

Because the next step is legal, not technical. Handling other clinics' patient data means contracts and data processing agreements, and that is a lawyer's job rather than a weekend's. The software is deployed and running. The paperwork is the missing part.

Deployed, and parked on purpose.

Role

Design and build, front to back

Live at

easypointment.com

Year

2026

EasyPointmentBooking, reminders and follow-ups for clinics.
Next project: PillRemind →

© 2026 Danny Kukic

ImprintPrivacy Policy