Promotional Video
Path convention:
<skill>refers to the directory where this SKILL.md is located;scripts/,references/,assets/,templates/are all under it. Replace<skill>/scripts/...with the absolute path of this directory when executing commands.
Defaults
- Aspect ratio 16:9 (1920×1080, 30 fps). Use user-specified dimensions when provided; supports
16:9,9:16,1:1,4:5. Use9:16when the user mentions vertical platforms like Douyin (TikTok in China), Xiaohongshu, WeChat Channels, or Reels. - Language follows the user's materials. No voiceover in the first phase; subtitles are off by default when on-screen text already conveys information.
- Font defaults are not DM Sans / SF Pro / PingFang: Follow references/typography.md to make a "font proposal"—fonts from the official website or brand manual + 3 pairings chosen by tone, use
fonts.py specimento generate images with the actual video text for the user to choose, then write the selection into the fifth row of the selection card. - No hard cuts, no silent digital sections, text passes detail checklist: Before delivery, go through references/detail-pass.md (switch point checklist →
rn sheet --around→rn qa/rn cuts→typo_lint.py/font_check.py). Most "abrupt," "audio problem," or "not elegant enough" issues users find originate here. - Logo provided by the user. If no logo is provided, use the brand name as text, and include a statement in
brand.disclaimer, such as "Exemplary brand, for demonstration only." All statistics the user hasn't provided are considered examples and must be stated as such; do not fabricate real data. - Music priority: User-provided > Built-in music library
pick_music.py(default, automatically avoids recently used tracks) > Online open-source music library supplement >synth_bgm.pysynthesized fallback.
Dependency: rn (renoise-kit)
Visuals and audio mixing are rendered by Remotion; all mechanical, error-prone tasks are handled by rn: frame-accurate frame grabbing and contact sheet, reading music (loudness / beats / BPM), encoding and mastering the final video, delivery checks, and auditing for hard cuts, silence, and pops. render.py is already integrated. For manual use, simply run rn <command> --help to check parameters.
brew install ffmpeg-full && export PATH="$(brew --prefix ffmpeg-full)/bin:$PATH" # macOS: rn calls system ffmpeg
apt install ffmpeg # Debian / Ubuntu
winget install Gyan.FFmpeg # Windows (restart terminal after installation)
uv tool install "renoise-kit[all]" # Provides the rn command
macOS, Linux, and Windows are all supported: All skill scripts are Python and do not rely on bash. Replace python3 with python (or py -3) on Windows; paths can use / or \.
| Task | Command |
|---|---|
| View materials / preview / still frames folder | `rn sheet [--fps 4 |
| Read music: loudness, beats, BPM (with half/double speed candidates) | rn listen bgm.wav --json out/music.json |
| Frame-by-frame luminance / motion / frequency band / drum hits / pops | rn signal <file> -o out/signal.png --json out/signal.json |
| Encode final video, master, change audio, output 1080p | rn finish raw.mp4 -o out.mp4 [--audio mix.wav] [--height 1080] |
| Delivery check (format, loudness, true peak, silence, level jumps, pops, black frames, frozen frames, constant frame rate) | rn qa out.mp4 [--accept CHECK@seconds] |
| Hard cut list with frames before/after each cut | rn cuts out.mp4 --sheet out/audit/cuts.jpg |
| Compare with previous version / reference video | rn compare new.mp4 old.mp4 --cuts |
| On-screen text (proofreading, read reference video subtitles) | rn text out.mp4 |
Select Mode and Style Routing
For each video, first follow references/style-router.md for four layers of selection: ① Mode ② Visual Tone ③ Narrative Framework ④ Enhancement Layer (≤2), then ⑤ Font (typography.md), write a five-line "selection card" above the storyboard for user confirmation; only read the documents selected. In case of conflict: User's explicit request > Reputation records in the route table > Industry defaults. The table below shows ① Mode and entry points for each extension pack:
| What the user wants | Mode | Read First | Examples |
|---|---|---|---|
| Product/service promotion video, launch video | Cinematic promotional video (default) | cinematic.md → motion-craft.md | examples/youware/, examples/renoise/ |
| Quick explainer, social media batch | Template video | storyboard.md, styles.md | storyboard.json |
| Personal introduction, account promotion | Personal brand video | cinematic.md "Personal Brand and Pixel Avatar" | — |
| Phone, device, etc. hardware concept | Hardware concept video | cinematic.md "Physical Hardware Products" | — |
| Edit multiple completed videos into a compilation | Compilation reel | recap.md | — |
| Showcase motion design skills, intro, channel ID | Motion graphics showreel | motion-craft.md | examples/motion-reel/ |
| Music-driven, liquid fusion, data charts, infinite tunnel, perspective reveal | Style Extension Pack 01 (layered on cinematic promos) | style-pack-01.md (run audio_features.py first for music-driven) | — |
| One-shot take, no hard cuts, learn that continuous feel from reference videos; product has "input → output → continuous operation" chain | Style Extension Pack 02: Relay One-Shot (narrative framework, with voiceover) | style-pack-02.md (run narrate_mimo.py for voiceover, can clone client's voice) | src/cinematic/relay/ components |
| Animated icons, dynamic emoji, process nodes lighting up one by one | Animated icons (layered on any mode) | animated-icons.md (run fetch_noto_emoji.py for emoji) | examples/animated-icons/ |
| Brand identity video, brand upgrade, "Claude-like" official quality, Apple-style humanism, no specific feature demos | Style Extension Pack 03: Conceptual Ladder · Specimen Book (dot → line → surface → volume → field, each chapter a value statement, ending with the logo; 60s, piano) | style-pack-03.md (run glyph_outline.py for glyph specimens) | examples/youware-ladder/ |
| Model/product launch video, needs "both quality and proof of strength"; name can be used for wordplay; has official order-of-magnitude facts (countable wonders) | Style Extension Pack 04: Sonnet · 3D Depth of Field (the script is a poem, one stanza per section; spec sheet HUD only cites official wording; 680,000 strokes aligned into a brand star shape) | style-pack-04.md | — |
| "N styles" compilation, one product explained in multiple visual styles, for client style selection; variety show sticker text / sticker-style explainer / isometric 2.5D micro-city | Style Extension Pack 05: Commercial Style Library (style catalog video template + sticker text + sticker + isometric; can also be layered on any mode alone) | style-pack-05.md (pre-render Three.js samples into video first, then into catalog video) | examples/style-catalog/ |
| Frame-by-frame hand-drawn / single-stroke line / collage / flat illustration / Bauhaus poster / liquid / frosted glass / 3D soft plush needle matrix / cyber HUD / pixel / synthwave, or want a complete 15-style compilation | Style Extension Pack 06: Commercial Style Library Batch 2 (11 visual style components + 15-reel catalog video + extend music by section / retro synth music) | style-pack-06.md (must read about filter region and three bounding box pitfalls) | examples/style-catalog/ (Reel15.tsx) |
| "Same-topic comparison" short video for a new model launch day: animated SVG / small works of two models side-by-side + YouWare input box and model menu + ending hook | Model output comparison video (frame-determined SVG player, isolated naming, same zoom ratio, music aligned to sections) | svg-compare.md (first confirm official model names, inference strength, original prompts, and generation sources) | examples/svg-compare/ |
| Dribbble-level UI animation, one shape morphing continuously to explain the product flow | One-shape Promotional Video (default 16:9 promo version; pure 1:1 loop version optional) | one-shape.md (first get state list, color palette, music, then lay out the beat grid before writing code) | examples/morph-promo/, examples/morph-loop/ |
All modes share the same set of design principles, motion layers, music library, and sound effects library.
Design Principles (Default Execution)
All videos follow references/design-principles.md: Apple-style one screen one idea, large typography with whitespace, restrained color palette, and credible materials; unified lucide-react icons (1.75 line width, use IconTile for functional nodes; use lucide-animated for animation, play once on contact frame), use only Noto dynamic emoji versions and don't use them by default, no placeholder graphics; each frame first defines focus and emotion, camera movement has motivation (dolly, focus shift, fly-through, whip pan, punch); sound hits the contact frame of the action. Go through the "Master Review" checklist before delivery.
After the content layer is built, add the "motion layer" (references/motion-craft.md): First use official website materials, then overlay particles, morphs, and masks on these visuals (e.g., particles converging into a slogan on a product screenshot). Do not cut to a separate black background segment unrelated to the product. Clearly describe transitions (prefer match cuts), and bring opening objects back at the end.
Workflow
Copy this checklist and track progress:
- [ ] 1. Material Analysis: Product, industry, audience, selling points
- [ ] 2. One-time Confirmation: Purpose, style, duration, aspect ratio, language, music
- [ ] 2b. Font Proposal: Generate 3 pairings based on tone + proposal image with brand's current font (fonts.py specimen) → User selects
- [ ] 3. Script & Storyboard (including main craft and transition column for each segment) → Wait for user confirmation
- [ ] 4. Setup project → Still frames → Wait for user confirmation on visuals
- [ ] 5. Music: pick_music.py to select and align music, rearrange timeline based on BPM
- [ ] 6. Low-resolution preview → Modify
- [ ] 6b. Detail Review: Switch point list + 4 frames around (rn sheet --around) + rn qa / rn cuts + typo_lint.py (go through yourself before showing the preview to the user)
- [ ] 7. Final video delivery and verification
1. Material Analysis
Read all content provided by the user (copy, PDF, URLs, screenshots, logos). If the user only provided a URL, extract logo, fonts, colors, and high-quality product images from the official website using references/brand-from-website.md. Extract:
- What the product is, one-sentence value proposition (≤ 20 words)
- 3–4 selling points, each with an icon concept
- Data explicitly provided by the user (use only these)
- Existing visual assets: Screenshots, logo, brand colors, fonts
- Industry classification and target audience: Determine using references/industries.md, get recommended style, camera movement, and music mood
2. One-Time Confirmation
Ask everything in one go, only for items that cannot be inferred. Place the recommended option first and mark it as "(recommended)." If the host has a quiz-style questioning tool, use it (such tools have limited questions per round; if there are many, split into two rounds by importance). Otherwise, list them as numbered options in one message:
- Video Purpose: Product launch, feature demo, brand image, fundraising pitch, social media ad
- Production Mode: Cinematic (real UI demo + 3D + sound effects, recommended for product launch/brand videos) or Template (faster, suitable for explainers, social media batches)
- Cinematic Style: Dark tech / Paper cutout / Light editorial, recommended by industry (see cinematic.md "Styles")
- Style: Give 3 presets based on industry, each with a one-sentence visual description (presets in references/styles.md)
- Duration: Provide level-appropriate options based on purpose (see references/storyboard.md), hint "shorter duration = less text per screen"
- Aspect Ratio: Only ask if materials suggest vertical or multi-platform distribution; otherwise use 16:9
- Language
- Music Source: Built-in music library (recommended, provide 2–3 candidate style descriptions) / Provide own / Synthesize
Do not ask about items the user has already explicitly stated.
2b. Font Proposal
Follow references/typography.md §1: Determine tone → fonts.py pairs --tone <tone> (if the official font is commercial, first use fonts.py similar "<font name>") → Generate proposal images using the actual video titles, subtitles, body text, and Chinese/Japanese text, with 3 pairings + 1 group of the brand's current fonts:
python3 <skill>/scripts/fonts.py specimen --pair warm-soft --pair editorial-italic --pair bold-youth --combo <brand-title-font>+<brand-body-font> \
--title "..." --sub "..." --body "..." [--zh "..."] [--ja "..."] --out <project-directory>/out/type-proposal.png
Send the image to the user for selection. After selection: fonts.py fetch <ids> --to <project-directory>, after writing the copy, fonts.py subset <project-directory> --text-file copy.txt (for Chinese/Japanese). Authorization per typography.md §8: Fontshare fonts are not subsetted and not shared with third parties with the project.
3. Script and Storyboard
If the user provides a script, break it down into scenes. Otherwise, write it according to the structure in references/storyboard.md. Place the selection card (style-router.md) above the table, then present the table for user confirmation:
| # | Duration | Scene Type | Visuals | On-Screen Text | Camera Movement | Main Craft / Transition |
|---|
Do not proceed to rendering without user confirmation. After user modifications, update the table and confirm again.
4. Setup Project and Still Frames
python3 <skill>/scripts/setup_project.py <project-directory>
Cinematic mode: storyboard.json only provides brand information, visuals are coded in src/Film.tsx following references/cinematic.md (refer to templates/remotion/examples/youware/). Use render.py <project-directory> film-stills <frame-numbers...> for spot-checking frames, preview with film-preview, final with film (outputs out/film.mp4 with loudness check). The following storyboard validation and render.py are for template videos.
- Write the confirmed storyboard into
<project-directory>/storyboard.json(see storyboard.md for fields). - Place materials into
public/:brand/(logo),fonts/(downloaded byfonts.py fetch, includesfonts.jsonandLICENSES.md),images/(screenshots),music/. Paths instoryboard.jsonare relative topublic/. - Validate and render still frames (mid-frame of each scene):
python3 <skill>/scripts/check_storyboard.py <project-directory>/storyboard.json
python3 <skill>/scripts/render.py <project-directory> stills
ERRORmust be fixed.WARN reading timeindicates text is too long to read: shorten the text or extend the scene duration.- Review each
out/stills/scene-N.png(or the summaryout/stills-sheet.jpg) against the design-principles.md "Master Review" checklist (focus, whitespace, overflow, icons, contrast). After fixing, show the still frames to the user (if the host can send files, send the image directly; otherwise, provide the file path). - If the user wants to compare styles, change
style, re-render still frames, and save the old still frames asout/stills-<style>/for side-by-side comparison.
5. Music
Follow references/music.md. Regardless of the source, music.bpm must be set (read by rn listen). The timeline will align each edit point to a beat.
If voiceover is needed, generate it using voiceover.py as per cinematic.md "Voiceover and Dubbing" (Xiaomi MiMo TTS or local say). The timeline will then be driven by the voiceover duration. To change the loudness of the final video, only redo the audio track without re-rendering the video: rn finish out/film.mp4 -o out/film-loud.mp4 --copy-video --lufs -12.
6. Preview
python3 <skill>/scripts/render.py <project-directory> preview
Renders a half-resolution preview quickly. Provide the path to out/preview.mp4 to the user. After receiving feedback, modify storyboard.json and re-render.
6b. Detail Review
Before showing the preview to the user, go through references/detail-pass.md yourself:
rn sheet out/film-preview.mp4 --around <switch-point-seconds,...> --span 4 -o out/seam.jpg # 4 frames before and after each mount/unmount/parameter change point (seconds = frame number / 30)
rn qa out/film-preview.mp4 # Black frames, frozen frames, digital silence, level jumps, pops (render.py runs this automatically)
rn cuts out/film-preview.mp4 --sheet out/audit/cuts.jpg # Hard cut list, one frame before and after each cut
python3 <skill>/scripts/typo_lint.py storyboard.json # Or --ts src/film/*.ts*; --fix auto-fixes JSON
python3 <skill>/scripts/font_check.py public/fonts # Optical size axis, real punctuation glyphs
Each issue must either be fixed or written into qa-accept.txt in the project root (one check-item or check-item@seconds per line, with the reason after #). State "intentional" in the delivery note; subsequent audits will not report it again.
7. Final Video
python3 <skill>/scripts/render.py <project-directory> final
Outputs out/final.mp4, out/cover.png, and out/captions.srt if caption data exists. All files delivered to the user must be the output of rn finish (render.py's film / final automatically does this: renders video separately, renders audio mix as WAV, then synthesizes with rn finish --audio). MP4 files directly from Remotion can show only half the duration on some players and upload platforms (users report "38 seconds sent, but only 19 seconds opens"). The root cause is in references/detail-pass.md "Delivery Encoding." When manually rendering 4K:
npx remotion render src/index.ts Film out/film-raw-4k.mp4 --muted # Composition is 3840×2160; for 1080p add --scale=2
npx remotion render src/index.ts Film out/mix.wav --codec=wav --config=remotion.audio.config.ts
rn finish out/film-raw-4k.mp4 -o out/<name>.mp4 --audio out/mix.wav
rn finish out/<name>.mp4 -o out/<name>-1080p.mp4 --height 1080 --lufs keep # For WeChat / social media
rn qa out/<name>.mp4 # Run this before delivering any file
Check the rn qa results (FAIL must be 0; fix WARN or add to qa-accept.txt) and the out/audit/cuts.jpg hard cuts. Review the cover frame. Then deliver the file path and a brief description (style, duration, music source and license, disclaimers, intentionally retained WARNs). After the user provides feedback (like / not as good as previous / redo required), record the "combination → video → reaction" into the reputation records in style-router.md.
Rendering Constraints
- All animations must be derived from
useCurrentFrame(). CSS transitions/animations, Framer Motion auto-play,setTimeout, seedlessMath.random()are prohibited; otherwise, frame-by-frame rendering will flicker or be out of sync. GSAP can only be used frame-seeking. render.pymust run outside the command sandbox (headless Chrome needs to read CPU cores and GPU): If the host sandboxes shell commands, follow the host's method to exempt this command.- Full video rendering (
preview,final,film-preview,film) and the firstsetup_project.py(npm install) take several minutes and will exceed most hosts' single-command timeout: Run them in the background (use the host's background execution capability if available; otherwise, use system native methods and redirect output toout/render.log: macOS/Linuxnohup ... > out/render.log 2>&1 &, Windows PowerShellStart-Process python -ArgumentList '...' -RedirectStandardOutput out/render.log -NoNewWindow, then check the log). Do not poll frequently.stillsandfilm-stills(a few frames) can run in the foreground; extend the timeout to 10 minutes. - No global Node.js required:
setup_project.pywill find an existing Node.js or download a portable version to~/.cache/promo-video/nodeif not found. ffmpeg andrnmust be installed in the system (see "Dependencies").setup_project.pywill prompt if they are missing. hero3drendering is the slowest; keep 1–2 per video.- Common tools:
rn finish(delivery encoding: fixed_frame_rate_flag=1, BT.709 TV range, moov box first, -14 LUFS with post-encode true peak ≤ -1 dBTP,--audiotakes WAV mix,--height 1080for small versions);rn qa(delivery check + black frames/frozen frames/digital silence/level jumps/pops, run automatically byrender.py);rn cuts --sheet(hard cut list);rn sheet(precise frame grabbing for collage, for video or still frame folder, use for shot selection and review, do not useffmpeg -r 1);rn listen(BPM, beats, loudness);typo_lint.py(smart quotes, three dots,--, full-width punctuation, hanging separators, orphan characters in screen text);font_check.py(font file axes, features, and real punctuation glyphs; warns if opsz is missing);fonts.py(font directory/pairing/proposal image/download/subsetting/commercial font alternatives, see typography.md);audio_features.py(frame-by-frame features of music,AudioReactive.tsxreads its format);pick_music.py(select music and align beats);narrate_mimo.py(voiceover: MiMo preset voices or clone a few seconds of client's voice, outputs word-by-word timings.json to drive visuals,--qafor reading back verification). - Shell is zsh:
for t in $LISTdoes not split by spaces; write lists directly asfor t in 1 2 3. In heredocs containing backticks or${}, use<<'EOF'to prevent shell expansion.
Extensions
- Adding a new scene type: Write the component in
src/scenes/, add it to theSceneunion type insrc/types.tsandSceneBodyinsrc/Promo.tsx, and updateSCENE_TYPESandscene_textincheck_storyboard.py. - Images: Use
<Img>; GIFs: Install@remotion/gif; Lottie: Install@remotion/lottie. Version of@remotion/*packages must matchremotionexactly. - AI Material Supplement: For people and scenes the client cannot shoot, use Renoise to generate keyframes and image-to-video (requires Renoise plugin and login). Style is derived from the client's own design specifications. Select the model according to Renoise's model-routing skill. For each batch, first run
estimate_costto report quantity and estimated cost. Submit only after user agreement. Workflow, prompt rules, and boundaries are in references/ai-footage.md.
References
- references/brand-from-website.md: Extract copy, colors, fonts, logo, and product images from the official website.
- references/design-principles.md: Design principles, icon guidelines, director camera work, sound, and master review checklist (default execution).
- references/detail-pass.md: Detail Review: Three principles of continuous / non-empty / precise, switch point checklist workflow, dark-to-light transition visuals and sound recipes,
rn qathresholds and exemptions, delivery encoding, and common pitfalls (required before delivery). - references/typography.md: Font System: Font proposal workflow, 11 tones → preferred fonts, 17 pairings (with Chinese/Japanese equivalents), fonts used in top advertisements (verified) with open-source replacements tested, font files must include opsz axis, video typography rules and Display parameters, licensing (OFL / ITF FFL / vendor agreements), animated text components (
src/cinematic/type/: VarType, OutlineFill, HandReveal, TrackIn, Decode), and a detail review checklist. assets/fonts/catalog.json: 99 curated fonts (Google Fonts / Fontshare / GitHub releases, Latin + Chinese + Japanese), 17 pairings, commercial font replacements table, list of fonts needing manual download from vendors; read byscripts/fonts.py.- references/cinematic.md: Cinematic Film mode: Styles, scene components, product interface and report recreation, 3D, motion and sound design.
- assets/sfx/README.md: Directory of freely usable sound effects (typing, mouse, UI, transitions, paper, page flip);
preview.wavfor auditioning. assets/music/catalog.json: Music library catalog (mood, BPM, energy climax points, license, download URL, sha256). Music files are not distributed with the repository;pick_music.pydownloads from Mixkit's official URL to~/.cache/promo-video/music/on first use and verifies integrity.- references/industries.md: Industry classification → recommended style, camera movement, music, and compliance tips.
- references/styles.md: 4 style presets and brand color override rules.
- references/camera.md: Camera movement vocabulary, classic technique mapping, and rhythm rules.
- references/storyboard.md:
storyboard.jsonfields, duration levels, narrative structure, and copy rules. - references/music.md: Built-in music library and
pick_music.py, expanding open-source music library, BPM alignment, synthesized fallback, loudness, and licensing. - references/motion-craft.md: Motion layer: Restrained/Expressive levels, craft map, transition design, motion graphics showreel.
- references/recap.md: Edit multiple completed videos into a compilation (Apple-style carousel recap).
- references/animated-icons.md: Animated icons (467 lucide-animated icons, frame-by-frame doubles verified) and Noto dynamic emoji (
fetch_noto_emoji.py), rhythm rules, and licensing. - references/style-router.md: Four-layer selection table and routing logic.
- references/ai-footage.md: AI generated footage: workflow, prompt rules, cost estimation, use boundaries, and style alignment with client design specs.
...
[truncated for translation]