All work

Partner product at Mobil80

Sportzlytics

AI technique feedback from a training clip, in the app or on WhatsApp. I work on the Flutter app, the admin panel and the AWS backend.

Role
Developer across the app, admin panel and backend
When
May 2026 – now
Status
Live on iOS, Android and web
Platforms
Android, iOS, Web, WhatsApp
Built with
Flutter, Gemini, AWS SAM, Lambda, DynamoDB, Cognito, WhatsApp Cloud API, Razorpay

What it does

Sportzlytics gives amateur athletes, parents and coaches feedback on technique from a short training clip. You upload the clip in the app or send it to a WhatsApp number, and Gemini sends back a report with the sport it detected, scores, timestamped corrections and drills. On WhatsApp it arrives as a text summary and a PDF. Each analysis costs one credit, bought in packs through Razorpay.

What I work on

It’s a partner product at Mobil80, in three parts: a Flutter app for web, Android and iOS, a Flutter Web admin panel, and a serverless AWS backend. I work on all three. My recent changes are the move from SMS to email sign-in codes, linking a WhatsApp number to an account, the free trial and the report screen.

How the system works

Upload and analysis

The app and WhatsApp feed the same job. Analysis takes longer than an API call should wait, so the upload only queues it on SQS. A worker Lambda sends small clips to Gemini inline and streams larger ones through the Files API, since inline requests top out around 20 MB. The app hashes each file first, so the same video uploaded twice reuses the old report instead of costing another credit.

Checking the AI output

The worker doesn’t trust Gemini’s JSON. It validates the shape, then checks whether a sport was identified, whether it fits the surface in the video, how many people are in frame, and video quality. A rejected clip gets a plain reason to retry and costs nothing.

Credits and retries

Payments arrive from app and web checkout, the Razorpay webhook and WhatsApp payment links. Webhooks retry and workers re-run, so every grant or debit is a DynamoDB transaction with a conditional write on a deterministic id, and a replay changes nothing. A credit is debited only after a successful analysis.

WhatsApp linking and the free trial

Each account is tied to an email address. A WhatsApp number joins it only after the owner proves they hold it, through a single-use link sent to that number or a LINK code sent from it. An unknown number gets one free analysis without signing up, and a per-number record stops the same number getting a second trial.

One codebase and the PDF report

One Flutter codebase runs the web portal and the mobile apps, with platform differences behind conditional imports (Razorpay’s native SDK on mobile, checkout.js on web). The report screen changes its sections by sport family and exports a PDF on the device. For WhatsApp, the backend builds its own PDF with pdf-lib, following the app’s layout.

Where it is now

Live on Google Play, on the App Store as SportzlyticsAI, and on the web. I’m still working on it.