PhysioSync — software that speaks a clinician's language.
A practice management platform for physiotherapy clinics, covering the whole arc of care: a patient walks in with a problem, gets assessed, treated over a course of sessions, sent home with exercises, and billed — with the clinical record and the money staying in step the entire way.

- Domain
- Physiotherapy practice management
- Surfaces
- Clinician app, API, admin console
- Core build
- TypeScript · Expo · MySQL
- Status
- Built & audited, pre-launch
Most clinic software is a calendar with a patient list bolted on.
Physiotherapy doesn't fit that shape. A patient isn't a booking — they're a course of care for a specific problem, which might run twelve sessions across six weeks. They might come back a year later with something unrelated, and that has to be a separate story in the same chart.
Progress isn't a feeling, either. It's a measurement: range of motion in degrees, muscle strength on a nought-to-five scale, pain on a numeric rating, and a validated questionnaire score that has to be calculated exactly right or it means nothing.
So the build started from the clinical vocabulary rather than the database. Episodes, not appointments. Assessments with real instruments. Sessions structured the way a physiotherapist already writes their notes.
The design test: could a practising physiotherapist look at a screen and recognise their own workflow, without anyone explaining the software to them first?
One problem, one episode, start to finish.
Every record hangs off a treatment episode — so a patient's frozen shoulder in March and their knee in November are separate stories with separate outcomes, not one undifferentiated pile of visits.
Intake
Demographics, history, allergies, medications, referral source.
Episode
A course of care opens for this specific complaint.
Assessment
Pain mapping, range of motion, strength, special tests, neuro screen.
Sessions
SOAP notes with modalities, exercises and pre/post pain scores.
Home plan
A prescribed exercise programme with a printable handout.
Billing
Per session or drawn down from a prepaid package.
Where the detail actually lives.
Outcome scores, computed not typed
Six standardised instruments are scored by the system from raw answers, then charted across the episode. The scoring maths carries its own unit tests — a mis-scored questionnaire is a clinical error, not a display bug.
Money as integers, always
Every amount is stored in paise as a whole number, never a float. Invoice totals are stored rather than recalculated, so a historical invoice always renders exactly as it was issued.
Packages that can't be over-spent
A prepaid block of sessions is frozen as a snapshot when sold, so later price changes never rewrite what a patient already bought. Consumption runs under a row lock, so two receptionists can't spend the last session twice.
Permissions read live, not from the token
Roles resolve from the database on every request rather than being baked into the login token — so revoking a departing employee's access takes effect immediately, not whenever their session happens to expire.
Slots from real working hours
Availability is generated from each branch's hours with breaks, buffers and leave applied — then the booking itself takes a row lock, so simultaneous bookings can't collide on the same slot.
Subscriptions that survive a race
Clinic subscriptions run through two payment gateways. Activation is idempotent across the client callback, the webhook and the reconcile job — whichever arrives first, the clinic is activated exactly once.
The measures a physiotherapist actually uses
Each of these is a published questionnaire with its own scoring rules. The system implements the maths and plots the result over the course of treatment.
One codebase for the clinic, on every screen it uses.
The clinician app is a single Expo codebase that ships to iOS, Android and the web — a physiotherapist on an iPad at the treatment table and a receptionist on a desktop are running the same build.
Clinician app
The working surface — iOS, Android and web from one codebase.
- Day view: arrived → in treatment → completed
- Patient chart with episodes and history
- Assessment capture with body-region pain map
- SOAP session notes
- Home exercise programme builder
- Invoices, packages and payments
- Progress charts and clinic reports
The API
Where the clinical and commercial rules actually live.
- Thirteen feature modules, ~52 tables
- Row-level clinic scoping throughout
- Permission checks on every route
- PDF handouts and invoices
- Presigned uploads for imaging and media
- Background jobs for expiry and reminders
Admin console
The operator's own back office, outside the clinic paywall.
- Clinic directory and account status
- Subscription payments and refunds
- Pricing plans and coupons
- Admin users with a superadmin tier
- Audit log of platform actions
Every build ships with its own audit.
Before calling anything finished, the codebase was put through a written audit — not a skim of folder names, but tracing each feature from route to controller to service to migration, running the type checker and the full test suite, and verifying every claim against the code itself.
The audit confirmed what the platform was built to guarantee: both apps typecheck clean, the unit suite passes, money handling is exact to the paisa throughout, and concurrency is guarded at the two points where a clinic's data genuinely depends on it — package consumption and slot booking.
That document is a deliverable, not an internal note. When we hand over a platform, the client gets a written account of how it was verified — feature by feature, with the evidence. It's the difference between “trust us, it works” and “here's how we know it works.”
Status: PhysioSync is in final pre-launch hardening ahead of onboarding its first clinics.
Scale of the build
What it's built on
Clinician App
- Expo · React Native · React 19
- expo-router (iOS, Android, web)
- TanStack Query · Zustand
- Secure token storage
- Charts and body-region SVG
- TypeScript throughout
API & Data
- Node.js · TypeScript · Express
- MySQL / MariaDB via Knex migrations
- JWT with server-side session revoke
- Zod validation · ULID ids
- BullMQ + Redis, cron jobs
- PDFKit · S3 presigned uploads
Console & Services
- React 19 + Vite SPA
- Razorpay & PhonePe subscriptions
- WhatsApp exercise sharing
- Email and push notifications
- Jest · Supertest · Playwright
- Helmet · rate limiting
Building software for a profession with its own vocabulary?
Clinics, labs, workshops, practices — the value is in modelling how the work actually happens, not in another appointment table.