TL;DR: I made a 12-second, 1080×1080 product sting for Mean CEO's Blog without a video editor. Claude Code wrote the animation as one HTML page, rendered it frame by frame with Playwright, synced it to a free house track at 124 BPM and mastered the sound to −14 LUFS. The whole thing took one working session. Below is the exact process and the full prompt, so you can make your own.

Bootstrapped founders need launch assets, and a motion designer costs real money. A short product sting works on LinkedIn, in a pitch deck, at the top of a landing page and as a sign-off on your videos. This guide shows you how to get one built by an AI coding agent while you keep creative control.

What you will end up with

  • A 12-second square video (1080×1080) rendered at 59.94 fps.
  • An Apple-keynote look: soft light, frosted glass, a moving camera and motion blur.
  • A story in eight shots: your logo and name rise into an app window, a cursor clicks, your logo becomes an app icon, a prompt gets typed into a frosted search box, your homepage scrolls in, two feature cards appear, and a glowing wordmark closes the film.
  • A soundtrack: licence-free music with the drop landing on a cut, plus synthesised clicks, whooshes and hits.
  • The source files, so you can change any frame and re-render in under a minute.

What you need

  • Claude Code (desktop app or terminal).
  • Node.js and ffmpeg installed. Python 3 with numpy for the audio.
  • A folder containing:
    • your logo (PNG, square, at least 400 px)
    • your brand file with colour codes (mine is a DESIGN.md with hex values and type rules)
  • Your website URL, so Claude can pull real copy instead of inventing it.

Cost: one Claude Code session. The music came from Mixkit under its free licence, with no attribution required.

Step 1: Prepare your inputs

Decide these before you write a word of prompt:

  1. The one line a user types. Mine was my homepage title: "Startup platform for female founders bootstrapping in Europe". When the prompt matches the page that answers it, the film pays off by itself.
  2. The answer page. A title, two or three sentences, and one key phrase that gets bolded. Mine: "the no-fluff operating desk".
  3. Two feature names for the stacked cards. Short words work best, because they become huge glass letters. I used "Validate" and "Growth", taken from my "Start here" guides.
  4. A music track. Pick something with a clear drop. House at 124 BPM is a good fit for a 12-second edit.

If you are unsure about any of them, tell Claude to pull them from your website. That is what I did.

Step 2: Write the prompt as a shot list

The prompt below does the heavy lifting. It is written like a director's brief: timing in frame numbers, coordinates in pixels, a banned list and a render spec. Precision here saves you rounds of feedback later.

Copy it, swap in your inputs, and keep the structure.

Open the full product-sting prompt
<inputs>
website: https://blog.mean.ceo/;
a logo is in the folder you are working in;
my brand colors are in the design.md in the same folder;
the one-line thing a user types into the prompt box: Startup platform for female founders bootstrapping in Europe;
the page that answers it (title + 2–3 sentences with one key phrase) is the homepage;
two feature names for the stacked cards (not sure, pull from the website); and "Sound", and Mixkit's free house track "Rising Forest" slowed to 124 BPM.
</inputs>

<direction>
A 12 second square product sting, 1080x1080, frame numbers at 29.97 fps (f0–f359), master rendered at 59.94 fps. Apple-keynote feel: soft, white, bright blue, glassy. The camera never cuts on a still frame: every shot enters already moving (exponential ease-out, 12–19% of the remaining distance per frame) and leaves on an accelerating move or a blur ramp. Blur follows speed and direction on every move.
Palette: my brand colours mapped onto these roles; if I give none, use page #FDFDFB, haze #B7CFEB, ice #E6F0FA, deep blue #294376 → #769CC2 sky gradient, navy #1E2F52, accent blues #2F6BFF / #3CC8F0 / mint #4ED6A0, white. Type: Inter (400/500/600/700). No purple, violet, magenta or orange anywhere.
Story: the product header rises out of a blue haze inside a light app window → a cursor glides in, turns to face where it's going, grows on hover and clicks the logo → hard cut on the music drop to the app icon with four squares orbiting into a cross → the icon collapses into a Mac menu bar → the cursor clicks the menu-bar icon, a frosted glass prompt box springs out and the prompt types → whip-tilt up through a light-blue flash into the answer page scrolling into place → a card rises over it → blur-dissolve to two stacked cards with giant frosted-glass titles → blur-dissolve to the lone logo disc → hard cut to a black end card with a glowing wordmark.
Banned: crossfades, frozen frames (except one hold in S7), stock UI kits, glows on UI text, Math.random, anything that looks like a template.
</direction>

