Skip to content
Emre.dev — home
Emre.dev
All work
Release candidate2026Founder · sole engineer

FormAI

A camera-driven fitness coach that counts and corrects repetitions on-device.

The short version

Packaged food never reaches the vision model — a barcode is an exact identification against the manufacturer’s own nutrition panel, and it costs nothing.

FormAI running on a phone, showing a live workout session with pose feedback overlaid on the camera view.

Build 1.0.0+40 on the Google Play closed testing track. Not yet publicly listed. The iOS target is written but has never been built, so no iOS claim is made.

How FormAI works

A single Flutter codebase pairing a thirty-day training programme with on-device pose analysis for live repetition counting and form correction, plus nutrition tracking, subscriptions and native session widgets. The largest codebase in this portfolio.

The problem

Form is what makes training safe, and it is exactly what you cannot check alone. Sending video to a server to find out is slow, expensive and a privacy problem all at once.

The architecture

Everything vision-related runs on the device through Google ML Kit pose detection. Supabase Postgres holds the exercise catalogue behind row-level security; a Deno edge function and a Terraform-managed AWS edge serve the legal surface.

The interesting decision

Two detectors share one camera stack rather than two. Barcode scanning was chosen from the same vendor as the pose detector specifically so it adds a detector to the existing pipeline, instead of bringing a second camera implementation that would fight the first.

What it does now

Roughly 61,000 lines of Dart across 177 source files, eight pose analyzers and a 138-exercise catalogue, with a four-layer release-build error guard and observability behind a KVKK/GDPR consent gate.

Worth knowing

  • Pose analysis is entirely on-device — no video leaves the phone for the coaching path.
  • The barcode route exists so packaged food is identified exactly rather than estimated by a vision model.
  • Every user table is row-level-security gated end to end; analytics sit behind an explicit consent gate.
  • A dependency was removed only after measuring that it had already been tree-shaken to 848 bytes — the reasoning is written down in the manifest.
  • The privacy policy was corrected the moment the calorie scanner started uploading photos, in a commit that says exactly that.