Product Pitch Video
Produce a finished ~30-second MP4: an Apple-launch-style product film whose
visuals are generated shot-by-shot by Atlas Cloud video models, with an
AI-generated instrumental soundtrack and crisp typography overlaid in post.
The pipeline (storyboard-first)
product URL ─▶ ① understand+derive ─▶ ② pitch script ─▶ ③ pitch.json
(belief/contribution) (beats+keyframes+motion)
─▶ ④ Phase A: keyframe stills ─▶ ⑤ HUMAN REVIEWS STORYBOARD ─▶ ⑥ Phase B: videos+stitch ─▶ final.mp4
(chained image gen, ~$0.3) (re-roll frames cheaply) (parallel, ~$2.7)
You do the creative work in ①–③; scripts/pipeline.mjs does all the machinery
(chained keyframe generation, parallel video generation, polling, download,
overlay rendering, ffmpeg stitching). Never hand-roll API calls or ffmpeg
commands — the scripts handle retries, resume, and cost reporting.
Why this shape:
- Shot-to-shot continuity comes from shared boundary keyframes: keyframe
K_i is shot i's last frame AND shot i+1's first frame. Each keyframe is
generated from the previous one in image-edit mode, so materials, lighting
and the star object carry through the whole film. Videos are generated with
first+last frame conditioning (
image + last_image), and adjacent shots
then cut seamlessly (hard cuts, no crossfade needed).
- Taste decisions happen at image prices. The storyboard gate (⑤) lets the
user re-roll any composition for ~$0.04 before releasing the ~$2.7 video
budget.
- AI video models cannot render text reliably, so prompts describe pure
visuals (no text, no letters, no logos, no UI); all words go into overlays
rendered by a headless browser at pixel-perfect quality.
- Everything is resumable: a crash or re-roll never re-bills completed work.
Classic mode (single video_prompt per shot, text-to-video, xfade transitions)
still works for quick drafts — just omit keyframes from pitch.json.
Prerequisites (check before starting)
ATLAS_CLOUD_API_KEY — env var, or .env file in the working directory
(ATLAS_CLOUD_API_KEY=...). If missing, ask the user for their key. Never
write the key into any file that could be shared/committed except .env.
- ffmpeg — on PATH, or set
FFMPEG_PATH, or place a build at
tools/ffmpeg/bin/ffmpeg.exe relative to the working directory. If absent
on Windows, download the static build from
https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-essentials.zip and unzip
to tools/ffmpeg/.
- Chrome or Edge — used headless for typography overlays (auto-detected).
- Cost awareness: tell the user the estimate before generating. Default
30s film = 6 shots × 5s at 1080p ≈ $2.7 video + ~$0.15 music
(Seedance 2.0 ≈ $0.09/s). Testing/iteration? Use
--res 720p and/or
seedance-2.0-mini (half price) first. The pipeline prints actual billed
tokens at the end.
Workflow
Understand and derive. Two scrapes, complementary:
- Facts (text): WebFetch the URL for capabilities, numbers, price,
tagline, tone of copy; grab the brand accent from the HTML (hex-frequency
count works when compiled CSS has no semantic variables).
- Temperament (visual): screenshot the rendered page and READ it —
node <skill>/scripts/snap_page.mjs <url> --out page.png — then note
dark/light feel, art direction (photographic? illustrated? abstract?),
density vs whitespace, boldness. Text can't carry this, and it should
steer the keyframe designs (an artful-dark brand tolerates bolder
compositions than a clinical-light one).
Then run the derivation protocol in
references/pitch-script-guide.md: facts → what each removes for the user
→ the belief they point to → contribution sentences ("we did X, so you
never Y"). The film argues the belief; it does not recite the feature list.
Write the pitch script. Read references/pitch-script-guide.md. Plan
~6 beats for 30s (belief → reveal → 2 contributions → testimony number →
loop close). For each beat write the overlay copy (Apple voice, terse,
full-width punctuation for Chinese) and the visual state the beat ends
on — those end-states become the keyframes.
Design the keyframe chain + motion. Read
references/shot-prompt-language.md, and pick the brand's archetype from
references/brand-archetypes.md (dev-infra / palette-identity creative /
hardware / luxury / fintech / wellness / entertainment / B2B SaaS) — it
gives the world, texture words, palette policy, tempo and metaphor
vocabulary as a starting recipe. N shots need N+1 keyframes where
K_i = end of shot i = start of shot i+1, all featuring one continuous star
object. K0's prompt carries the full style; later keyframes describe only
the delta from the previous frame. Each shot gets a motion_prompt (pure
motion + camera; frames own the composition). No text in any prompt.
Assemble pitch.json (schema below) in the working directory.
Run Phase A — storyboard.
node <skill>/scripts/pipeline.mjs pitch.json --out pitch-build
All keyframes are generated in ONE batch call to a sequential image model
(bytedance/seedream-v5.0-lite/sequential) — cross-frame consistency is
the model's job, and the whole set lands in a few minutes. The pipeline
writes pitch-build/storyboard.html and stops for review. Show the
storyboard to the user. To re-roll one frame: tweak its prompt, delete
pitch-build/keyframes/<id>.png, rerun — single missing frames regenerate
in edit mode with the previous frame as reference and the
keyframe_style anchor appended, so re-rolls don't drift. A keyframe_style
restraint anchor in pitch.json is mandatory — see the keyframe section of
references/shot-prompt-language.md for the block and why image models
need it.
Run Phase B — film. Rerun the same command once the storyboard is
approved. Shots generate in parallel (first+last frame conditioned,
1–5 min each), overlays render, hard-cut stitch, soundtrack mixed →
pitch-build/final.mp4. Resumable at every step; to redo one shot delete
shots/<id>.mp4 + work/<id>.mp4 and rerun. Individual stages run alone
(gen_image.mjs, gen_video.mjs, gen_music.mjs, overlay.mjs,
stitch.mjs); references/atlas-api.md has the raw API for debugging.
Review and deliver. Extract a few frames with ffmpeg to sanity-check
(text legibility, cut seamlessness at shared keyframes). Report the actual
cost printed by the pipeline. Offer targeted re-rolls rather than full
regeneration.
pitch.json schema (v2 — storyboard mode)
{
"product": "Aura",
"accent": "#7F72F7",
"ratio": "16:9",
"resolution": "1080p",
"fps": 30,
"cut": "hard",
"model": "bytedance/seedance-2.0/image-to-video",
"image_model": "bytedance/seedream-v5.0-lite/sequential",
"edit_model": "bytedance/seedream-v5.0-pro",
"keyframe_style": "<the restraint anchor — see shot-prompt-language.md>",
"music": {
"model": "minimax/music-2.6",
"prompt": "minimal ambient electronic, evolving pads, subtle pulse, cinematic, luxurious, 90bpm, instrumental",
"instrumental": true
},
"keyframes": [
{ "id": "K0", "prompt": "<full scene + style — text-to-image>" },
{ "id": "K1", "prompt": "The same scene and lighting. <only the delta> — edit from K0" }
],
"shots": [
{
"id": "s1-belief",
"duration": 5,
"from": "K0",
"to": "K1",
"motion_prompt": "<pure motion + camera between the two frames>",
"overlay": {
"type": "statement",
"text": "模态之间,{{不该有墙}}。",
"in": 1.0,
"out": 4.5
}
}
]
}
Classic mode: omit keyframes, give each shot a video_prompt instead of
from/to/motion_prompt, and transitions become 0.5s crossfades
("crossfade": 0.5 to tune).
Overlay types (rendered by assets/overlay.html, same Apple type system as
the launch-video skill): statement (one big line), hero (kicker + product
name + subline), number (giant value + unit + label), closing (name +
tagline + cta). in/out are seconds within the shot when the text fades
in/out (leave ≥0.8s of clean footage at each end so crossfades never cut
through text). {{braces}} in any text paint that phrase in the accent color.
pos places the text block vertically: center (default), lower (lower
third — use for statements over center-bright subjects), upper. Vary
positions across the film and match them to the keyframe compositions (see
the text-zone rule in references/shot-prompt-language.md).
Top-level "overlay_theme": "dark" | "light" picks the type color: dark
(default, white text) for dark films, light (ink text) when the brand's
temperament calls for a bright film — white-on-light is invisible. Per-overlay
theme overrides for mixed films.
Image model options: bytedance/seedream-v5.0-lite/sequential (batch mode —
whole keyframe set in one call, best consistency) or a chain-mode family like
openai/gpt-image-2 (no sequential variant; frames generate one-by-one, each
edit-conditioned on the previous — slower but strong per-frame quality, and
cheap). The pipeline picks the right path from the model name.
Quality bar
- Style block identical in every shot prompt; palette words match the brand
accent. One motion per shot — no shot-within-shot montages.
- No text of any kind requested from the video model.
- Overlay copy survives the giant-screen test: short, declarative, specific.
- Chinese copy uses full-width punctuation (,。、) — half-width commas read
as cheap.
- Total = shots×duration − crossfades; keep 28–32s for a "30 second" ask.
- Before calling it done, confirm
final.mp4 exists, has audio, and its
duration matches (ffprobe is printed by the pipeline).
1---2name: product-pitch-video3description: Turn a product website URL (or a product description) into a real, finished MP4 pitch video in Apple WWDC launch style: AI-generated cinematic shots (liquid glass / luxury-tech CGI) via Atlas Cloud video models, AI-generated soundtrack, premium typography overlaid in post, auto-stitched with ffmpeg. Use whenever the user wants an actual video file for a product: "pitch video", "产品宣传视频", "生成一条视频", "宣传片成片", "WWDC 风格视频", "AI 生成产品视频", "出一条 30 秒的片子", or gives a product URL and asks for a video/film/广告片. This produces a real .mp4 by calling paid generation APIs — distinct from the apple-launch-video skill, which renders a free HTML animatic; prefer THIS skill when the deliverable is a video file, and mention the HTML animatic as a free preview option for the script.4---56# Product Pitch Video78Produce a finished ~30-second MP4: an Apple-launch-style product film whose9visuals are generated shot-by-shot by Atlas Cloud video models, with an10AI-generated instrumental soundtrack and crisp typography overlaid in post.1112## The pipeline (storyboard-first)1314```15product URL ─▶ ① understand+derive ─▶ ② pitch script ─▶ ③ pitch.json16 (belief/contribution) (beats+keyframes+motion)17 ─▶ ④ Phase A: keyframe stills ─▶ ⑤ HUMAN REVIEWS STORYBOARD ─▶ ⑥ Phase B: videos+stitch ─▶ final.mp418 (chained image gen, ~$0.3) (re-roll frames cheaply) (parallel, ~$2.7)19```2021You do the creative work in ①–③; `scripts/pipeline.mjs` does all the machinery22(chained keyframe generation, parallel video generation, polling, download,23overlay rendering, ffmpeg stitching). Never hand-roll API calls or ffmpeg24commands — the scripts handle retries, resume, and cost reporting.2526**Why this shape:**27- **Shot-to-shot continuity** comes from shared boundary keyframes: keyframe28 K_i is shot i's last frame AND shot i+1's first frame. Each keyframe is29 generated from the previous one in image-*edit* mode, so materials, lighting30 and the star object carry through the whole film. Videos are generated with31 first+last frame conditioning (`image` + `last_image`), and adjacent shots32 then cut seamlessly (hard cuts, no crossfade needed).33- **Taste decisions happen at image prices.** The storyboard gate (⑤) lets the34 user re-roll any composition for ~$0.04 before releasing the ~$2.7 video35 budget.36- AI video models cannot render text reliably, so *prompts describe pure37 visuals* (no text, no letters, no logos, no UI); all words go into *overlays*38 rendered by a headless browser at pixel-perfect quality.39- Everything is resumable: a crash or re-roll never re-bills completed work.4041Classic mode (single `video_prompt` per shot, text-to-video, xfade transitions)42still works for quick drafts — just omit `keyframes` from pitch.json.4344## Prerequisites (check before starting)4546- `ATLAS_CLOUD_API_KEY` — env var, or `.env` file in the working directory47 (`ATLAS_CLOUD_API_KEY=...`). If missing, ask the user for their key. Never48 write the key into any file that could be shared/committed except `.env`.49- **ffmpeg** — on PATH, or set `FFMPEG_PATH`, or place a build at50 `tools/ffmpeg/bin/ffmpeg.exe` relative to the working directory. If absent51 on Windows, download the static build from52 `https://www.gyan.dev/ffmpeg/builds/ffmpeg-release-essentials.zip` and unzip53 to `tools/ffmpeg/`.54- **Chrome or Edge** — used headless for typography overlays (auto-detected).55- **Cost awareness**: tell the user the estimate before generating. Default56 30s film = 6 shots × 5s at 1080p ≈ **$2.7** video + ~$0.15 music57 (Seedance 2.0 ≈ $0.09/s). Testing/iteration? Use `--res 720p` and/or58 `seedance-2.0-mini` (half price) first. The pipeline prints actual billed59 tokens at the end.6061## Workflow62631. **Understand and derive.** Two scrapes, complementary:64 - *Facts* (text): WebFetch the URL for capabilities, numbers, price,65 tagline, tone of copy; grab the brand accent from the HTML (hex-frequency66 count works when compiled CSS has no semantic variables).67 - *Temperament* (visual): screenshot the rendered page and READ it —68 `node <skill>/scripts/snap_page.mjs <url> --out page.png` — then note69 dark/light feel, art direction (photographic? illustrated? abstract?),70 density vs whitespace, boldness. Text can't carry this, and it should71 steer the keyframe designs (an artful-dark brand tolerates bolder72 compositions than a clinical-light one).7374 Then run the **derivation protocol** in75 `references/pitch-script-guide.md`: facts → what each removes for the user76 → the belief they point to → contribution sentences ("we did X, so you77 never Y"). The film argues the belief; it does not recite the feature list.78792. **Write the pitch script.** Read `references/pitch-script-guide.md`. Plan80 ~6 beats for 30s (belief → reveal → 2 contributions → testimony number →81 loop close). For each beat write the **overlay copy** (Apple voice, terse,82 full-width punctuation for Chinese) and the **visual state** the beat ends83 on — those end-states become the keyframes.84853. **Design the keyframe chain + motion.** Read86 `references/shot-prompt-language.md`, and pick the brand's archetype from87 `references/brand-archetypes.md` (dev-infra / palette-identity creative /88 hardware / luxury / fintech / wellness / entertainment / B2B SaaS) — it89 gives the world, texture words, palette policy, tempo and metaphor90 vocabulary as a starting recipe. N shots need N+1 keyframes where91 K_i = end of shot i = start of shot i+1, all featuring one continuous star92 object. K0's prompt carries the full style; later keyframes describe only93 the delta from the previous frame. Each shot gets a `motion_prompt` (pure94 motion + camera; frames own the composition). No text in any prompt.95964. **Assemble `pitch.json`** (schema below) in the working directory.97985. **Run Phase A — storyboard.**99 ```100 node <skill>/scripts/pipeline.mjs pitch.json --out pitch-build101 ```102 All keyframes are generated in ONE batch call to a *sequential* image model103 (`bytedance/seedream-v5.0-lite/sequential`) — cross-frame consistency is104 the model's job, and the whole set lands in a few minutes. The pipeline105 writes `pitch-build/storyboard.html` and **stops for review**. Show the106 storyboard to the user. To re-roll one frame: tweak its prompt, delete107 `pitch-build/keyframes/<id>.png`, rerun — single missing frames regenerate108 in *edit* mode with the previous frame as reference and the109 `keyframe_style` anchor appended, so re-rolls don't drift. A `keyframe_style`110 restraint anchor in pitch.json is mandatory — see the keyframe section of111 `references/shot-prompt-language.md` for the block and why image models112 need it.1131146. **Run Phase B — film.** Rerun the same command once the storyboard is115 approved. Shots generate in parallel (first+last frame conditioned,116 1–5 min each), overlays render, hard-cut stitch, soundtrack mixed →117 `pitch-build/final.mp4`. Resumable at every step; to redo one shot delete118 `shots/<id>.mp4` + `work/<id>.mp4` and rerun. Individual stages run alone119 (`gen_image.mjs`, `gen_video.mjs`, `gen_music.mjs`, `overlay.mjs`,120 `stitch.mjs`); `references/atlas-api.md` has the raw API for debugging.1211227. **Review and deliver.** Extract a few frames with ffmpeg to sanity-check123 (text legibility, cut seamlessness at shared keyframes). Report the actual124 cost printed by the pipeline. Offer targeted re-rolls rather than full125 regeneration.126127## pitch.json schema (v2 — storyboard mode)128129```json130{131 "product": "Aura",132 "accent": "#7F72F7",133 "ratio": "16:9",134 "resolution": "1080p",135 "fps": 30,136 "cut": "hard",137 "model": "bytedance/seedance-2.0/image-to-video",138 "image_model": "bytedance/seedream-v5.0-lite/sequential",139 "edit_model": "bytedance/seedream-v5.0-pro",140 "keyframe_style": "<the restraint anchor — see shot-prompt-language.md>",141 "music": {142 "model": "minimax/music-2.6",143 "prompt": "minimal ambient electronic, evolving pads, subtle pulse, cinematic, luxurious, 90bpm, instrumental",144 "instrumental": true145 },146 "keyframes": [147 { "id": "K0", "prompt": "<full scene + style — text-to-image>" },148 { "id": "K1", "prompt": "The same scene and lighting. <only the delta> — edit from K0" }149 ],150 "shots": [151 {152 "id": "s1-belief",153 "duration": 5,154 "from": "K0",155 "to": "K1",156 "motion_prompt": "<pure motion + camera between the two frames>",157 "overlay": {158 "type": "statement",159 "text": "模态之间,{{不该有墙}}。",160 "in": 1.0,161 "out": 4.5162 }163 }164 ]165}166```167168Classic mode: omit `keyframes`, give each shot a `video_prompt` instead of169`from`/`to`/`motion_prompt`, and transitions become 0.5s crossfades170(`"crossfade": 0.5` to tune).171172Overlay `type`s (rendered by `assets/overlay.html`, same Apple type system as173the launch-video skill): `statement` (one big line), `hero` (kicker + product174name + subline), `number` (giant value + unit + label), `closing` (name +175tagline + cta). `in`/`out` are seconds within the shot when the text fades176in/out (leave ≥0.8s of clean footage at each end so crossfades never cut177through text). `{{braces}}` in any text paint that phrase in the accent color.178`pos` places the text block vertically: `center` (default), `lower` (lower179third — use for `statement`s over center-bright subjects), `upper`. Vary180positions across the film and match them to the keyframe compositions (see181the text-zone rule in `references/shot-prompt-language.md`).182Top-level `"overlay_theme": "dark" | "light"` picks the type color: `dark`183(default, white text) for dark films, `light` (ink text) when the brand's184temperament calls for a bright film — white-on-light is invisible. Per-overlay185`theme` overrides for mixed films.186187Image model options: `bytedance/seedream-v5.0-lite/sequential` (batch mode —188whole keyframe set in one call, best consistency) or a chain-mode family like189`openai/gpt-image-2` (no sequential variant; frames generate one-by-one, each190edit-conditioned on the previous — slower but strong per-frame quality, and191cheap). The pipeline picks the right path from the model name.192193## Quality bar194195- Style block identical in every shot prompt; palette words match the brand196 accent. One motion per shot — no shot-within-shot montages.197- No text of any kind requested from the video model.198- Overlay copy survives the giant-screen test: short, declarative, specific.199- Chinese copy uses full-width punctuation (,。、) — half-width commas read200 as cheap.201- Total = shots×duration − crossfades; keep 28–32s for a "30 second" ask.202- Before calling it done, confirm `final.mp4` exists, has audio, and its203 duration matches (ffprobe is printed by the pipeline).