Inspiration
Anyone who's worked out without a trainer knows the problem: you can't see your own form. Squat depth, elbow angle on a curl, knee tracking — the things that actually prevent injury are hard to judge from the inside of your own body. Personal trainers solve this, but they're expensive and not always available. We wanted to build something that gives anyone that same "someone's watching your form" feedback, using nothing but a phone camera and a video upload.
What it does
FullForm takes a video of someone performing an exercise — starting with squats and bicep curls — and runs it through a pose-detection pipeline that tracks the body's key joints frame by frame. It calculates the actual angles that matter for good form (hip–knee–ankle for squats, shoulder–elbow–wrist for curls), and the moment those angles fall outside a healthy range, it flags it. The user gets back an annotated video with warnings burned directly onto the footage, plus a clean, timestamped list of exactly what to fix and when it happened.
How we built it
The frontend is a React app built with Vite, handling video upload and displaying the analyzed results. The backend is a Flask API that receives the uploaded video, processes it frame-by-frame with OpenCV, and runs each frame through MediaPipe's Pose model to extract body landmark coordinates. From those landmarks we calculate joint angles using vector math (arctangent between three points), compare them against thresholds specific to each exercise, and overlay warning text on any frame that fails the check. The processed video and a deduplicated list of warnings get sent back to the frontend for the user to review.
Getting frontend and backend talking to each other, and eventually deployed as a single unified service, meant a lot of iteration — connecting the React build output to Flask's static file serving so the whole app could run from one URL instead of juggling two separate deployments.
Challenges we faced
Git history got messy fast. A virtual environment folder accidentally got committed early on, blowing past GitHub's 100MB file size limit and blocking every push after that. Cleaning it out meant wiping and rebuilding git history from scratch — a good reminder to set up .gitignore before the first commit, not after. Merging teammates' work. Working solo on some parts and merging in teammate contributions meant resolving real conflicts in shared files, especially in the backend logic, without losing either side's work. localhost doesn't exist once you deploy. Our upload/download flow originally pointed at http://localhost:5000 directly in the code. It worked perfectly in local testing and then broke immediately once deployed, because "localhost" on a live server means the visitor's own machine, not ours. Fixing it meant switching to dynamic, request-based URLs instead of hardcoded ones. Framework mismatches on deploy. Our hosting platform auto-detected the wrong build tool at one point (assuming Create React App instead of Vite), which meant it was looking for an output folder that didn't exist. Small config mismatch, but it took real debugging to trace. Heavy dependencies, constrained hosting. opencv and mediapipe together are large, and video processing takes real compute time — which pushed us to think carefully about hosting choices, since not every platform is built for workloads that need to write files and run longer than a few seconds per request.
What we learned
We came out of this with a much deeper understanding of the gap between "it works on my machine" and "it works in production" — environment variables, static file serving, dynamic URLs, and the real constraints of different hosting platforms (serverless timeouts, read-only filesystems, file size limits) aren't things you fully appreciate until you hit them. We also got hands-on experience with pose estimation and the math behind turning raw landmark coordinates into actual, usable feedback — not just detecting a person, but understanding what their body is doing.
What's next for FullForm
- Expanding beyond squats and bicep curls to a larger library of exercises
- Real-time analysis via webcam instead of only post-workout video upload
- Rep counting alongside form feedback
- Personalized thresholds based on user mobility/flexibility instead of one-size-fits-all angle ranges
Log in or sign up for Devpost to join the conversation.