The site, end to end — programs, intake, consent, payment, booking.
TL;DR — A SCREENER CAN STOP HERE
Forma Medical Wellness is a live telehealth platform for a New York practice — treatment programs, a rule-based eligibility questionnaire, clinical intake, two-document e-sign consent, Stripe consultation checkout, and an in-app scheduler that creates the Zoom visit. Built 0 → 1, solo, self-hosted on AWS where the HIPAA BAA is free. Live at formamedicalwellness.com — pre-patient-launch pending legal and clinical sign-off.
A real telehealth front door, without enterprise SaaS prices
The client is an ER doctor whose hours change weekly, and his practice needed intake, consent, payment, and scheduling without living inside a clunky EHR — or paying enterprise prices for a “HIPAA-eligible” stack. The app handles PHI, so the host needs a signed BAA: enterprise-only at Vercel and Render, free and self-serve at AWS.
✦ NORTH STAR
“The compliance-and-cost problem was really a hosting problem.”
Treatment programs up front — GLP-1 weight care by generic name, per the client's compliance call.
02 — SOLUTION
Ship fast, then replace the rented parts with owned ones
A visitor browses programs, passes an eligibility questionnaire, completes intake, e-signs two consents, pays the consult fee, and books a Zoom visit — while the clinician sets weekly hours and reviews everything from an admin dashboard. The approach: ship fast, then replace rented parts with owned ones — the EHR calendar became a from-scratch scheduler.
The rule-based eligibility questionnaire, start to finish — no AI, just honest rules.
The same homepage in Korean — one of four languages, cookie-switched, no flash.
The clinician dashboard — intakes, signed consents, and booked visits in one view.
INSIGHTOwn the scheduler“My hours change every week because I'm an ER doctor” — the client's constraint killed the embedded EHR calendar. A from-scratch availability setter + slot picker + Zoom meeting creation replaced it.
INSIGHTBMI is clinician-onlyHeight and weight are collected in intake, but the computed BMI shows only in the admin view — no discouraging on-screen number for the patient.
03 — UNDER THE HOOD
The same screens, flipped over
No AI at runtime — the questionnaire is rule-based and every flow deterministic, which is what a medical intake should be. Toggle any screen below to see the code behind it.
FRONTENDNext.js 15 · React 19 · Tailwind 4
BACKENDSupabase Postgres · Drizzle ORM · Auth.js
INTEGRATIONSStripe · Zoom S2S OAuth · SendGrid
HOSTINGAWS Amplify SSR — free HIPAA BAA
KEY SCREEN A · SCHEDULER
UNDER THE HOOD · THIS EXACT SCREEN
for (const b of blocks) {
const step = b.slotMinutes > 0 ? b.slotMinutes : DEFAULT_SLOT_MINUTES;
for (let t = b.startMin; t + step <= b.endMin; t += step) {
if (taken.has(`${b.date}#${t}`)) continue; // already booked
if (b.date < nowDate || (b.date === nowDate && t <= nowMin)) continue; // past
slots.push({ date: b.date, startMin: t, label: minutesToLabel(t) });
}
}
Availability is stored as a date + minutes-from-midnight in practice time — DST avoided, not fought.
Same screen, both faces — weekly hours in, bookable Zoom visits out.
The booking page verifies the Stripe session server-side before it renders — card data never touches PHI.
Same screen, both faces — pay the consult fee, then pick a slot.
04 — DECISIONS
What I said no to
✕ REJECTEDVercel / Render hostingPHI needs a signed BAA — Enterprise-only there, free and self-serve on AWS via Artifact.
✕ REJECTEDThe embedded EHR calendarCharmHealth's flow was painful for weekly-changing hours — replaced by the in-app scheduler.
✕ REJECTEDDocuSignA timestamped typed-name signature stored in the DB is ESIGN-valid, free, and self-contained — no extra vendor, no extra BAA.
✕ REJECTEDVenmo for medication paymentsProhibited by the platform's AUP and not HIPAA-appropriate — the licensed pharmacy should bill the patient directly. Final call rests with counsel.
A NOTE ON HONESTY
“Every screenshot and recording here uses test accounts only — patient-facing software means real people's health data, and none of it belongs in a portfolio.”
05 — REFLECTION
The expensive bugs live in the boundaries
The expensive bugs lived in the boundaries, not the product code — Amplify quietly withholding env vars from the SSR runtime silently opened the payment gate, and a day went to Wix overriding a DNS record until one “Unassign” click freed it. On a regulated, self-hosted stack: verify the deployed thing, not the local one.