At Ajax Hackathon 26, we got access to a dataset that most developers never get to work with: skeleton tracking data from a live Eredivisie match. Every player on the pitch, at 25 frames per second, with 21 body joints tracked in 3D across the full 90 minutes.
The question we kept coming back to was straightforward but ambitious. From hundreds of thousands of data points, could we extract every shot taken in that match and give players and coaches something genuinely useful about each one? Not just whether it went in or wide, but what the body mechanics underneath the shot actually looked like. How was the player positioned? What did the movement into the strike look like? Are there patterns in posture, balance, or coordination that help explain shot quality?
To explore that, we built two things: a 3D viewer that lets you scrub through each of the 23 shot clips and watch every player's skeleton move on a full-scale pitch, and an analytics dashboard that scores each shot based on how well the kicking motion flows from the pelvis through the hip and knee down to the foot. That concept, borrowed from physics, is called the kinematic chain.
Screen Recording 2026-03-08 at 09.38.45.mov
The dashboard is where everything comes together, so let's start there.
The goal was simple: a coach or analyst should be able to open a shot, understand the score at a glance, and dig into the detail if they want to. Everything on the page is linked to the selected shot, and a fixed strip at the bottom lets you switch between all 23 shots instantly without losing your place.
The first thing you see is a semicircular gauge that animates up to the shot's WhipChain score when you load a clip. Below it, three indicators show whether the kinematic chain fired in the right order: pelvis before hip, hip before knee, knee before foot. Each one shows the time gap in milliseconds between consecutive peaks.
A shot can feel powerful and still score poorly if the segments fire out of sequence. This makes that immediately visible in a way raw numbers do not.
Below the gauge is a time-series chart showing the angular velocity of all four segments across the full shot window, with ball contact aligned to t=0. You can hover across the chart to read exact values at any point in time. Each curve has a peak marker, and when ideal peak times are available from the optimisation step, they appear as dashed reference lines showing exactly where the player's timing diverged from optimal. A shaded region just before contact marks the analysis window the WhipChain score is computed from.
Alongside the chart, a 3D view of the shooter's skeleton shows the body position frozen at the exact frame of ball contact. The cascade chart tells you the timing. Seeing the posture tells you whether the player was balanced, extended, or off-axis at the critical moment. Next to it, a miniature bird's-eye pitch marks where on the field the shot came from, paired with ball speed, kicking foot, match time, and outcome.
The most involved part of the dashboard is the ideal skeleton comparison. For each shot, we rendered both skeletons in the same 3D canvas: the original in red, the ideal in cyan. Joints that differ meaningfully between the two are highlighted in orange, making it immediately clear which part of the body was out of position during the shot. Both skeletons animate through the full shot window, and you can scrub or pause at any frame to compare posture at a specific moment. The score delta at the top shows how much WhipChain score the player left on the table, giving coaches a concrete number to attach to a technical correction.
Screen Recording 2026-03-08 at 22.31.59 (video-converter.com).mp4