Skip to content
ENTRY_BIRTHDAY_SURPRISE

Turning concert tickets into a birthday surprise for my wife

PUBLISHEDOCTOBER 27, 2026
STATUS
ARCHIVED
CHANNELPUBLIC_LOG
VERSION2026.01

For my wife's birthday I got us tickets to see Harry Styles. They only existed in an app, so over one weekend I worked with Claude to turn them into a short show she opens from a QR code. Here's how it came together, from my first prompt to the version she watched.

Try the experience ↗

“They don't give you physical tickets anymore”

hey can you help me use imgen to make some cool tickets for this? got these for my wife but they don’t give you physical tickets anymore so i’m going to print some

It started as a print job. The tickets only lived in an app, and I wanted something to hand my wife. We looked at ticket design references and the Together, Together tour art, then generated options: a night-sky stub, a kiss clock, an old-school admit-one, a mirror-ball ticket, letterpress.

A QR code in a gift bag

I might also put a little QR code if we can pull off something really cool, like an interactive web experience using 3-D where she has to like go through a few steps interactively, like a little treasure hunt or something … at the end she like has to do something like ripping a foil

The first web version did exactly that. You set a clock to 7:45, spun a disco ball, found three hidden kisses, then tore open a foil packet to reveal the tickets.

Intro screen with her nameSet the clock to 7:45Spin the ballFind three kissesTearing it openThe tickets

Simpler

I like the three interactive steps … but I also am wondering if like I wanna see a version that’s simpler, she scans it, it opens up, there’s a quick loading screen, and then it’s just like … happy birthday babe, you’re the best thing that’s ever happened to me … you have until April 2 to find a babysitter

The treasure hunt was clever, but it asked my wife to do things. The simple version just tells her things, one card per tap. Puzzles get between her and the moment. Words get her there.

The script barely changed after this. Every later round was about how each card feels.

LoaderHappy birthday, babe.You're the best thingBabysitterRevealSettled

“I wonder if there’s more 3D we can do?”

Next we brought in a real-time 3D stage built with three.js on WebGPU: a wall of LED panels showing the tour's screen looks (pink scanlines, a heat-map bullseye, flipping mirror triangles, rainbow bands) and a flock of mirror balls catching the light.

holy shit this is awesome ok there were some hitches on the last slides

Each mirror ball is real geometry: rows of small flat tiles, each tilted a few degrees off true. That small wobble is the whole effect. A perfect sphere looks like chrome. Tiles that each catch the light at their own angle look like a disco ball.

Hey babe on the LED wallBest thingBabysitterReveal

Each card its own place

OK, now you’re gonna kill me, but I wonder if there is more interesting distinction between the scenes, so each slide right now just kind of changes camera and changes the background and keeps the disco balls and whatever.

So each card became somewhere new in a concert: a lone ball in the dark, the party, inside the ball, facing the crowd, a tunnel of screens. Between cards a quick white flash covers the camera jump.

The sound moves too. One song plays through all of it, and a low-pass filter makes it sound like it's coming through a wall, from the next room, from inside the ball, or right there at the party.

Hey babe, close and dimHappy birthday, the partyBest thing, inside the lightReturn the favor, the starsBabysitter, the tunnel

“The crowd looks very vibe coded”

The crowd scene took four tries. Anything drawn, from glowing dots doing a wave to silhouettes with raised phones, looked like a drawing of a crowd. What worked was a real stadium photo with live phone lights over it, and a real applause recording that swells as the house lights come up.

The decoy

i want to … do a version where we do a super cheesy slide show of our love and then after like 10s it glitches and fades to black then our hey babe shows on the black

MORE cheesy and real sfx and music nothing procedural

This changed the whole piece. A surprise lands harder when the person thinks she already knows what she's getting. So it opens on a proudly terrible “Our Love Story” slideshow, with Pachelbel's Canon, sparkles, a cube turn, a film strip and every photo flying into a heart. Then a record scratch, a glitch, black, and: “Hey babe.” The second card says it out loud: “You didn’t really think all I got you was a cheesy slideshow, did you?”

