Back to quest log
✓ CompleteQuest log entry

Meridian

Multi-tenant clinic management SaaS — scheduling, patient records, treatment plans, recalls, and an AI assistant, with clinics isolated by Postgres row-level security and every record read audited.

Meridian — clinic management sign-in screen

The quest

Small practices run on a booking tool, a spreadsheet of patients, a paper recall list, and a receptionist’s memory. Meridian replaces all four with one system — and because it’s patient data, access has to be provable: who could see a record, and who actually did.

Four roles, one login form

Clinic admin

Runs the practice — doctors, staff, schedules, services, pricing, and the audit trail.

Doctor

Sees their own day, records consultations and prescriptions, quotes treatment plans.

Staff

Front desk. Scoped to the doctors the clinic assigns them — or to nobody at all.

Patient

Self-registers from the clinic’s own link, then books and tracks appointments.

Features

Meridian — Front-desk dashboard

Feature 01

Front-desk dashboard

Everything that needs a human today on one screen: unpaid visits, today’s schedule, and recent cancellations. Every cancelled slot carries a “Who wants this slot?” button that pulls matching patients off the waitlist, so a gap becomes a booking instead of lost revenue.

Live updates over Server-Sent Events fed by Postgres LISTEN/NOTIFY

Meridian — Appointments & billing

Feature 02

Appointments & billing

Every booking with its status, fee, and paid state, filterable by status, billing, and doctor, with running counts for pending, completed, cancelled, and no-show visits.

Double-booking blocked by a Postgres exclusion constraint, not just the UI

Meridian — Scheduling & calendar

Feature 03

Scheduling & calendar

Each clinician’s weekly hours and slot length, with date exceptions for leave and closures, projected across a month, week, or day view. Bookable slots come from those hours, not from someone’s memory of them.

FullCalendar over provider schedules and schedule exceptions

Meridian — Patient records

Feature 04

Patient records

The whole record in one place — demographics, emergency contact, treatment plans, allergies, medical conditions, family history, insurance, and consents — including anything since removed, because medical history doesn’t get deleted.

Tenant isolation enforced by Postgres row-level security

Meridian — Treatment plans

Feature 05

Treatment plans

Multi-item quotes a patient can accept, with progress tracked item by item — what was quoted, what’s done, and what it adds up to.

Plan items priced from the clinic’s own service list

Meridian — Recalls & waitlist

Feature 06

Recalls & waitlist

A call list of patients due a check-up, driven by each clinic’s recall interval, alongside a waitlist of patients who want an earlier slot.

Recall interval set per clinic, due date tracked per patient

Meridian — Analytics

Feature 07

Analytics

How the clinic has actually been running: appointments per day, stacked by outcome, for any date range and status.

Recharts over daily aggregates computed in SQL

Meridian — Audit log

Feature 08

Audit log

Every read and every write — who, in which role, did what to which record, and when. Filterable by person, action, and date. The question “who opened this file?” has an answer.

Reads are audited too, not only writes

Meridian — AI clinic assistant

Feature 09

AI clinic assistant

Ask “who has an appointment today?” or “when is Dr. Hayes free?” in plain English. The assistant answers from live clinic data and labels every answer as generated.

Google Gemini with seven read-only tools, rate-limited and capped per clinic per day

Meridian — Patient self-registration

Feature 10

Patient self-registration

Each clinic gets its own public sign-up link. Patients create an account, add address and emergency contact, and can book as soon as they sign in. New clinics onboard themselves the same way.

Rate-limited public endpoints, argon2 password hashing

Engineering highlights

✦ Highlight 01

Isolation in the database, not the ORM

Patients, appointments, consultations, and prescriptions sit behind forced row-level security. Every transaction sets its clinic before it touches a row, and a query that forgets to set one errors out instead of quietly returning nothing — the failure you notice beats the one you don’t.

✦ Highlight 02

No double-booking, ever

A GiST exclusion constraint over each clinician’s time ranges makes overlapping appointments impossible to insert. Two receptionists clicking the same slot at once get one booking and one clear error.

✦ Highlight 03

Realtime on one connection

One Postgres LISTEN connection per server process fans events out in memory to every open browser over Server-Sent Events. A thousand open tabs cost one database connection, not a thousand.

✦ Highlight 04

Email that survives a crash

Reminders are queued in an outbox table and drained by one worker to Brevo. A crash mid-send makes a reminder late, never lost — and the queued payload carries only the patient’s name, clinic, and time: no doctor, service, fee, or reason ever leaves in an email.

Loadout

Frontend
Next.js 16, React 19, TypeScript
UI
Tailwind CSS v4, shadcn/ui, Radix, FullCalendar, Recharts
Data & forms
TanStack Query, React Hook Form + Zod
Backend
Node.js 24, Express 5, Knex
Database
PostgreSQL 18 — row-level security, exclusion constraints, uuidv7
Auth & security
argon2, JWT (jose) in cookies, rate limiting, Helmet
Services
AWS S3, Google Gemini, Brevo

Meridian — multi-tenant clinic management