<structure>
Coordinates are px on the 1080 stage. Music beat k = 0.048 + 0.4838·k s (124 BPM, one beat = 14.5 frames). The three hard cuts f72, f101, f159 land 2 frames before a beat: keep these exact frames.
S1 f0–71, header + window + click: haze #B7CFEB fading to #FDFDFB by f28, keep a blue floor glow #DBEEFD at the bottom. Header on one line: logo disc ⌀132 (#FBFCFE, 1px rim #E8E8EA, dark mark), the product name (Inter 500), a dark capsule pill "on Whop" (#2F2E2F, white text); the whole lockup spans x474–1063, centre line rises y932 (f0) → 776 (f2) → 683 (f5) → 608 (f10) → 546 (f24) → 536 (f37), drifting 1 px/frame after. Name appears f2 blurred, pill f4–5 heavily blurred and sliding 15 px left as it sharpens. A light hub window (radius 93, fill #FCFDFF, top band #F1F6FF, blue inner floor glow) fades in around it: opacity 0 to f14, 0.53 f15, 0.7 f19, 1.0 f24; top-left corner (408,405), runs off the right and bottom. Inside: a search pill in the top band, a left icon column (Courses icon at (537,739), faded Chat icon at (537,900)), and a course card from (764,700) off-frame with its cover image, title and "Course · 8 lessons". Cursor (black macOS arrow, white outline, 32x39) appears f27 at (891,393), glides left decelerating to (770,383) f44, rotates to point down-left f47–51 as it dives, lands on the disc's lower right (629,564) f56 → (587,546) f59 → (555,531) f71; grows ×1.55 on hover from f56; a soft ice ring (#D5F3FF → #F7FEFF, outer ⌀174) lights around the disc from f53. Camera zooms about (540,540): 1.0 f46 → 1.2 f60 ease-in-out, holds f61, then eases out accelerating to 1.04 at f71 while the cursor presses (shrinks 15% f69–71).
S2 f72–100, icon + orbit: navy squircle app icon (#294376 → #1E2F52, white mark), 276 px at f72 shrinking ease-out to 178 px by f86, radius 28% of width, on a grey halo disc #E9E9E7 growing ⌀240 (f75) → 326 (f86). Four 92 px squares (radius 26) spin in counter-clockwise, decelerating, and lock into a cross at orbit radius ≈216 by f86: white (1px #E3E8EF edge + faint shadow) left, #2F6BFF top, #3CC8F0 right, #4ED6A0 bottom. f88–100: the icon shrinks accelerating to ≈40 px, the squares slide into a row on its right (white slips behind the icon), blur ramps 0.3 → 6 px.
S3 f101–158, menu bar + prompt: white page above a black laptop bezel band (y425–475, top highlight #686866), a dark navy menu bar (y477–538), wallpaper below = the blue sky gradient with thin white line art (one big circle, two horizontal lines, one vertical, a four-point sparkle at a crossing, soft teal glow top-right). Menu bar right cluster in white: Wi-Fi, battery, toggles, the product mark at x531–584, three ⌀36 dots #2F6BFF / #3CC8F0 / #4ED6A0 at x612, 661, 709, "Mon Jun 22  9:41 AM" 34 px. Enters blurred 3 px and settling by f110. Cursor rises from below (f102), sits on the mark, presses f113–117. Camera pans content right +125 px f115–130 (fastest f118–120). A frosted glass box (white-blue glass over the sky, bright top rim, radius 60) springs out from under the mark f116: width peaks 744 at f126 and settles 726x228 by f138 around x196–922, y568–797. The prompt types from f121 (first legible "Make ") to f150 (complete) at about 1 char/frame with a 1-frame hold every 2–3 chars; caret always on; three white outline icons along the bottom; send button #2F6BFF ⌀51 with a white up arrow. From f136 the whole scene drifts up, accelerating into a whip-tilt (f158 moving ≈25 px/frame, vertical blur ≈6–8 px) while the page tints #E6F4FE over f154–158.
S4 f159–186, answer page: a light course lesson page (breadcrumb, title, body): text column x120, body 47 px Inter 400 grey #BCBCBA, line pitch 58, one key phrase ("frame for frame") in black 600. It arrives smeared and 420 px low, scrolls up with offsets 420, 315, 210, 170, 140, 116, 96, 81 (f166) … 14 (f175) … 0 (f180), then creeps −6 px by f186. Blur 24 px (f159) → 1.5 (f165) → 0. Flash #E2F4FE fading to #FDFDFB by f165. A cursor pointing straight up rides the scroll and stops under the key phrase (≈(450,591) f180), then drifts right.
S5 f187–214, card: a white card (x203–878, runs off the bottom) rises over the page: cover image 627x536 inset 24 px, radius 64, a light grabber bar at its top centre, caption semibold 38 px black, sub-caption grey 23 px. Cover top y642 (f187) → 456 (f191) → 395 (f196) → 369 (f200) → 348 (f205), then keeps drifting up ~4 px/frame. Card blur peaks 3.8 px at f189, sharp by f201; the page behind blurs to ≈2.5 px. Exit f207–214: card shrinks ~5% and rises while the whole frame blurs 1 → 7 px; cut at the blur peak.
S6 f215–244, two cards: white page, two stacked cards 538x348 (radius 57, gap 36) centred on x540, top card settling at y168 by f230, bottom at y552. Each: cover art (no text baked into it), a frosted pill top-left ("Module 3" / "Module 5"), a frosted round "•••" top-right, and a huge bold title along the bottom edge made of frosted glass (a blurred, lightened copy of the image clipped to the letters, cut off by the card's bottom edge): "Launch" and "Sound". Both enter blurred 12 px and sharp by f224; the top card enters 8% large and rises from y264; the bottom card rises from y927, staggered behind it. They drift up 3 px/frame f230–238, then accelerate up and blur out into the cut.
S7 f245–300, logo disc: page #FDFDFB, disc ⌀168 #F6F6F6 with the dark mark, rises into the centre (top y569 f245 → 491 f250 → 468 f255 → 456 f269) with a vertical smear on the cut frame, holds still f269–287 (the only frozen stretch), then shrinks accelerating to ⌀123 at f300.
S8 f301–359, end card: black radial background (#020204 corners, ≈#272729 around the word), the wordmark in Inter 600, white #F3F3F5 with a tight glow plus a wide soft halo, centred (540,540). Word width: ≈1650 px f301 (horizontally smeared, zoom streaks) → 1350 f302 → 1110 f303 → 1049 f304 → 734 f309 → 678 f311 → 563 f320 → 516 f342 (≈1 px/frame shrink) → 492 f350, then collapses ease-in: 450 f355 → 267 f359 with blur rising to 3.5 px. The film ends mid-collapse.
</structure>

<build>
1. One HTML page, 1080x1080, drawn by seek(t) as a pure function of the frame number. No CSS transitions, no timers, no Math.random (seeded hashes only). Shots register as {f0, f1, render(localFrame)}.
2. Every value is continuous in the frame number (the 59.94 master renders half frames): animate with keyframe tables kf(frame, [[f, value], ...], ease) and per-frame lookup tables with linear interpolation. No Math.floor on motion.
3. Blur: CSS filter blur for round blur, SVG feGaussianBlur with separate x/y stdDeviation for directional smears. Zoom smear on the end card = 20–30 scaled, faded copies of the word. Frosted glass = a blurred, lightened copy of what's behind, clipped to the shape.
4. Cursor: one SVG macOS arrow (black fill, white outline, soft shadow) with rotation and scale, reused in S1, S3, S4.
5. Sound (no voice), exactly 12.075 s: music at 124 BPM, soft intro, the drop at 2.47 s (beat 5, the f72 cut leads it by 2 frames). Synthesized SFX: soft impact 0.10 s; whooshes peaking at the cuts 2.402, 3.370, 5.305, 10.043 s; transition hits exactly on 6.240 s and 8.175 s; clicks at 2.33 and 3.83 s; very quiet key ticks every ~32 ms over 4.04–5.00 s; a soft shimmer at 10.05 s. Master to −14 LUFS, true peak −1 dBTP, no fade except the last 60 ms.
6. Render with Playwright (one screenshot per frame, fonts loaded first), encode H.264 yuv420p at 60000/1001, mux the audio.
</build>

<gotchas>
Measure text only after the fonts load. A long product name won't fit where a 5-letter name did: scale the whole lockup (disc gap, name, pill) to fit the span x474–1063, don't let the pill fall off-frame. A white orbit square vanishes on the white page without a 1px edge and a faint shadow. Don't put images with their own text inside the S6 cards, or the glass title doubles up. Keep the cut frames exact even where they don't sit on a beat. Nothing freezes except S7 f269–287. Heavy blur tables can wipe a shape out completely: if a frame looks empty, lower the blur until the shape still reads.
</gotchas>

<start>
Ask me for the inputs. Then show me 4 stills (f40 header in the window, f86 icon cross, f150 finished prompt, f230 the two cards) before you render the full film.
</start>

Why this structure works:

  • Frame numbers instead of seconds. "f72" cannot be misread. It also lets you hit music beats exactly.
  • A banned list. Crossfades, frozen frames and template looks are the fastest way to make AI video feel cheap. Naming them up front removes them.
  • A gotchas block. Each line prevents a bug I would otherwise have found in review.
  • A checkpoint. Asking for four stills before the full render means you review the look while changes are still cheap.

Step 3: Let Claude read your brand before it builds

Claude opened my DESIGN-mean-ceo.md, read blog.mean.ceo and then asked me four questions. These were real decisions, so answer them deliberately:

  1. Logo conflict. My logo is a photo with a purple band and a sunset. The prompt banned purple and orange. I first tried a flat "#MC" monogram, did not love it, and switched back to the original photo logo. Claude clipped it to a circle and put it inside a frosted squircle for the app icon.
  2. The pill text. "on Whop" became "Blog".
  3. Music. Download the Mixkit track, or synthesise an original one. I chose the download.
  4. Fonts. Inter from the prompt, or my brand's Work Sans and Lato. I kept Inter for the keynote look.

The brand colours were mapped onto the prompt's roles:

Prompt rolePageMean CEO colourCream #FAF7EF
Prompt roleHaze and skyMean CEO colourTurquoise #6CE5E8 and deeper teal tints
Prompt roleNavyMean CEO colourInk #1A1A1A
Prompt roleAccent 1Mean CEO colourRed #D61F2C
Prompt roleAccent 2Mean CEO colourTurquoise #6CE5E8
Prompt roleAccent 3Mean CEO colourMint #7BDCB5

Tip: keep your brand file in the project folder. Claude found my exact hex codes there, so nothing was guessed.

Step 4: How the animation is built

You do not need to write this code, but knowing how it works helps you give better feedback.

  • One HTML page is the whole film. Every element is positioned by a single function, seek(frame). Give it a frame number and it draws that exact moment. Nothing depends on the previous frame, so any frame can be rendered in any order.
  • Motion comes from keyframe tables. For example, the header's height is a table of values at f0, f2, f5, f10, f24 and f37, joined by smooth curves.
  • Motion blur follows speed. Every move computes its own velocity, and blur grows with it. That is why fast whips smear and slow drifts stay sharp.
  • Frosted glass is a blurred, lightened copy of the background. It is clipped to the box or to the letters of a title. The "Validate" and "Growth" titles are made this way.
  • Cover art is generated. The card images are abstract SVG drawings in brand colours (search-demand bars, a founder network), with no stock photos and no text inside them.

Step 5: Review stills, then preview motion

Claude rendered the four checkpoint stills (f40, f86, f150, f230) and then checked about 80 more frames on contact sheets before showing me anything. It caught three problems on its own:

  • menu-bar items overlapping the Wi-Fi and battery icons
  • the cursor hiding the logo after the click
  • slow-moving cards looking soft because the blur rule was too strong for slow speeds

For previewing, you get two options:

  1. A silent draft video (720 px, 30 fps). It renders in about 20 seconds and is the best way to judge timing.
  2. A live preview in the browser with play, pause, a scrubber and frame stepping. Run a local server in the project folder:
python3 -m http.server 8765

Then open http://localhost:8765/index.html?preview&f=0.

Feedback at this stage should be specific: name the frame and say what is wrong. "The logo at f40" is actionable. "Make it pop" costs you a round.

Step 6: Sync the music to the cuts

This is the step that makes it feel professional.

  1. Measure the track's tempo. Claude analysed "Rising Forest" by Diego Nava and found it was already 124.00 BPM, so no slowing was needed.
  2. Find the real drop. The energy analysis found an 8-bar breakdown with no bass, followed by the kick and bass returning at 46.47 s in the source.
  3. Line the drop up with the cut. The music was trimmed so the drop lands at exactly 2.467 s, one beat after the first hard cut. The first 2.4 seconds use the track's own quiet build as the intro.
  4. Check the grid. Every beat landed within 5 ms of the planned grid.

The key detail: Claude's first guess at the drop was off by one beat. A per-beat bass check exposed it, and the fix moved the cut to the true downbeat. If you do this by hand, check each beat's bass energy around the drop instead of trusting bar counts.

Step 7: Add sound effects and master

All effects were synthesised in Python, so there are no sample licences to worry about:

  • a soft low impact at the start
  • whooshes peaking on each hard cut
  • two transition hits at 6.240 s and 8.175 s
  • mouse clicks on both cursor presses
  • very quiet keyboard ticks while the prompt types
  • a shimmer on the end card, tuned to the track's key (E major)

Mastering targets: −14 LUFS integrated (the level most social platforms normalise to) and −1 dBTP true peak, with a fade only on the last 60 ms. The final measured −14.1 LUFS and −1.5 dBTP.

Step 8: Render the master

Playwright opens the HTML page, waits for fonts and images, then screenshots all 720 frames (every half frame for 59.94 fps). The frames go straight into ffmpeg:

node render.mjs film

Settings: H.264, yuv420p, BT.709 colour, CRF 14, 60000/1001 fps. The full render took about 35 seconds on a MacBook. The audio is then added as 320 kbps AAC.

Before delivering, Claude checked the final file for frozen stretches and cut positions. The only still moment is the intentional logo hold, and the hard cuts sit on the exact planned frames.

Mistakes to avoid

  • Vague prompts. "Make a cool launch video" gets you a template. Frame numbers, pixels and a banned list get you a film.
  • Skipping the stills checkpoint. A full re-render is quick, but rethinking the look after sound is synced costs far more time.
  • Stock images with text inside. Frosted-glass titles over an image that already has text look doubled and messy.
  • Trusting automatic beat detection blindly. Verify the drop beat by beat.
  • Forgetting licences. Mixkit's free licence covers commercial use. Check the terms of any track you pick.

Your checklist

  1. Put your logo and brand file in one folder.
  2. Pick your prompt line, answer page, two feature words and a track with a clear drop.
  3. Paste the prompt above with your inputs.
  4. Answer Claude's questions about conflicts in your brand.
  5. Review four stills and name frames when you give feedback.
  6. Watch the silent draft.
  7. Say go, and get the final film with synced sound.

If you build one, send it my way and I will publish it. I want to see what other founders make with this.