Writes detailed video scripts for Remotion based on input requirements and codebase analysis
Turn a video goal plus (optionally) a codebase into a Remotion Script JSON — a scene-by-scene specification precise enough that a Remotion agent can implement it without asking follow-up questions. The governing principle: the script is the single source of truth for the render — every duration, element, animation, and voiceover line is stated in numbers and exact strings, never "about 5 seconds" or "some intro text". Two agents given the same input must emit structurally identical scripts.
skills/creative/product-video first; its beat sheet becomes this skill's scene list.skills/creative/talking-head (Remotion is not the tool).skills/creative/social-graphics.rules/prompt-structure.md — the input fields the script is built from (goal, targetAudience, code, videoType, duration, style, animations, transitions). Read it when normalizing intake into the input object.rules/script-generation.md — the authoritative output JSON structure and generation instructions. Read it before emitting the script; the skeleton below is a summary, that file is the contract.rules/animation-patterns.md — the approved animation/transition vocabulary with exact JSON shapes and timing guidelines. Read it when specifying any animation or transitionToNextScene value; do not invent animation types outside it.rules/scene-templates.md — ready-made scene JSON for common cases (title card, feature showcase, code walkthrough, data viz, outro/CTA). Read it when a scene matches a known pattern; start from the template and edit.examples/product-demo-example.json — a complete worked script. Read it for calibration on granularity.Ask in one tight batch, only what's missing (field names per rules/prompt-structure.md):
product-demo | coding-tutorial | animation | data-visualization | social-media?skills/creative/creative-strategist style guide if one exists).Infer instead of asking: language from the codebase; dimensions from platform (1920×1080 landscape default, 1080×1920 for vertical social, fps 30); animation/transition preferences from style if not given. Don't stall: with goal + videoType + duration known, state assumptions and proceed.
If code is provided, explore it: identify the key features, user flows, data structures, and UI surfaces worth showing. Rank features by relevance to goal — the video shows the top 3–5, not everything. If no code, extract the equivalent list from the user's description.
Decision rules by videoType:
skills/creative/product-video beat sheet).Timing math is mandatory: scene durations plus transition overlaps must sum exactly to duration. TransitionSeries transitions overlap adjacent scenes — account for the overlap, don't just add durations. Keep total under ~5 minutes (render performance heuristic).
For every scene fill every field: sceneNumber, title, durationInSeconds, visuals.background, visuals.elements[] (type, exact content string, font, size, color, position, animation from rules/animation-patterns.md), audio.voiceover (the exact sentence(s) spoken — verify they fit the scene duration at ~2.5 words/second), and transitionToNextScene. Use rules/scene-templates.md templates where they match.
List every image, video clip, audio track, font, and logo referenced by any scene in requiredAssets — nothing referenced may be missing from the list. Asset generation is out of scope: mark each as user-provided or describe it precisely; still images can be produced via skills/creative/image-generation (repo pipeline: docs/creative_cli.py, model fal-ai/nano-banana-pro). List remotionPackages (e.g. @remotion/transitions whenever transitions are used) and any third-party libraries.
Deliver the script plus the handoff note (below). The downstream Remotion agent generates components, sets up the composition, previews in Studio, and renders.
Emit one JSON object exactly matching the structure in rules/script-generation.md:
{
"videoMetadata": {
"title": "...", "durationInSeconds": 60,
"width": 1920, "height": 1080, "fps": 30,
"videoType": "product-demo"
},
"scenes": [
{
"sceneNumber": 1, "title": "...", "durationInSeconds": 5,
"visuals": {
"background": "#RRGGBB or asset ref",
"elements": [
{ "type": "text|image|code|chart", "content": "exact content",
"animation": { "type": "<from rules/animation-patterns.md>", "durationInSeconds": 1 } }
]
},
"audio": { "voiceover": "Exact spoken sentence(s)." },
"transitionToNextScene": { "type": "<from rules/animation-patterns.md>", "durationInSeconds": 1 }
}
],
"requiredAssets": { "images": [], "videos": [], "audio": [], "fonts": [], "logos": [] },
"technicalRequirements": { "remotionPackages": [], "thirdPartyLibraries": [] }
}
Follow the JSON with a short markdown handoff note: total duration check (scene math shown), the 1–3 assumptions you made, and which assets the user must supply before rendering.
videoMetadata.durationInSeconds; show the arithmetic in the handoff note.animation and transition type exists in rules/animation-patterns.md — no invented types.requiredAssets; fonts used by text elements are listed.useCurrentFrame(), springs with damping: 200 for reveals, typewriter via string slicing (not per-character opacity), deterministic randomness only (random() from remotion, never Math.random()), premountFor on heavy sequences, <Sequence>/<Series>/<TransitionSeries> for ordering.content fields are final copy, not placeholders like "feature description here".skills/creative/product-video → feeds in: concept + beat sheet + keyframes for product videos; each beat becomes a scene.skills/creative/creative-strategist → feeds in: style guide (colors, fonts, mood) applied to visuals and style.skills/creative/original-design → feeds in: a design-language brief; every scene's visual vocabulary must come from that world.skills/creative/image-generation → produces: still assets listed in requiredAssets.images.skills/creative/social-graphics → consumes: rendered stills/thumbnails for post assets.