BioSyent

An iron health app for BioSyent Pharma, the Canadian pharmaceutical company, used by people with iron deficiency on iOS, Android and the web. It reached us in 2026 as a live app that could no longer be deployed or released. We got it shipping again, every deploy and store release since has been ours, and we are now building version two.

Industry
Healthcare
Client
BioSyent Pharma
Our role
Took over the live app in 2026 and have run it since
Now
Building version two

Patients on it. Nobody could ship it.

The app was in both app stores, with patients logging symptoms, meals and supplements every day. Behind it, nothing worked the way a live product needs to. The server would not build or deploy, there was no way to get a new version to Apple or Google, the AI meal scanning was failing, password reset emails were not arriving, and no error tracking existed, so every failure was invisible until a patient complained.

The client needed more than bug fixes. They needed a team to take ownership: stabilise production, rebuild the release process, and then keep shipping the features and the French version Quebec was waiting for.

13

releases shipped to the App Store and Google Play since we took over

3

automated pipelines: the server, the App Store and Google Play

18

server tests added while fixing every real bug from the client's QA round

What we fixed and added.

Deploys and releases, rebuilt

We fixed the server image, the TLS certificates and the deploy workflow, then built the iOS and Android release pipelines from scratch, code signing included. A release is now a version bump and one run per store, and we keep it compliant as Apple and Google change the rules: privacy manifests, new Xcode builds, new Android targets.

Production you can see into

We added error tracking and wired up the logs, so failures reach us before they reach a patient. Transactional email moved to a provider that delivers reliably, and every part of the setup, from deployment and secrets to certificates and CI, is now written down.

Canadian French, all the way through

Every screen, chart, date picker, push notification, article and legal PDF in English and Quebec French, with a check that fails when the two languages drift apart, and import tools that load translated content without a release.

A daily iron reminder

Patients pick the hour they take their supplement and the app reminds them every day. We built all of it, from the setting in the app to the scheduled job on the server, on top of the existing check-in and inactivity reminders.

What broke, and what we changed.

The headline feature was failing.

Photograph a meal and AI names the dish and its ingredients, then a nutrition service works out the iron. When we arrived, it was throwing server errors: the meal database connection was misconfigured and bad records crashed the endpoints. We fixed the connection, hardened every food endpoint against bad data, and made an AI outage show the patient a clear retry message in their language instead of an error.

Food tracking timed out for the most active patients.

The people who logged the most meals waited longest, until the request gave up. The query behind the nutrition charts had no index to lean on. One compound index on patient, status and date fixed it.

Sixteen reports, two of them not bugs.

A client QA round came back with sixteen reports. We fixed every real bug in it and two more we found on the way, and added eighteen server tests. Two of the reports were not bugs at all: the logs showed the AI provider's quota had run out and a cloud billing account had been switched off. We told the client exactly that, with the evidence.

What it runs on

Angular, Ionic and Capacitor for iOS, Android and the web. Django and Celery on AWS in Canada, with Postgres and a document database for meals. OpenAI vision and a nutrition API for meal recognition, Firebase for push, Sentry for errors, and GitHub Actions for the server and both app stores.

Thirteen releases in. Version two is next.