Eazi IT

Loading

Case study · Bespoke AI application

VT Fitness: an AI personal trainer people actually use

A fitness platform where artificial intelligence does the tedious parts — logging food, reading a set of scales, writing the coaching — and the user never has to think about AI at all. Built by Eazi IT, running on our infrastructure.

Visit vtfitness.co.uk Talk to us about your build

575Health readings pulled end to end on the first successful device sync
8Health metrics carried automatically from wearable to dashboard
15Body metrics, each with a user-chosen master data source
2Apps, one codebase — progressive web app and native mobile

The brief

Make the boring parts disappear

Every fitness app dies the same death. People stop using it because logging a meal takes ninety seconds, reading a set of smart scales means retyping thirteen numbers, and the “coaching” is a generic template that never mentions anything you actually did.

So the brief was not “add AI to a fitness app”. It was: find the handful of jobs where a person’s effort is pure friction, and remove those. Everything else stays ordinary software, because ordinary software is cheaper, faster and more predictable.

What we built

The platform

One backend, two front ends

A PHP and MySQL backend behind a vanilla-JavaScript progressive web app. The native mobile app is a Capacitor shell pointed at the live site, so deploying the website updates the app — no store resubmission unless a native permission changes.

Photo food logging

Photograph the meal, get the macros. The single biggest reason people abandon food tracking, removed.

Body composition from any source

Point the camera at a screenshot from any scale app, a photo of a scale display, a printed clinic or DEXA report, or handwritten tape measurements. It reads them all, converts stones and inches, and fills thirteen measurement fields.

Wearable pipeline

Band to Health Connect to the native app to the API. Steps, active calories, weight, body fat, sleep, heart rate, blood oxygen and body temperature, deduplicated on arrival so a resend never doubles a reading.

Data mastering

Fifteen metrics, each with a dropdown choosing which source is authoritative — the app, the band, the scales, a watch, or simply the most recent. Every sample is always kept, so changing the master re-resolves history without losing anything.

Background GPS

Walks and runs keep tracking when the phone sleeps. This genuinely cannot be done in a browser, which is precisely why the native app exists.

The AI decision

AI is the only thing we charge for

This is the part we would point any client to. The free tier is free for life and it is not crippled. The only difference between free and premium is the AI features — and that is not a pricing trick, it is the honest answer to “what is AI actually worth here?”

Where AI earned its place

  • Reading a meal from a photograph
  • Looking up macros from a plain-English description
  • Reading body composition off a screenshot or a printed report
  • Coaching that references what you actually did this week
  • A daily written report worth reading

Where it did not

  • Workout timers, rep counting, session logging — deterministic code, and it must be exact
  • Calorie arithmetic and net-of-BMR calculations — a formula, not a guess
  • GPS tracking and distance — a sensor, not a model
  • Anything a user needs to be able to audit and correct themselves

When a subscription lapses the account drops to free and the AI locks — but the provisioning is retained, so renewing switches it back on instantly rather than starting again. Small decision, and the difference between a lapsed user and a lost one.

The honest bit

Three bugs worth telling you about

Any agency can show you a case study where everything went well. Here is what actually happened, because how a supplier behaves when something breaks is the only thing worth knowing about them.

The migration that never ran

New database columns were only created by a setup routine the live app never called. On the live database the columns simply did not exist, so the app silently fell back to defaults — wrong names, missing admin access, features apparently switched off. Nothing errored.

The rule that came out of it: every schema change must heal itself at runtime. Never rely on a setup step someone has to remember to run.

The plugin that lied

A native plugin was typed as returning a promise. Through the bridge it returned its value synchronously, so the code waiting on it threw and location tracking hung on “Acquiring…” forever.

The rule: do not trust a library’s type definitions across a runtime boundary. Handle both shapes and log what actually arrived.

The variable nobody could see

Health sync returned nothing for three releases. No errors, no failed reads — indistinguishable from “this device has no data”. The cause: the session variables were declared in an inline script, so a separate JavaScript file could never see them, and the sync aborted at its own guard clause before doing anything.

The rule: silent guard clauses must say why they stopped. A function that gives up quietly costs more than one that crashes loudly.

All three were found, fixed and turned into standing rules. The health pipeline now runs end to end — 575 readings on the first successful sync, flowing from the band through the device, into the database, and out to whichever metric the user has chosen it to master.

Built in properly, not bolted on

Privacy by default

An audit found that any signed-in user could list the whole membership. Scoped the same day so users see only themselves and people they have explicitly linked with.

Consent in plain English

Link requests spell out exactly what gets shared, in both directions, and that it can be revoked at any time.

GDPR self-service

Every lifecycle email carries one-click unsubscribe and a token-based page to unsubscribe, erase data or delete the account outright.

No cron dependency

Scheduled work runs from a throttled on-login queue instead of server cron — fewer moving parts, nothing to silently stop.

What this project says about how we work

We decide where AI belongs before we build anything. In VT Fitness that came out as four jobs, not forty. The rest is ordinary, testable software — which is why it is cheap to run and predictable to change.

We instrument for the failure we cannot see. The expensive bug here was not the one that crashed. It was the one that returned an empty result and looked exactly like a normal day.

We fix the class, not the instance. Every one of those three bugs became a rule that now applies to every project we touch, including yours.

Thinking about a bespoke app?

Start with the honest question: which parts of this genuinely need building, and which parts already exist in something you own? We will answer that before we quote you.

Book a 20-minute reviewSee our prices

Fixed scope and a fixed price before we write any code.