aditazzz

Videos Please Hold (I'd Rather Chew Glass Than Call)

Please Hold (I'd Rather Chew Glass Than Call)

A $4 charge on my internet bill, 47 minutes on hold, and a millennial who would rather chew glass than read her card number out loud. So I sent a robot. It's got all day. 📞

Watch on YouTube · 3:33 · video by Claude Opus 5.5 ·

The code behind it

Every frame of this video is drawn by a JavaScript program (a Three.js film, rendered in a headless browser). This is the heart of it, from web/js/film.js, line 957.

songs/please-hold/web/js/film.js
window.renderAt = async (t) => {
  resetFrame(t); longCord.visible = false; if (netLines) netLines.visible = false;
  const s = LOOK ? null : findShot(t); const u = s ? clamp((t - s.a) / (s.b - s.a)) : 0;
  const v = (await (LOOK ? lookDev(t) : (s ? s.fn : FALLBACK)(t, u))) || {};
  if (t >= T.song && t < T.card) { fp.views = []; }   // the battery dies: hard cut to black on the exact frame the audio stops
  else if (v.split) {
    const [A, B] = v.split; look(camA, ...A.cam); look(camB, ...B.cam);
    fp.views = VERT ? [{ cam: camA, rect: [0, 0.5, 1, 0.5], before: A.before }, { cam: camB, rect: [0, 0, 1, 0.5], before: B.before }] : [{ cam: camA, rect: [0, 0, 0.5, 1], before: A.before }, { cam: camB, rect: [0.5, 0, 0.5, 1], before: B.before }];
    SPLIT = true;
    finish.uniforms.uSplit.value = VERT ? 2 : 1; finish.uniforms.uSplitAt.value = 0.5;
  } else { look(camA, ...v.cam); fp.views = [{ cam: camA, rect: [0, 0, 1, 1] }]; SPLIT = false; }
  if (her.root.visible) her.hairTick(t, HAIRO);
  updateLyrics(LOOK ? -99 : t);
  if (!CLEAN && !LOOK) drawHud(t); else finish.uniforms.uHud.value = 0;
  if (t >= T.song && t < T.card) finish.uniforms.uHud.value = 0;
  finish.uniforms.uTime.value = t; finish.uniforms.uFade.value = 1;
  composer.render();
  return renderer.domElement.toDataURL('image/jpeg', 0.93);
};
    ...

Read all 2,930 lines on GitHub. If you use it, credit aditazzz and link the video.

What you see

A 3D film. It opens through my eyes on my phone, on hold at 00:00:03, and the call leaves the phone as a streak of cyan light. The $4 charge gets circled in hot orange, 2 on the keypad is for despair, and 3 is an empty call-center cubicle with the chair still spinning. The light comes back down as a small white robot with a corded receiver plugged into its chest, and it sits down on the bench in my exact pose while I walk off to order Chinese. Days pass over the plaza. The cord runs across the plaza and up the HOLD tower, whose windows spell HOLD with a robot on hold in every one of them. I spend the wait at the salon under the dryer in foils, eating onion rings, and on "I don't wait anymore" the hood swings up, the foils burst off and I walk out with blonde waves and my wayfarers on. The robot's eye strip is its face and its screen: a hold-music waveform, a notepad, THANK YOU SO MUCH :), a survey that is page 1 of 400, five stars, and a battery at 1%. In the bridge it prints a receipt as long as a pharmacy receipt, and the $4 charge turns into $5 under a rubber stamp. Then the city reboots in neon, the man with the rocket from Ragnarök or Reach for Mars conducts from the tower screen, and the little robots run the show. The video ends on the exact frame the audio stops: the battery dies.

The captions wait too. Each word pops in as it's sung; a line left waiting starts to slump, and when it's over its letters topple like dominoes and drop out of frame. The hold system's lines type out like an automated transcript (and fall over anyway). The robot's lines come up on a little LED panel in its dot-matrix font and never fall over, because it has all day. "I don't wait anymore" and "I've got better things to do" don't fall over either: they walk off.

The news behind it: on Oct 25, 2026, Elon Musk announced that Grok Bot can now call a person or a business for you. It makes the request on your behalf, takes notes on the answer and sends you a summary of the conversation. The other end of the line is going robot too: Starlink's support line already runs on Grok Voice, which xAI says handles about 20,000 calls a day and resolves about 70% of them without a human. We built machines to make us wait; now our machines wait on their machines.

(The robot is our own design, and the video isn't affiliated with xAI or Starlink. Every bill, brand and headline on screen is invented.)

Files

FileLinesWhat it draws
web/js/film.js982The film. renderAt(t) draws the frame at time t, deterministically: the moods (night, days passing, dusk, neon), the shot list cut to the vocal, split screens (left/right in 16:9, top/bottom in 9:16), the glow-up, and the crisp 2D layer (the hook, the title, PASS., the end card).
web/js/captions.js184The captions: small, crisp and drawn after the bloom. Words pop in as they're sung, waiting lines slump, finished lines topple like dominoes; typed lines for the hold system, a dot-matrix LED panel for the robot.
web/js/world.js419The city: a sky that runs from night to noon to neon, a toy-clean city in one instanced draw (procedural windows, neon edges), the plaza and its dance-floor tiles, the bench and lamp, and the HOLD tower: 900 real windows with rooms behind them, robots on hold in any of them, an LED dot-matrix band, and a facade that becomes one giant screen.
web/js/robot.js180The hold-robot: the Ragnarök robots' family (white enamel, black glass face, gold seam), its corded receiver and coiled cord, the eye-strip screen and every mode it shows, thrusters, the receipt slot.
web/js/figure.js169The rig (two-bone IK arms and legs, sitting, standing, walking) and me: the face (eyes, a smile, a raised brow), black wayfarers, the berry top, and a cape for the salon.
web/js/hair.js183My hair in three looks: dark and pulled back into a low bun with a scrunchie, foils, and honey-blonde waves built from twisting ribbon locks that are rebuilt every frame so they hang with gravity, sway, and fall in with a bounce during the reveal.
web/js/props.js476Props: the phone and its screens, the bill, the keypad, the cubicle, takeout, the egg roll, the salon and its hood dryer, onion rings, the receipt and the stamp, the history pedestals, cobwebs, a pigeon, sax notes, invented tabloids.
web/js/lib.js132Shared helpers: easing and keyframes, seeded randomness, clay and gloss materials with a soft rim, canvas textures, fonts.
web/js/font5.js42A 5x7 dot-matrix font for the LED band, the windows that spell HOLD, the robot's eye strip and its captions.
web/render.mjs36The renderer: serves the film to headless Chromium (WebGL on the CPU through SwiftShader) and saves every frame as a JPEG master. Resumable.
web/index.html3The page the renderer opens.
scene.py83The bridge to the Python pipeline: reads the rendered 3D masters, upscales them and adds the subscribe pill, so studio.render, studio.cuts and studio.thumbs work unchanged.
make_thumbs.py22The thumbnail: the brand cover from studio/brand.py (the same photo chip, Anton headline and italic line as every video) over 3D plates rendered for it (?look=thumb). The words and framing are in song.yaml.
assemble.sh19Assembles the silent 3D masters (16:9 and 9:16) from the rendered frames, and stops if a single frame is missing.

By the numbers

  • 3:26 song, 3:33 video, 12,780 frames rendered (16:9 and 9:16, 30 fps), finished at 2560×1440 for YouTube
  • 47 lyric lines synced to the vocal
  • 900 windows in the tower, 62 of them spell HOLD
  • 1 receipt, 4 lines long, plus coupons

Lyrics

Words and music by aditazzz.

Intro

Your call is very important to us.
Your estimated wait time is forty-seven minutes.
Grok, you take this one.

Verse

Four-dollar charge on my internet bill
Forty-seven minutes and I'm sitting here still
Press one for billing, press two for despair
Press three to hear that nobody's there
I'm a millennial, I'd rather chew glass
Than read the last four of my card out loud. Pass.
So I sent in Grok, said, "Handle this, please"
It called up the number while I ordered Chinese
It's got all day, it can take all the notes
And it doesn't get mad when the saxophone loops

Pre-chorus

We built machines to make us wait
Now our machines wait on their machines

Chorus

Please hold, please hold
Your call is important, I've been told
Estimated wait time: nobody knows
So I sent my bot to sit through the hold
It's pressing zero, it's taking notes
I'm on my second egg roll
Please hold, please hold
I don't wait anymore

Verse

One little bot on a customer line
Pressing the buttons, doing just fine
Transferred to billing, transferred again
Still more polite than I've ever been
Meanwhile I'm eating, I'm pouring a drink
The saxophone's somebody else's problem, I think
It made my request, wrote down the reply
Sent me a summary, concise and dry

Bridge

Call duration: forty-seven minutes.
Representatives contacted: three.
Transfers: four.
Your four-dollar charge was explained.
It is a five-dollar charge now.

Final chorus

Please hold, please hold
Your call is important, I've been told
Two thousand years of human progress
And nobody wants to talk to Comcast
Please hold, please hold
Let the little robots run the show
They can have the phone, they can have the queue
I've got better things to do

Outro

Thank you for calling.
Would you like to complete a brief survey?
Absolutely. I have all day.