What we solved
Physiotherapists, trainers, and clinic admins juggle patient records, exercise libraries, and session plans across paper, spreadsheets, and chat apps. Sharing a prescribed routine usually means screenshots or hand-written notes that go stale the moment a plan changes. PhysioMate needed one tool clinicians actually used - web when they’re at the clinic desk, mobile when they’re on the go, same data, same patients, same library, no sync bugs.
The system at a glance
A Flutter app shipping to iOS, Android, iPad, and web from one codebase. Initial build launched in 2019 on the Flutter 1.x era; the codebase has been maintained and upgraded across later Flutter releases. Clinicians build a filtered exercise library with 3-level tags, assemble patient sessions, and export them as shareable PDFs. Firebase (Auth, Firestore, Storage, Functions, Hosting) is the backend; Algolia powers search; GetX manages state.
What the user experiences
Clinicians
- Log in on desktop, tablet, or phone. Same data on all three.
- Browse the exercise library by 3-level tagging - body part, goal, movement type.
- Search via Algolia - typing returns results instantly, even on a large library.
- Build a session by dragging exercises onto a patient profile.
- Export the session as a PDF and send to the patient via email or any channel.
- Brand the clinic with logo and colours so the PDF looks like the clinic’s, not ours.
Patients
- Receive a PDF prescribed by their physio. Open anywhere. No account required.
How we built the pieces
Multi-device parity - Flutter, not three codebases
Phone, tablet, and web all render from the same Dart code. Layouts are responsive, not stretched. A new feature ships to all four surfaces in one release.
The search stack - Firestore + Algolia
Firestore for the exercise documents, Algolia for the search layer. A Cloud Function mirrors every new or updated exercise to Algolia. The app queries Algolia for search/filter, and reads the full document from Firestore when the user taps in. The user feels instant search; the Firestore bill stays small.
The PDF generator - server or client, depending on format
PDF generation uses the Flutter pdf package for simple layouts and server-side rendering (Cloud Functions) for the richer multi-exercise session PDFs. Clinic branding (logo, colours) ships in every PDF.
Admin onboarding - clinicians add clinicians
New trainers and doctors sign up through an admin-assisted flow. Clinic admins invite; invitees set a password; access is scoped. No self-serve account creation without approval.
Data sync - Firestore real-time listeners
A clinician editing a patient record on the desktop sees the same record update on the iPad. Firestore listeners keep every open surface in sync. The “pull to refresh on the other device” problem never comes up.
Continuous maintenance - Flutter version upgrades
The app shipped in 2019 on Flutter 1.x. It has since been upgraded across successive Flutter releases as part of ongoing maintenance - null safety, breaking plugin changes, Firebase SDK upgrades - without a rewrite. That is the case for Flutter on a specialist app: the framework pays compounding dividends on maintenance.
Cross-device parity under a physio library
The reason most clinical apps fail is they ship the content and skip the operational wrapper: auth, onboarding, search, PDF export, branding, multi-device parity. PhysioMate ships all of that. The app stopped feeling like “a library of exercises” and started feeling like the tool clinicians open first.
Results
- Four surfaces live from one codebase: iPhone, Android, iPad, web.
- Algolia-backed search over a growing exercise library.
- PDF export with clinic branding.
- Admin onboarding flow for trainers, doctors, and hospitals.
- Shipped in 2019; continuously maintained since.
What an engineering team should take from this
If you are building any content-search product that spans web + mobile:
- Firestore + Algolia is the default for search. Firestore does not do faceted text search well; Algolia does it in 50ms.
- Cloud Functions for index syncing - keep the mobile/web clients out of it.
- PDF export is a feature, not an afterthought. Patients, students, and end users often want the printable version.
- Plan for Flutter version upgrades. A specialist app lives for years; pick a maintenance cadence up front.
Tech stack
- Mobile + web + iPad: Flutter (initial Flutter 1.x era, maintained through later releases - single codebase)
- Backend (managed): Firebase - Auth, Firestore, Storage, Functions, Hosting
- Search: Algolia
- State: GetX 4.0.0
- PDF: Flutter
pdfpackage (+ server-side rendering for rich layouts)
Screens
