
A full dental clinic SaaS I built solo — multi-tenant NestJS backend, React 19 web app, mobile, and an Electron tray app that auto-imports X-rays. Multi-session billing, insurance claims, queues, and real-time chat, all held together end-to-end.
Built and shipped Dentacares end-to-end — a multi-tenant dental clinic SaaS with 56 backend modules, a React 19 web app, a mobile app, and a desktop companion. The kind of project where the hard part isn't any single feature, it's keeping them all coherent
Designed the multi-session treatment billing engine — splitting a treatment plan's cost across sessions, locking session costs at plan creation, and reserving them against appointments so money couldn't drift between what was quoted and what was charged. Rounding edge cases ate more time than the happy path
Wrote the insurance layer from scratch: companies, plans, per-procedure pricing, patient coverage, and claim lifecycle. Pricing had to fall back cleanly across plan → company → list price without surprising anyone at the front desk
Built an Electron Windows tray app that watches the X-ray sensor's output folder with chokidar and auto-uploads new scans to the right patient and reservation — no manual import step, which is exactly the friction clinics hate
Stood up the infra side too: Redis-backed Bull queues for CSV imports (patients, invoices, expenses), Socket.IO gateways for live chat and notifications, and Sentry + Prometheus so I could actually see what production was doing instead of guessing
Clinics were running on a patchwork of spreadsheets, paper, and separate tools that didn't talk to each other — billing in one place, the patient chart in another, X-rays on a sensor's local disk
Multi-session treatments had no honest way to split cost across visits, so what a patient was quoted and what they were eventually charged would quietly diverge
Insurance was manual and error-prone: no structured plans, no per-procedure pricing, no claim tracking
Importing X-rays meant a staff member manually finding the file and attaching it to the right patient — slow, and easy to attach to the wrong one
Bulk data (patients, invoices, expenses) had to be entered by hand because there was no import path
Built a multi-tenant NestJS backend (56 modules) with branch/organization scoping threaded through everything, serving a React 19 web app, a mobile app, and an Electron desktop tool from one API
Designed the billing engine to lock per-session cost at plan creation and reserve it against reservations, with splitEqually() handling the rounding so totals always reconcile to the cent
Modeled insurance as companies → plans → per-procedure prices → patient coverage → claims, with pricing that falls back across layers predictably
Wrote an Electron tray app that watches the sensor folder with chokidar and posts new scans straight to the matching patient and reservation — the import step just disappears
Added Redis-backed Bull queues for CSV imports with background processing, Socket.IO gateways for live chat and notifications, and wired Sentry + Prometheus so failures and latency are visible instead of inferred
56-module NestJS backend powering web, mobile, and a desktop importer from one API||Multi-session billing engine with session-cost locking and reservation reservations — quoted cost and charged cost stay in sync||Full insurance stack: companies, plans, per-procedure pricing, coverage, and claims with clean price fallback||Electron tray app auto-imports X-rays to the correct patient + reservation with zero manual steps||Redis/Bull import queues, Socket.IO real-time chat & notifications, Sentry + Prometheus observability in production






