BRAND EXPLORATION

Fanatic: Real-time NBA content engine

Automated digital OOH production engine

A content engine monitoring real-time events, trained

Working system
Live game feed in, finished placements out. The architecture is proven across three formats.
Not a concept deck.


Where it came from

I was going to freelance at an agency’s embedded AI production studio for a project doing strategy, creative direction, and model training.
All I knew was World Cup, tech client, billboards, UK.

The client pulled the plug before we could start.

I figured I might as well try building it myself just to see.

Sports advertising needs to move at the speed of a game. If it runs as fast as a media plan it sacrifices too much relevance. The engine watches games live and turns a moment into a finished, format-ready placement while people just start discussing it.

The underlying question is the one every creative’s asking themselves about AI: Can it be fast without producing absolute slop?

I wanted to test that.

Game-day data

Concept

Sports advertising should move at the speed of the game.
A system that watches games live and turns moments into a finished and format-ready placement while people are just starting to talk about it.

Execution

Ingest engine builds the show’s world from subtitles and screenplays, timestamps and syncs them

Retrieval limited to what’s already happened, so it can’t leak an ending it was never given

Withholding as a feature: when the show hasn’t told you who someone is, the app won’t either

One moment, three placements

I knew from the beginning that if this would be used for a campaign, it would need to have a well-defined structure instead of a firehose of outputs.

I wanted to satisfy multiple markets simultaneously as a test of scale, so I decided on three placements per event, each of which had to have its own point of view: Team, player hometown, high impact (Times Sq. in this case).

These would be unique markets, which I decided would require specificity in order to land with their audiences (I call it “geocultural specificity” 🤓). The elements are endonyms, local slang, local knowledge like landmarks.

Team city and player hometown make balanced use of this with a built-in “dice-roll” or probabilistic mechanism (i.e. 1/8 chance every fourth line includes either) to stop it from being cloying and cheesy. High impact placements remain neutral because they can’t claim geocultural specificity unless the game is between that city and another.

Donovan Mitchell, a hot streak against the Knicks:
CLE: Mitchell on auto-fire from downtown. The Land is on its feet.
NY: Spida is lighting up the league. He learned it on these streets.
Times Sq: Mitchell cannot miss. Period.

Same 15-seconds of the game generates content for three audiences.

Not every basket deserves a billboard

Most AI content systems skip this step, and I think that’s precisely why they produce such slop.

I needed to set limits so that content wouldn’t get repetitive and annoying. This needed to focus on worthy, highlightable moments. The engine fires on a defined set of events: career high, triple double, big turnaround, clutch window, scoring run, milestones, hot streak, lockdown. Each one has a threshold, and each threshold is an editorial judgement that can be adjusted. It determines which event is worth highlighting and which isn’t.

Then there’s a hierarchy acting as a rule that holds the entire system together. A player hitting a career high during a comeback while on a run would set three triggers simultaneously. Without a priority order you get three billboards saying three different things about one moment. That can cause brands to contradict themselves or muddy a message in public at scale. The hierarchy picks the big story and suppresses the rest so you’re left only with a single moment and message.

The engine is maybe a third of the value.

The rest is the data underneath it. The Player Manifest carries the things a model will never know well enough: Player hometown or nearest major metro, current team, jersey number, and nicknames. Nicknames matter more than you’d thing. “Spida lights up the league” sounds more legit than “Donovan Mitchell lights up the league.” Nicknames are the difference between copy written from within the culture and copy written about it.

Alongside the Player Manifest, a City Manifest carries 96 metros with local vocabulary (e.g. Philly calls everything “jawn”) and a glossary of basketball slang (“And one,” “dagger,” “raining buckets”).

Early tests surfaced a failure that proved it: during a Spurs/Timberwolves test, Naz Ried crossed 10 points and the trigger fired correctly, but the copy came back addressed to a city called “GAME.” Reid wasn’t in the manifest, so the fallback grabbed the first word of the game ID and wrote to nothing in particular. The output was technically flawless, but worthless as a piece of collateral. It was generic slop.

Gaps expose flaws and reiterate strengths.

The Manifest is the product

Copy is only half a billboard. The art shouldn’t be generic either.

The visual system runs on “aesthetic groups” mapped to cities that share a cultural identity. Rust Belt covers Cleveland, Detroit, Chicago, Milwaukee, and uses dark concrete or metal texture, hard single-source rim light, player lit from below. Miami has an entirely opposite direction: pastel neon, deco, heat shimmer, its own color temperature. A high impact location like Times Square runs in the other direction: extreme contrast, black and white with one accent, oversized type, no grain, high-touch editorial style.

A billboard featuring Mitchell in Cleveland looks like Cleveland, while his hometown billboard looks like New York. Brand consistency lives in the copy voice and a set of constraints that sit across every market: Scan lines, light trails, monospace stat readouts, rim lighting. Team colors go in as official hex, never approximations.

What’s built and what isn’t

Built and proven

A live data ingest, event detection with a full priority hierarchy

Three-perspective generation

Manifests

Few-shot voice system

Format-aware output

Model-agnostic generation so nothing is locked to one vendor
Next

A review dashboard with a thumbs up that feeds the few-shot pool and a thumbs down that regenerates

A connection to a programmatic DOOH platform so a buzzer-beater is on a screen in the Flats before the post-game interview starts.

Not built yet

Rendered art. The generation logic runs in Python and the image tooling I want (Figma Weave) sits in a visual node environment, and porting between them is genuinely the open problem. I've done the A/B work to know what I'd use and why, and the compositing architecture is decided.

Visual DNA