Rebuilding Kobe’s 60-Point Farewell with Claude Opus 5.5

A September 2026 snapshot. The agentic AI space moves fast, so the specifics here reflect the tools as they worked on the day I built this.
On April 13, 2016, Kobe Bryant played the last game of his 20-season career and scored 60 points against the Utah Jazz. I have built dashboards in Power BI and Tableau for years, and I wanted to see what would happen if I gave an AI model a game I care about and asked it for something that was explicitly not a dashboard.
So I opened Claude Code, pointed it at an empty folder on my drive, and gave Claude Opus 5.5 a loose prompt: get Kobe’s shot data and game data from that final game, use Lakers colors, add context, make it interactive, and make it feel like storytelling. I also told it to impress me.
What came back, after a single working session and a handful of notes from me, was an interactive scroll-through replay of the game, a 59-second animated film with an original score, and two MP4 exports, a widescreen 16:9 cut for LinkedIn and a vertical 9:16 cut for Instagram and TikTok.
The interesting part was not that it could write D3. It was how much of the job it treated as its own responsibility, starting with the data.
I had built this game once before
This was not my first time telling the story of this game. In December 2018, when I was still new to Tableau, I published one of my very first dashboards on Tableau Public about Kobe’s final night. It has a shot chart of his made field goals on a Lakers court, bar charts of his points and made shots by quarter split between twos and threes, and a summary table showing 22 of 50 from the field, all built on data I pulled from stats.nba.com.

Looking at it now, I can see exactly where I was as a developer. The numbers are right, and the totals match what Claude rebuilt eight years later, but the dashboard answers “what happened” with bar charts and a quarter filter, and the drama of the night lives entirely in the viewer’s head. The comeback in the final 2:36 is in that data, and in 2018 I did not have a way to show it. Eight years and a Tableau Ambassador selection later, this project was a chance to go back to the same game and see how far the tools, and I, had come.
The data came first, and it got checked
The first place Claude went for data was the NBA’s own stats API, the same stats.nba.com I used in 2018, and this time it blocked the automated requests and timed out. Instead of stopping there, it switched to Basketball-Reference and pulled three pages for the game: the play-by-play log with 419 events, the shot chart with every field goal attempt plotted on a court image, and the official box score.
Before it built anything, it reconciled its parsed data against the box score. The totals matched exactly: 60 points, 22 of 50 from the field, 6 of 21 from three, 10 of 12 at the line, and a 101 to 96 Lakers win. The shot chart only stored pixel positions, so it converted all 50 of Kobe’s shots into feet on a real court and fit the hoop location against the listed shot distances, landing within about half a foot.
That is the step I would expect from a careful analyst on my own team, and it happened before a single chart existed.
It also found the story in the data without being told what to look for. The Lakers trailed 96 to 86 with 2:36 left and closed the game on a 15 to 0 run. Kobe scored 13 of those points and assisted on the final basket, and his 19-foot jumper with 31 seconds left gave the Lakers their first lead since the first quarter.
The interactive page
The first build was a single HTML page using D3.js 7.9, published as a private Claude artifact. The core is a scrollytelling layout where a court and scoreboard stay pinned on screen above a timeline while nine short chapters scroll past, and each chapter replays its part of the game: the five straight misses to open, the 15 points in the last five minutes of the first quarter, Utah’s 15-point lead before halftime, and the comeback. When the story reaches the final 2:36, the timeline zooms in so every mark on it belongs to the closing run.

Below the replay there is a waffle chart with one square per point stacked by quarter, a breakdown of makes and attempts by distance, a timeline of Kobe’s six career 60-point games, and the full box score for both teams. You can also take the controls yourself by playing the game at different speeds, dragging the timeline, or hovering any shot to see the play and the score at that moment.

Turning it into a film
When I asked for Kobe’s image and something that felt like an animated movie, Claude handled the image question first. Most photos of Kobe are owned by Getty or AP, so it searched Wikimedia Commons for freely licensed ones and chose two by photographer Keith Allison under CC BY-SA 2.0, including a portrait from his final season. It added the photo credit to the page, and later to the film’s end card.
The film itself is drawn on an HTML canvas with a hand-built 3D camera. Every one of Kobe’s 50 shots and 12 free throws flies in a real arc from its actual spot on the floor, makes drop through the net, misses bounce off the rim, and a broadcast-style scoreboard tracks the game clock and score alongside Kobe’s point total. The final 2:36 plays in slow motion with freeze-frames on the tying three, the go-ahead jumper, and the 60th point.

Where I pushed back
This is where the collaboration mattered most, because the first version was not the final version, and every note I gave came from watching the film the way a viewer would.
The first cut had a constant crowd sound that read as white noise, so I asked for real music. Claude removed the crowd entirely and wrote an original score in the browser with the Web Audio API, in D minor at 96 beats per minute, with a hip-hop beat through the quarters, a heartbeat under the final 2:36, and a full chord hit on point 60. Because the music is generated by the page, there is no licensing question and no risk of a platform muting it.
The first cut also ran 2 minutes and 23 seconds, which is far too long for social. We recut it to under a minute by collapsing the first three quarters into a fast montage and keeping most of the screen time on the final 2:36.
At the ending, the card said “Kobe Bryant, 1996 to 2016,” which reads like birth and death years rather than a career. We changed it to name the Lakers and put the emphasis on 20 seasons, with a playing career line underneath and the number counting up from 1 to 20.

The best catch in the whole project was a bug I found just by watching. In the slow-motion finale, Kobe’s point total kept climbing, but no shots were flying. Claude traced it to a timing detail: each ball launches slightly early so it reaches the rim as the score changes, and during the fast fourth-quarter montage that head start was about three game minutes long. It reached past the end of the scene and threw all eight of Kobe’s final attempts before the finale even started. The fix was one line of code that keeps every ball inside its own scene, and Claude simulated the timing before and after to prove it.
From browser to MP4
Screen-recording a browser drops frames, so the export works differently. A headless copy of Chrome steps through the film exactly one thirtieth of a second at a time over the Chrome DevTools Protocol and saves each frame, which comes to 1,782 frames at 1920 by 1080. The score and every swish and rim clang are rendered separately into one audio track on the same clock, and ffmpeg joins them into an H.264 MP4.
The first export was 255 MB because of the film grain effect, which is random noise on every frame and the hardest thing for a video encoder to compress. Removing the grain for the video brought it down to 24.6 MB with a cleaner picture, which also holds up better when LinkedIn or Instagram re-compress the upload.
Instagram Reels and TikTok need vertical video, so Claude added a portrait layout to the film. The camera is reframed for a tall screen, the letterbox bars are gone, the subtitles and scoreboard sit inside the area the apps leave clear of their buttons and captions, and the first frame opens on the title so it works as the cover image.

What I took from it
I work with organizations across a lot of industries, and the question I get most about AI is whether it replaces the analyst. This project answered it for me in a practical way: Claude did an enormous amount of the building, and it checked its own work more carefully than I expected, but the notes that made the film good came from a person watching it and caring about how it landed.
For data storytelling specifically, the gap between “a chart of what happened” and “a story people will watch to the end” used to be a design and engineering budget most teams did not have, and it is a lot smaller now.
The full interactive version lets you scroll through the game chapter by chapter, drag the timeline to any moment, hover any of the 50 shots, and watch the film in your browser.
Data from Basketball-Reference. Photos by Keith Allison, CC BY-SA 2.0, via Wikimedia Commons. Built with Claude Opus 5.5 in Claude Code.
Field notes on Power BI, Tableau, Fabric, Snowflake, and Databricks from someone shipping this work for real clients. Free, most weeks.