Case studies
Healthcare / physiotherapy / fitness · 2019

Physiotherapy exercise plans that live in one place

Physiotherapy exercise plans that live in one place

Client
PhysioMate
Duration
12 weeks
Status
Shipped
Stack
Flutter (initial build on Flutter 1.x era; later upgraded) · Firebase (Auth + Firestore + Storage + Functions + Hosting) · Algolia · GetX 4.0.0

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:

  1. Firestore + Algolia is the default for search. Firestore does not do faceted text search well; Algolia does it in 50ms.
  2. Cloud Functions for index syncing - keep the mobile/web clients out of it.
  3. PDF export is a feature, not an afterthought. Patients, students, and end users often want the printable version.
  4. 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 pdf package (+ server-side rendering for rich layouts)

Screens

Case-study page with desktop, MacBook, iPad, and iPhone screens

Reference architecture

The stack, one-pass.

Named pieces, how they connect, and why each one earned its spot.

  • 01Flutter (initial build on Flutter 1.x era; later upgraded)

    one codebase for iOS, Android, tablet, and web; maintained across multiple Flutter releases

  • 02Firebase (Auth + Firestore + Storage + Functions + Hosting)

    managed backend with auth, data, media, and Cloud Functions in one place

  • 03Algolia

    fast 3-level tagged search across a growing exercise library

  • 04GetX 4.0.0

    state management for form-heavy admin flows

  • 05pdf + printing Flutter packages

    generate patient-facing PDFs from session plans

  • 06Cloud Functions

    sync new/updated exercises to Algolia on write

Full stack

Every piece, named.

  • Flutter (initial build on Flutter 1.x era; later upgraded)
  • Firebase (Auth + Firestore + Storage + Functions + Hosting)
  • Algolia
  • GetX 4.0.0
  • pdf + printing Flutter packages
  • Cloud Functions
The team on the call

Named engineers, not a pool.

You speak to the person who’ll review the architecture. No account-manager layer. No offshore switcheroo.

Founder & Lead Engineer

Sameer Donga

Shipping Flutter, FastAPI, and AI systems since 2019. Reviews the architecture on every engagement.

Start a similar build

You have the reference. Now the project.

Tell us the shape of your version. We come back with a written architecture and a fixed quote.