Inspiration
A freshman soccer player gets cut. No coach feedback, no explanation, just "keep working."
So he keeps working, on the wrong things, and gets cut again.
VarFoot exists because most players who don't make varsity never find out what varsity actually requires from them specifically.
What it does
Players take a 19-drill baseline assessment they can do alone, at home, with no partner.
Each drill scores against calibrated freshman, JV, and varsity benchmarks using piecewise-linear interpolation:
⎧ 0 x ≤ x_floor
⎪ lerp(x; x_floor, T_f; 0, 40) x_floor < x < T_f
s(x) = ⎨ lerp(x; T_f, T_jv; 40, 70) T_f ≤ x < T_jv
⎪ lerp(x; T_jv, T_v; 70, 100) T_jv ≤ x < T_v
⎩ 100 x ≥ T_v
The function is direction-aware. Timed drills where lower is better mirror the floor anchor around the varsity target so the scale stays symmetric.
Drill scores roll up into a Varsity Readiness score R (a value from 0 to 100):
R = 0.40 × S_technical
+ 0.25 × S_physical
+ 0.15 × S_speed
+ 0.10 × S_nutrition
+ 0.10 × S_plan
R = 40 is freshman level. R = 70 is JV. R = 100 means you're ready.
From there, a gap analysis ranks every drill weakest-first against varsity benchmarks. A deterministic weekly training plan gets built from those gaps and a real tryout date. There's also session tracking, live USDA nutrition search, and an AI coach that knows the player's actual scores before it says anything.
How we built it
| Layer | Tech |
|---|---|
| Framework | Next.js 16 (App Router, Turbopack) |
| UI | React 19 + TypeScript |
| Auth + DB | Supabase (PostgreSQL with Row Level Security) |
| AI | Gemini 3.1 Flash Lite |
| Nutrition | USDA FoodData Central API |
| Hosting | Vercel |
The scoring engine is a pure function with no ML. Every benchmark is documented and traceable to source. The roadmap generator is fully deterministic: same gaps, same tryout date, same plan. The AI coach gets a structured context object on every message: scores, top gaps, roadmap, and nutrition log, so it answers about the specific player, not soccer in general.
Challenges we ran into
Getting the scoring math right for both directions took longer than expected. A lower-is-better timed drill needs a mirrored floor anchor or the scale breaks below freshman. The edge cases only showed up in tests, which is why we wrote them.
Every assessment drill had to be completable alone with minimal gear. That ruled out a lot of natural soccer benchmarks: crossing, 1v1 defending, heading under pressure. We had to find solo proxies that actually correlated with each skill, and some of those calls were uncomfortable.
We also had to invent a "plan readiness" proxy score since there's no benchmark for whether a player has actually committed: tryout date set, training frequency, roadmap generated. Whether to show it alongside athletic scores was a real argument. We left it out of the strongest/weakest display because calling "plan readiness" your top strength is misleading.
Accomplishments that we're proud of
A player who scores exactly at the freshman benchmark on every drill gets R = 40.0. JV across the board gives R = 70.0. That consistency across 19 drills with different units, directions, and benchmark spreads was hard to pull off, and it matters because the number has to actually mean something.
We also built a demo path, Explore as Jordan Reyes, that gives a judge the full experience in under two minutes without an account. Jordan has a real assessment, a real roadmap, and a coach who knows all of it.
What we learned
The coach got a lot better when we stopped letting it give generic advice. Early versions would answer a question about weak foot with a general training philosophy. We added a rule: cite the player's actual gap score or don't make the recommendation. Answers got shorter and more useful immediately.
The benchmark numbers are load-bearing in a way we underestimated. Getting the JV and freshman anchors wrong doesn't just affect the displayed score. It changes which drills show up as gaps, which changes the roadmap, which changes what the player actually trains. We ended up writing a full assumptions doc just to keep the numbers honest.
What's next for VarFoot
Partner drills are already in the training library but not the assessment. That was a deliberate MVP cut, and it's first on the list.
After that, video form feedback via Gemini Vision is the biggest one. Then team mode, where coaches set the varsity targets against the actual squad instead of generic benchmarks. And eventually, periodic reassessment every 4-6 weeks so players can see how their readiness changes over time, not just a single snapshot.
Built With
- css
- gemini
- nextjs
- react
- supabase
- tailwind
- typescript
- usda-nutrition-data
- vitest

Log in or sign up for Devpost to join the conversation.