let’s put these into the slideshow too it’s her first birthday as a mom

Our Love StoryMy EverythingThe glitch startsGlitch to black

Finding the finale in the song

there’s like a better climax in the second run of the finale like another buildup and climax with better energy

send me the finale mp3 on a player so i can scrub to the spots and tell you what i want

Describing a moment in a song with words doesn't work well. So Claude built me a scrubber, and I sent back screenshots of the exact second: “ok the drum run starts here.” From then on we talked in timestamps. The burst moved from 0:24.25 to 0:23.73 to 0:23.00, and the start moved around until it settled on 0:18.40.

A giant ball dropsPhoto panels fly pastA column of photos and ballsThe tickets land

Motion design by feedback

immediately when we start the finale buildup i want to see MOVEMENT like the tunnel starts spinning we fly through it we fly through an asteroid field of pictures and disco balls and then the pillar and the big one settle in and explode.

I'm not a motion designer, and I said so. What I could do was say exactly how it felt: robotic, slow, stuttery, dizzying. Each of those words turned into a specific change to one curve, the camera's speed over the song.

No hitches

there are some hitches along the whole thing test it in a simulator maybe and profile

A dropped frame during a surprise feels like a bug. Most of ours had one cause: the first time a GPU draws a new kind of object, it compiles a program for it, and that can freeze a frame. Claude wrote a small profiler that logged every compile with what was being drawn and where in the show it happened. The fix was to draw everything once, hidden behind the loading screen, before she taps. One sneaky one: switching a light off changed the light count, which made every material recompile. Now that light stays on at zero brightness.

“You telling me they don’t exist”

we have some really weird extra piece of music at finale and a stutter right at the start this is terrible i need to give this to her i can’t keep repeating the same issues and you telling me they don’t exist

Claude tested everything in desktop Chrome, muted, and the logs were clean, so it kept telling me the problem wasn't there. It was, but only on an iPhone.

What fixed it was measuring on the real phone. We added a tiny endpoint so my iPhone could send the song's position to the laptop on every frame. The first run had the answer: at the cut, the finale song was already 2.2 seconds in.

To unlock audio, iOS needs a tap, so at the first tap we call play() on the finale, then pause() it. On iOS the play() promise can resolve before playback actually starts. The pause lands too early, and the song plays on silently. A few seconds later you get a stutter. Minutes later, the song is past the whole flight, and it skips.

“ok she loved it!!”

ok she loved it!! there are a few images she wants to replace hahaha

Of course she did. Claude made a little page with every photo the show uses and a Replace button on each: pick a photo, tap the faces, and it's cropped to the same frame with the same white border everywhere it appears. The link preview, our photos drifting by as polaroids, was rebuilt with her picks.

What I'd tell you

  • Make the big calls yourself. Simpler, the decoy, “add space, not delay”: the model built fast, but the turns that mattered came from me knowing my wife.
  • Describe the feeling, precisely. “Robotic,” “going slow to wait for the buildup,” “stuttery,” “dizzying.” Each word mapped to one fix.
  • Build tools to talk. A scrubber turned vague music notes into timestamps. A photo page let my wife make her own changes.
  • Measure on the real device. Desktop logs said everything was fine for hours. One run on my phone found the bug in a minute.
  • Let the music be the clock. The visuals follow the song's playhead, so the burst lands on the hit even if the audio is late.
CERTIFICATION
“This entry represents a point-in-time reflection from the personal archives of BT Norris. The thoughts contained herein are subject to evolution and iteration.”
IDENTIFIER
TH_BIRTHDAY_01

END_OF_DOCUMENT

Field Log

Issue 01 // 2026

TUE, OCT 27, 2026Available now
Observations on the intersection of design engineering, human-computer interaction, and the building of tools.

Selected Entries

Loading posts…
Fin.
BT Norris // 2026