Clean first pass: check passed with only the house-standard first_frame_empty warning, stills at 1.8s/4.2s/5.9s showed no overlaps or clipping, and the first render (41.9s) was the final render.
Banned list —Beat grid —Build method —Self-review —
<direction>
Build a 6-second YouTube channel intro (name sting + tagline) as a single HyperFrames composition, 1280x720, 30fps. It has one job: in the first five seconds a new viewer must learn the channel name, what the channel promises, and that videos arrive weekly.
House style: background #0a0a0a, white type, ONE orange accent #ff5c1a, Arial/Helvetica bold only. NO webfonts, no gradients, no glows, no 3D, no stock imagery, no sound design — type, one rule and one pill carry the whole film.
Channel name: FRAME BY FRAME. Tagline: ONE BUILD, EVERY WEEK..
Banned: slow cinematic fades longer than 0.6s, particles, lens flares, bouncing cartoon easing, more than one accent colour, any element still moving after 5.2s.
</direction>
<structure>
0.0-0.6s — Orange kicker "WELCOME TO" slides in from the left at top-left (70px, 48px), 22px, letter-spacing 5px.
0.6-2.2s — FRAME BY FRAME lands HUGE at centre (96px, weight 900), letter by letter: each letter rises 34px and fades in, staggered 0.1s per letter.
2.2-3.2s — An orange rule (560x6px, centred) draws left-to-right under the name; ONE BUILD, EVERY WEEK. fades in below it (27px, letter-spacing 5px).
3.2-5.2s — A bottom-centre pill (450x58px, dark fill, thin grey border) fades/scales in reading "NEW VIDEO EVERY WEEK", with a small orange bell dot at its left that pulses twice (scale 1.45 and back, ~3.9s and ~4.6s).
5.2-6.0s — Clean hold. Nothing moves.
</structure>
<build>
One root div, data-composition-id "main", data-duration 6, 1280x720. Every element is a .clip child with data-start/data-duration/data-track-index. Split the channel name into one inline-block span per letter (keep real spaces as fixed-width spacer spans) so the stagger can target letters. Build ONE paused GSAP timeline, register it as window.__timelines["main"], and end the script with tl.seek(0). Load GSAP from a local gsap.min.js file only — never a CDN. Set every element's starting state with gsap.set before the timeline so frame 0 is deterministic.
</build>
<gotchas>
- Letter spans must be inline-block or the y-rise transform is ignored and the name just fades as a block.
- Keep the letter stagger tight (0.1s): at 0.15s+ the last letters land after the rule starts and the beats collide.
- The pill text is centred across the full pill width; the bell dot sits in the left padding — do not centre the text around the dot.
- The intro must read perfectly as a still at 5.5s: name, rule, tagline and pill all fully landed, because players show late frames as thumbnails.
</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.
Built and rendered exactly as prompted: letter-by-letter name landing, drawn rule and a twice-pulsing pill all hit their beats, and the 5.9s still reads as a complete channel card. The checker passed with only the standard first-frame-empty warning (the kicker starts at 0s, so frame 0 is near-black by design).