Client engagement, under NDA · 2026

The right game on every screen

A small box on the network changes the channels itself. Set the venue's sports preferences once and the right game is always on, without anyone reaching for a remote.

Feed analysis · Interactive prototypes · UX writing · Design system · React Native
3k → 1.9kTeams a bar waded through while searching for their favorites
146 → 1Rows a bar gets searching for "cardinals" by filtering down by selected leagues
5 screensQuestions removed from the buyer's flow, two of them unanswerable
A tablet propped on a bar, showing a screen headed How much does each one matter, with leagues sorted across three columns from first pick to last.

Rebuilt setup on the live feed

The product changes every channel over the network, so the right game is always on and nobody goes looking for it. All of that rests on one thing: the venue telling it what it cares about.

That was the part failing. So I rebuilt the setup as a clickable prototype running on the live feed. The client signed off on the working thing, not a picture of it.

Confirm your venuePick, orleave itWhich sports matter mostPut leagues in orderWhich teamsWhich teams to avoidWhat plays between gamesReviewWe chooseLEAVE IT TO USSKIPS FOUR SCREENSThe addressarrives with theorder. Theyconfirm it.Confirm your venuePick, orleave itWe chooseWhich sports mattermostPut leagues in orderWhich teamsWhich teams to avoidWhat plays betweengamesReviewLEAVESKIPSThe address arrives with theorder. They confirm it.

A wrong answer nobody could catch

A bar manager knows which TV package the building carries about as well as they know their phone plan by name. The worse problem is what a guess does.

A receiver reports a channel the venue does not pay for as though it were fine. Nothing catches it, and the schedule fills with games that land on a subscription screen.

This was not hypothetical. It had already happened at a real venue.

A decision that opened a new process

I was asked to shorten the list of packages. I removed the question altogether.

Probe the TV, don't ask the bar

What answers the question now is a probe the technician runs on site, once the floor plan is built. They pick a TV off the plan they have just drawn and walk to it.

The receiver will not admit a channel is missing, and nothing about that failure reaches the API. What it does instead is put the same error number on a subscription screen every time. The probe shows the technician that number and asks them to read back what they see. The tiers stack, so it is three checks at most and often one.

A tablet screen headed Which channels does this venue get, marked check one of three at most, tuning one named TV to channel 208 and showing what an unavailable channel looks like, with Yes and No answers beneath.
The same screen once the tier is found, the one above it struck through and the two below it marked as included, beside a panel listing what the tier carries and how many add-ons are still to check.
A summary headed Here is what you get, listing thirteen screens in nine groups, the base package, and the add-ons split into what comes with the tier, what the venue subscribes to and what is not carried.
The same floor plan doing its nightly job, every screen carrying the channel and the game it is showing, two colored rank badges marking the screens tied together, one screen flagged as changed by hand, and one marked as not reachable.

The bar already had a tablet

The first install answered a question nobody had asked. Both venues already ran everything off one shared tablet behind the counter: table availability, the HVAC, and the TVs. One of them drove its screens from a wall system with its own iPad front end. Nobody was going to keep two tablets behind a bar, so the product had to absorb the one already there.

A floor plan headed Place your TVs, with thirteen numbered screen markers each carrying a facing arrow, arranged across a main room and a patio and labeled with the names the venue already uses for those spots.

One object, two moments

The map a venue builds during setup is the screen its staff use every night. I designed the nightly view first and the builder second. The old one showed where each TV was and nothing about what was on it.

A TV sits in exactly one room but can belong to several groups. A room is drawn as an area on the map and a group is a colored badge on the TV itself.

The original sports screen asking "What sports do your customers enjoy the most?" above thirteen chips that are mostly leagues, including NFL, NCAA Football, NBA and NCAA Basketball, with a View More link beneath.

Asked for sports, listed leagues

The old screen asked which sports a venue’s customers enjoy, then offered NFL, NCAA Football, NBA and NCAA Basketball. Those are leagues, not sports, and the distinction is not pedantic: a bar across the road from a college wants the college game. So I split sports into two levels, with their leagues one tap behind.

Grouped so a search returns one row

Tapping a sport opens the leagues inside it, and each sport reads back which of its leagues are on. A venue can check its answer without opening anything. I grouped teams under the league they play in: a search for one city was returning four rows that read the same. The last screen plays the whole thing back in plain sentences.

The rebuilt sports screen, nine sport chips each carrying a subtitle naming the leagues chosen inside it, such as Football with NFL and NCAA D-I.
The team screen after adding, showing eight numbered league rows with the chosen teams inside each and an Add control pinned outside the scrolling strip.
The review screen playing back the venue, the eight leagues in order, six backed teams with their leagues listed, the empty avoid list, and the between-games ranking, each with a Change link.
The original team screen asking "Any team affiliations?" with an empty search field and three plain chips reading Detroit Lions, University of Michigan and Michigan State, carrying no league, sport or location.

Prototyped on the real data

The old team screen offered three guesses based on the venue’s city. I went and got the real list: 38,266 teams, pulled from the licensed feed the product already runs on. Of those, 5,584 looked like duplicates. They were a men’s and a women’s team sharing a name. I labeled them. Merging would have collapsed two real teams into one row.

I stopped asking for what the product knew

Two more screens went for their own reasons. I cut the venue type because I checked what read it downstream and nothing did, while the screen itself claimed to shape the programming.

A promise the product does not keep is worse than no question. The location screen went for a plainer reason: the address was already typed at checkout. The product keeps that answer and stops asking for it.

Nine annotated Figma frames of one receiver-configuration screen, covering the default state, four identically named receivers, inline renaming, multi-selection, the state after mirroring, two identify dialogs, and naming a mirrored set.

Ported the screens back into Figma

That was the venue’s half of the problem. The other half was handing it over.

I built the prototype out of the library’s own components. A prototype the client can click is worth little once it reaches the codebase if the design system does not know about it. I found 23 of the 35 components those screens needed already existed. A silent match is how a library drifts, so the tool proposed each swap for review rather than applying it.

A dark Figma board headed New Components, laying out twelve receiver components: a receiver row unselected and selected, each carrying its channel and the game on it beside Find this TV and Rename controls; a mirrored-set card grouping two TVs onto one game; the mirroring rail in three states, empty, two selected, and holding a named set with an Undo; an inline naming field offering the venue's own room names as chips; a warning that a missing receiver is probably unpowered; a section header reading We found 5 receivers; a pinned bar carrying Search again and Continue; and three dialogs covering finding one TV, opening the guide on it, and naming a mirrored pair.

Built the twelve that didn't exist

The other twelve I built, using Claude and the Figma MCP bridge to do it: auto layout throughout, and every one of the 69 text layers on a shared text style. 225 bindings to the design system’s own color, type and spacing variables, every one matched without a manual fix.

Three of them are component sets, so the nine states of one screen are drawn once and pulled in wherever the flow needs them.

I left the venue less to answer

Five screens are gone from the buyer’s flow. Three of them were the whole Cable section, two of those asking a bar manager what no bar manager knows, and a probe answers that now instead of a person. The last two asked for something the product already had or never used. Teams to wade through fell 3,401 to 1,927, once the leagues a venue picked did the filtering.

These count the pool the design exposes, not shipped behavior, since the engagement is active. The interface got simpler because I understood the system underneath it.

What I did

I authored the seven clickable prototypes, pulled and analysed the Gracenote feed that drives them, and wrote the flow, the copy and the component register. I ported the new screens back into Figma and rebuilt the twelve components that had no equivalent there. I wrote shipped React Native components for the tablet app, and I helped build the Figma to React Native sync skill Very uses to keep the two in step.