
Follow Through
Shot-form analysis
Hold that
follow through.
There's a problem with the way passionate basketball players practice and improve. Hundreds of dollars and hours go to stubborn coaches, online programs that are scams in disguise, and mindlessly watching NBA games, and most of the world doesn't have access to even that. Follow Through gives ballers immediate feedback: record your shot, and it extracts your pose, lines every frame up against an NBA player, and returns a 0-99 similarity score plus the three mechanics to fix first.
It started with me recording my own jumper, watching pros on TV, and tweaking micromovements.
Reference -- Shaquille O'Neal
Target -- Steve Nash
Demo
See it in motion.
Pipeline
How it works.
01
Pose extraction
MediaPipe lands 18 joints per frame. Savitzky-Golay smooths the jitter without flattening the snap at release.
02
Normalisation
Centre on the hip midpoint; scale by the shoulder-to-hip distance. Camera angle and body size wash out, leaving only form.
03
Deviation + scoring
Per-joint Euclidean distance to the reference, resampled to a common 60-frame axis. Mean deviation collapses into one number.
The product layer
The score says how close you are.
The advice says what to change.
Mathematical analysis of your movements, turned into concrete steps to get to the next level. For the three most-deviated joints, the system writes specific cues in plain English: vertical offsets ("elbow drops 8% lower than Nash at release"), lateral offsets ("guide-hand wrist drifts across the body"), and timing deltas. The whole analysis layer is pure functions with no UI and no framework, so it drops straight into the phone app.
- Joints tracked
- 18
- Score range
- 0 -- 99
- Unit tests on analysis
- 10
Example output -- Shaq vs. Nash
What the system actually returns.
Similarity score
Noticeably different mechanics
Mean per-joint deviation of 0.251 across 18 shared joints over a 60-frame aligned window.
Top-3 coaching cues
- 01
Guide-hand wrist
Sits lower than Nash’s. Lift it higher through the shot.
- 02
Shooting wrist
Tucked too close vs. Nash’s. Let it extend outward naturally.
- 03
Right heel
Tucked too close vs. Nash’s. Let the base open up on the release.
Per-joint deviation
Normalised Euclidean deviation per joint, descending. Top contributors drive the advice.
Engineering note
Training data was the hardest part. I got around it with NBA 2K.
Labelled pose data from real basketball film is expensive and scarce. Before MediaPipe made the custom-trained pose step unnecessary in production, I generated synthetic training data from NBA 2K -- a game engine that renders realistic shooting mechanics on demand, with programmatic control over camera, lighting, and player. Good enough as a proof of concept, good enough to test on, and a pattern that still works wherever training data is the bottleneck. (The production system now leans on MediaPipe's pretrained landmarks.)
Under the hood
Stack.
- PoseMediaPipe Pose
- SmoothingSavitzky-Golay, per-joint
- AnalysisPure Python: NumPy + Pandas, zero UI deps
- Testspytest; contract tests on every public function
- MobileiOS: SwiftUI with MediaPipe pose on device
- Video I/OOpenCV + H.264 transcode for browser delivery