Inspiration

Pro clubs have analysts who watch the opponent's last three matches and write a report. Everyone below that level has the exact same footage sitting on a phone or a Hudl account and nobody with time to watch it. The gap isn't data, it's labor. We wanted to see if a coach with zero budget could get a real scouting report out of a raw mp4 before the next game.

What it does

You drop in an opponent's match video. About a minute later you get a scouting report: their formation on a pitch diagram, where their attacks come from, defensive weaknesses, key players, and specific tactical recommendations for beating them. There's a timeline anchored to the exact moments the model looked at, an Ask AI chat that will only answer from what's in the report, and a PDF export so you can hand it to your team.

The video never leaves your machine. Frames get sampled in the browser with canvas, and only those get sent up.

How we built it

Next.js 16 App Router, React 19, TypeScript, Tailwind v4, deployed on Vercel. Groq runs the models: llama-4-scout for vision, llama-3.3-70b in JSON mode to synthesize the report and to power the chat. PDF export is drawn programmatically with jsPDF rather than screenshotted, so it comes out as real vector output.

The pipeline is a cheap local probe pass over 40 low res frames, scoring each one for pitch-likeness (green dominance) and motion energy. The 10 best-scoring moments each get captured as a burst of 3 consecutive frames about 0.4s apart. Each burst goes to the vision route as one call, and the report route turns those observations into a structured ScoutingReport.

Challenges we ran into

Client-side frame extraction wasn't a design flourish, it was forced. Vercel's serverless runtid caps request bodies at 4.5MB, which is smaller than basically any match clip. Server-side video was never going to work, so the browser had to do the decoding.

The bigger one: the first version sampled 20 evenly spaced stills and the fair criticism was that you cannot analyze a match that way. A single frame has no time axis, so a counter attack or a pressing trigger is literally invisible in it, and uniform sampling burns half your budget on title cards, replays rewritten into burst sampling plus content-aware selection.

Then the free tier bit us. Groq gives 30k vision tokens per minute, and we were firing 15 burstcoming back as "analysis failed" because 429s were being swallowed silently. We sized the budgetto actually fit the tier (10 moments x 3 frames at 400px is about 28k tokens) and added retry with backoff so the report degrades instead of quietly losing frames.

Also spent an annoying amount of time on the model emitting raw seconds into timeline.minute while the repair layer clamped them to the video duration, which stacked every late event onto the final minute. Fixed by handing the model precomputed minute labels and snapping to the nearest observed minute instead

Accomplishments that we're proud of

Bursts instead of stills. Asking the vision model what changed across three consecutive frames "there are players on the right side" and "the right back is overlapping the winger while amidfielder drops to cover." That's the whole product.

Also proud that it knows when to shut up. Feed it a non-soccer video and it refuses to produce a scouting report rather than inventing a plausible one, and every real report carries a confidence rating.

What we learned

Constraints picked the architecture. No ffmpeg and a 4.5MB cap sounds like a dead end, but pushing extraction into the browser meant no upload wait, no storage bill, and footage that never leaves the coach's laptop, which is a genuine concern for youth teams. The limitation turned into the best three propertie

And that the honest framing is the sellable one. It samples, it doesn't watch. A coach with no served by a fast, evidence-backed read of ten real moments than by nothing, as long as the toolis candid about the gap.

What's next for TacticIQ

Player tracking across the full match, heat maps, pass networks, xG, set piece pattern detection. Then a season-long opponent database so you can compare a team to itself over time, Hudl and Veo import so coaches don't have to export files by hand, and a mobile app. The pipeline is already chunked and concurrency bounded, so most of the depth increase is just a paid Groq tier and turning up BURSTS and PER_BURST.

Built With

Share this project:

Updates

Submission history