Audio route: the native <audio class="clip"> element survived the HyperFrames render — no post-mux was needed. ffprobe confirms an AAC stream in the final MP4, and silence detection puts voice onset at 1.72s (the 1.5s clip start plus the wav's own ~0.2s lead-in) and offset at 6.15s, matching the 4.761s clip.
The voice is a locally synthesized sample (ffmpeg flite filter, voice=kal) — robotic, not a real podcast recording, and the fine print says so on screen. The 56 waveform peaks are the real clip's measured peak envelope (assets/extract_peaks.py, stdlib wave/struct), but the word-caption timings are proportional to word length across the clip, not forced-aligned, so a highlight can sit slightly off its phoneme.
First check round failed on contrast: the fine print at #777 measured 4.42:1 against the background. Brightened to #828282 and the re-check passed 67/67; the render itself was clean first pass — stills at 3.6s (playhead ~44% through the bars, current word in accent) and at 8.4s/11.9s (dimmed outro hold) showed no overlaps or clipping.
Original promptTested
Podcast audiogram — HyperFrames prompt (waveform + word captions)
Banned list —Beat grid —Build method —Self-review —
<direction>
A 12-second square podcast audiogram (1080x1080, 30fps) for the show THE BUILD LOG, episode EP 24 — SHIPPING UGLY. House style: near-black #0a0a0a background, white type, ONE orange accent #ff5c1a, Arial/Helvetica bold, no webfonts. The audiogram plays a real audio clip of the quote Nobody ships the first version. You ship, you listen, you fix.: the waveform is drawn from that clip's measured peak data (56 bars), and the quote runs underneath as captions that light up word by word in time with the voice. Disclose on screen that the audio is a sample.
Banned: fake random waveforms that ignore the audio, stock photos, cover-art mockups, gradients, glows, 3D, real podcast names or real people's voices.
</direction>
<structure>
0.0-1.5s: title card — an accent play badge, THE BUILD LOG large, EP 24 — SHIPPING UGLY in accent underneath. 1.5-6.26s: the clip plays (a 4.76s sample of Nobody ships the first version. You ship, you listen, you fix. starting at 1.5s); a small show header sits at top, the 56-bar waveform centre-frame lights each bar in accent as the playhead passes with a gentle pulse, and the caption words turn accent while spoken, then white. 6.26-12.0s: outro — the waveform settles dim, the finished caption holds in white, and "FULL EPISODE OUT NOW" + THE BUILD LOG hold to the end.
</structure>
<build>
One HyperFrames composition, 1080x1080, seek-driven paused GSAP timeline. Synthesize or record the quote clip first, then extract its real peaks with a small script (stdlib wave/struct, ~56 bars, normalised 0-1) and bake the peaks array plus per-word caption timings into the page as JS data; keep the clip, the script and its peaks.json in an assets/ folder. Mount the clip as an <audio class="clip"> element starting at 1.5s so the render carries the sound, and verify with ffprobe afterwards that the MP4 has an audio stream with voice onset at the clip start. Bars are flex children coloured by timeline tweens at each bar's slice time; caption words are spans tweened grey -> accent -> white on their timings.
</build>
<gotchas>
- A waveform invented in code instead of measured from the clip is a lie the viewer can hear — extract the peaks, every time.
- Word timings proportional to word length are an approximation, not forced alignment; say so in the run log instead of claiming karaoke accuracy.
- Verify the rendered MP4 actually contains audio (ffprobe) — a silent audiogram is just a picture, and the check step will not catch it.
- Keep the sample disclosure on screen for the whole film, not only under the title card.
</gotchas>
Before you finish: step through the timeline at five points and fix anything that overlaps, clips the frame, or drifts off the beat grid.
A square audiogram that plays what it shows: the waveform is the real measured envelope of the bundled sample clip and the captions light word by word, with the synthesized-voice sample disclosed on screen for the whole film.