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.
- 3Platforms from one Flutter codebase
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.