Inspiration
Every soccer fan knows the player cards from video games: a big overall rating with six numbers underneath. We love them, but they never tell you where the numbers come from, and they can't help you get any better.
Getting better usually means coaching, and that's where a lot of people get left out. Plenty of players love the game but don't have the money for a coach, the time for fixed training sessions, or a club nearby. So they practise alone, with no plan and nobody to tell them what went wrong on each rep.
We built SoccerScout to change that. Its job is to give anyone with a ball and a camera a training plan that fits their week and a coach that watches every rep, while staying honest about what it actually measured. One rule guided every screen: no guesses presented as facts.
What it does
SoccerScout is the coach most players can't get: a training plan that fits your life, and live feedback while you practise.
A plan that fits your life. Eight quick skill tests (wall passes, weak-foot passes, a cone slalom, juggling, sprints and shooting) give you your own player card. It's capped at 70% confidence because you record the tests yourself. Pick a pro you want to play like, and SoccerScout builds a 7-day plan around your two or three biggest gaps to them. You choose:
- how many sessions you can fit in (2 to 6 a week);
- how long each one is (30 to 90 minutes);
- what equipment you have (a ball, cones, a wall, a goal or a partner).
The sessions only use what you picked. Day 7 is a re-test, so you can see whether it worked.
A coach that watches every rep. The Live Coach uses your camera to watch you shoot or dribble, and gives short spoken hints, one at a time.
- Before a shot you pick the shot type, and it tells you which part of the boot to use.
- After each shot it says which part you actually used and whether that was right. A boot graphic shows the target and what it detected.
- You can hold a button and ask a question out loud. The answer only uses what was measured.
- At the end you get your strengths, repeated corrections with evidence, what couldn't be judged, and one or two drills to practise next.
Video never leaves your browser.
Learn from the pros. Search any player and see how they really play, built from real match data:
- a percentile radar against players in the same position;
- a touch heat map, plus pass and shot maps;
- an AI scouting report where every claim cites the stats behind it.
Their game-style card (PAC, SHO, PAS, DRI, DEF, PHY and an overall) shows the evidence behind each rating and a confidence score. Pace and physical need tracking data we don't have, so they show N/A instead of an invented number.
How we built it
- Data: we preloaded 930 matches of StatsBomb Open Data: 3.27 million events and 2,689 players from Barcelona's La Liga matches (2004/05 to 2020/21) and the 2022 World Cup. From these we compute per-90 metrics and percentiles by position for 6,567 player-seasons, with defensive numbers adjusted for possession. API-Football's free tier adds basic stats for other players. Every response is cached, and the app stops at 90 requests a day.
- Back end: FastAPI, SQLAlchemy and SQLite, with pandas and statsbombpy for the data pipeline. Coaching sessions are stored in a separate database from the analysis data.
- Front end: React, Vite, Tailwind CSS and Recharts, with custom pitch visuals.
- Training plans: our code picks your biggest gaps, the training and rest days and the day-7 re-test. The AI then writes the sessions, and we check them against your equipment and time.
- AI: OpenAI's gpt-5.5 writes the reports, plans and coach answers.
- It only sees a JSON summary of measured numbers and has to cite evidence that exists in it.
- Every reply is checked and cached.
- Spoken hints use gpt-4o-mini-tts, streamed and cached, with the browser's own voice as a fallback.
- Spoken questions are transcribed with gpt-4o-mini-transcribe.
- Computer vision: MediaPipe pose tracking (33 body points) and ball detection run entirely in the browser.
- At start-up it times the GPU and CPU and keeps the faster one, switching to a lighter model on slow machines.
- A One-Euro filter smooths the body points, and the ball is tracked between detections.
- Distances are measured in leg lengths, and the 3D pose shows which way the kicking foot points at contact.
- Rules: the coaching thresholds live in one JSON file shared by Python and JavaScript, with tests that check both give the same answers.
- Tests: 143 automated tests (60 with pytest, 83 with Vitest).
Challenges we ran into
- Loading the data. Pulling 930 matches needed a preload script that could resume after failures. We fixed bugs along the way, including penalty shoot-out goals being counted as real goals.
- Missing data. Pace and physical can't be measured from event data. Filling them with averages would have looked complete but been made up, so they stay unavailable. We only fill a gap with a clearly labelled estimate (the median for that position) when there are enough real values to base it on.
- One camera is noisy. In our test sessions, most shots were flagged as "not side-on" at the moment of contact, because the shoulders open up during the strike. We now judge the camera angle from the run-up. The backswing was also measured too late, because players draw the leg back before the standing foot lands, so we added a window that looks back in time.
- Keeping the AI honest. Language models love to add a speed or a distance. We only give the model measured numbers, make it cite them, and filter any invented speeds or distances out of its answers.
- Not nagging. A coach that talks after every rep gets annoying fast. We settled on one hint at a time, at least 6 seconds apart. Each hint has a cooldown, and minor issues have to repeat before they're mentioned.
- Windows. A very long project path broke compiled libraries, and the server's auto-reload kept serving old code. We moved the project to a short path and restarted the server by hand.
Accomplishments that we're proud of
- A full coaching loop from one camera: a target before each shot, a verdict after it, and an honest "not judged" when the foot isn't clear.
- The Live Coach runs fully in the browser, and no video is recorded or uploaded.
- Training plans are built from your own measured gaps and only use the time and equipment you have.
- Every rating in the app shows its evidence and its confidence. Nothing is guessed.
- The demo still works offline. The data is preloaded, reports and plans come from the cache, and the coach falls back to rule-based answers and the browser's voice.
- 143 automated tests, including checks that the Python and JavaScript coaching rules agree.
What we learned
- You don't need expensive equipment to measure technique. A camera and a browser are enough to see things like where your standing foot lands.
- Showing uncertainty builds trust. A clear "N/A" or a confidence score is more useful than a confident guess.
- Pose tracking from a single camera needs confidence checks everywhere. Holding a measurement back is better than giving wrong advice.
- AI is great at explaining numbers, as long as it's only allowed to use the numbers you actually measured.
- Good coaching feedback is short, spaced out and about one thing at a time.
What's next for SoccerScout
- Test the Live Coach with real players and tune its thresholds. So far the contact-area detection has only been checked with simulated movement.
- Put SoccerScout online so anyone can use it from a browser, without setting anything up.
- Bring the same per-rep feedback to more skills, like passing and first touch.
- Load more leagues and seasons from StatsBomb Open Data.
Log in or sign up for Devpost to join the conversation.