Remotion Beautiful Videos
Create 40-second product launch videos that look like a $50k agency produced them. The secret: build animated product UI mockups — real dashboards, conversation interfaces, code editors, data visualizations — all constructed in code and spring-animated.
When to Use
User names a brand or gives a URL and wants a product launch / marketing / demo video.
Tech Stack
Remotion 4.x + React 19 + TypeScript + Zod + lucide-react + @remotion/transitions + @remotion/google-fonts + @remotion/paths + @remotion/light-leaks + @remotion/media
Core Philosophy
- Build product UI mockups, not abstract graphics. The UI IS the animation.
- Scrape first, design second. Every color, font, logo comes from the real brand site.
- Pacing is luxury. 40 seconds lets content breathe. Never rush features.
- Taste over templates. If it looks like "AI made this," redesign.
- One font family, weight hierarchy. 300-600 range only, never bold (700+).
Rules
Read individual rule files for detailed explanations and code examples:
Design System
- rules/typography.md - Font weights (max 600), size hierarchy (min 24px), text safety
- rules/color.md - Brand polarity, neutral tinting, 60-30-10 rule, accent opacity levels
- rules/layout.md - Grid system, 4px spacing scale, safe zones, border-radius hierarchy, anti-overlap
Visual Content
- rules/ui-mockups.md - Product UI construction, density, title bars, syntax coloring, cursor simulation
- rules/cards.md - Staggered card grids, interior fill techniques, animated card bodies, no duplicates
- rules/data-viz.md - SVG charts, animated metrics, tabular-nums, status badges, anti-hero-metric
Motion & Production
- rules/motion.md - Springs, easeOutExpo, per-character stagger, timing standards, hold-then-snap
- rules/transitions.md - TransitionSeries, light leaks, fluid backgrounds, noise textures, parallax
- rules/cinematic.md - Film grain, vignette, shimmer sweep, color grading, glassmorphism, render settings
Strategy & Quality
- rules/taste.md - AI slop blacklist, design principles, UX laws, self-review checklist, pacing
- rules/narrative.md - 5-act structure, headline/UI rhythm, story arc, logo constellation
- rules/narrative-templates.md - Industry-specific narrative templates (AI SaaS, FinTech, DevTool, E-Commerce, Healthcare, Cybersecurity, Collaboration)
- rules/workflow.md - Brand scraping, icon system, asset strategy, video embedding, file organization
Reference Files (Code Patterns)
- references/animations.md - FadeIn, ScaleIn, SplitText, Typewriter, CountUp, AnimatedPath
- references/audio.md - Audio sync, beat detection, voiceover ducking
- references/components.md - GradientMesh, GlassPanel, FilmGrain, ProductFrame, BrandIcon
- references/lottie.md - @remotion/lottie integration, recommended sources
- references/visual-effects.md - Tiered visual effects library reference (lottie, motion-blur, confetti, flubber, three.js)
Remotion API Reference (Bundled)
This skill bundles the full remotion-best-practices reference for Remotion API patterns. Load these when you need Remotion-specific API knowledge:
- remotion-best-practices/rules/videos.md - Video embedding, trimming, volume, speed, looping
- remotion-best-practices/rules/audio.md - Audio importing, trimming, volume, speed, pitch
- remotion-best-practices/rules/timing.md - Interpolation curves, linear, easing, spring
- remotion-best-practices/rules/transitions.md - Scene transition patterns
- remotion-best-practices/rules/compositions.md - Compositions, stills, folders, default props
- remotion-best-practices/rules/sequencing.md - Sequence delay, trim, duration limiting
- remotion-best-practices/rules/fonts.md - Google Fonts and local font loading
- remotion-best-practices/rules/images.md - Img component usage
- remotion-best-practices/rules/charts.md - Bar, pie, line, stock chart patterns
- remotion-best-practices/rules/light-leaks.md - @remotion/light-leaks overlay effects
- remotion-best-practices/rules/lottie.md - @remotion/lottie integration
- remotion-best-practices/rules/text-animations.md - Typography animation patterns
- remotion-best-practices/rules/calculate-metadata.md - Dynamic composition metadata
- remotion-best-practices/rules/voiceover.md - AI voiceover with ElevenLabs TTS
- remotion-best-practices/rules/parameters.md - Zod schema parametrization
- remotion-best-practices/rules/ffmpeg.md - FFmpeg operations for video trimming
Workflow (MUST follow in order)
Step 0: Scaffold Project (30 seconds, not 30 minutes)
Copy the built-in scaffold to create a ready-to-run Remotion project:
# Copy scaffold to new project directory
cp -r /path/to/skills/remotion-video/scaffold/ <brand-name>-launch-video/
# Replace project name in package.json
sed -i '' 's/{{PROJECT_NAME}}/<brand-name>-launch-video/' <brand-name>-launch-video/package.json
# Create required directories
mkdir -p <brand-name>-launch-video/public/brand
mkdir -p <brand-name>-launch-video/scripts
# Install dependencies
cd <brand-name>-launch-video && npm install
Scaffold provides: Remotion 4.x + Tailwind v4 + TransitionSeries + light-leaks + noise + paths + Google Fonts + lucide-react + Zod. Plus pre-built: MainVideo.tsx (5-act TransitionSeries), Animations.tsx (FadeIn/ScaleIn/SplitText/Typewriter/CountUp), Background.tsx (GradientMesh/FilmGrain/Vignette/ColorGrade), UI.tsx (GlassPanel/BrandIcon/GradientText), theme.ts (token 占位).
Pre-requisites (install if missing):
# yt-dlp — video downloader (REQUIRED for brand video assets)
brew install yt-dlp # macOS
# or: pip install yt-dlp # any OS with Python
# ffmpeg — video/audio processing (REQUIRED for trimming + BGM)
brew install ffmpeg # macOS
# or: sudo apt install ffmpeg # Linux
# Verify both are available
yt-dlp --version && ffmpeg -version
Only proceed to Step 1 after npm run dev works AND yt-dlp + ffmpeg are installed.
Step 1: Scrape Brand + Download ALL Assets (BLOCKING — nothing starts before this)
This step has THREE mandatory outputs. Do NOT proceed until ALL THREE exist in public/brand/.
1A. Scrape Design DNA
Use whichever browser tool is available. Try in order:
# Option 1: bb-browser (if installed)
bb-browser open https://brand-site.com
bb-browser snapshot -i
bb-browser eval "getComputedStyle(document.documentElement).cssText"
bb-browser eval "document.querySelector('h1')?.textContent"
bb-browser eval "document.querySelector('link[rel*=icon]')?.href"
bb-browser screenshot public/brand/homepage.png
bb-browser close
# Option 2: MCP chrome-devtools (if available)
# Use navigate_page, evaluate_script, take_screenshot MCP tools
# Option 3: curl + manual inspection (always works)
curl -s https://brand-site.com -o /tmp/brand-page.html
# Extract CSS: grep for font-family, --color-, background in the HTML
# Extract hero: grep for <h1, og:title, og:image in the HTML
# Screenshot: open the URL in your browser, take screenshot manually
Any method works — the OUTPUT matters, not the tool. You need: hex colors, font names, logo URL, hero copy, product type.
1B. Download Logo SVG (MANDATORY — NEVER hand-write)
curl -o public/brand/logo.svg <favicon-or-header-svg-url>
# Verify it renders: open public/brand/logo.svg in browser
1C. Download Video OR Product Screenshots (MANDATORY — at least ONE)
Try video first (ALWAYS preferred over static images):
# Option A: Found YouTube/Vimeo embed on brand site
yt-dlp -f "bestvideo[height<=1080][ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]" \
-o public/brand/demo-full.mp4 "<video-url>"
ffmpeg -i public/brand/demo-full.mp4 -ss 0 -t 8 -c copy public/brand/demo.mp4
# Option B: No embed found — search YouTube
yt-dlp "ytsearch1:<BrandName> official product demo 2024" \
-f "bestvideo[height<=1080][ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]" \
-o public/brand/demo-full.mp4
ffmpeg -i public/brand/demo-full.mp4 -ss 0 -t 8 -c copy public/brand/demo.mp4
# Option C: Direct CDN video found on page
curl -o public/brand/demo-full.mp4 "<cdn-video-url>"
ffmpeg -i public/brand/demo-full.mp4 -ss 0 -t 8 -c copy public/brand/demo.mp4
After downloading, WATCH the clip. Does it show the product's core experience? If it's a random promo with talking heads or unrelated footage, search for a better one. The video must show the actual product UI in action — dashboards, editors, conversations, the thing users interact with.
If video truly impossible, download product screenshots:
# Download hero image, product screenshots, og:image
curl -o public/brand/hero.png "<hero-image-url>"
curl -o public/brand/product-ui.png "<product-screenshot-url>"
# Full-page screenshot (use whichever tool is available)
bb-browser screenshot public/brand/homepage-full.png --full-page # bb-browser
# or: use MCP chrome-devtools take_screenshot
# or: manually screenshot in browser and save to public/brand/
1D. Download BGM Track (MANDATORY — NEVER ask user for music)
Try sources in order until one works. All are royalty-free, no attribution required:
# Source 1: Pixabay Music API (no login needed for direct MP3 links)
# Search: https://pixabay.com/music/search/?q=corporate+ambient&duration=30-60
# Find a track page, look for the download button's direct URL
curl -L -o public/brand/bgm-raw.mp3 "<pixabay-direct-mp3-url>"
# Source 2: Mixkit (direct download, no login)
# Browse: https://mixkit.co/free-stock-music/
# Each track has a direct download link — right-click "Download" → copy URL
curl -L -o public/brand/bgm-raw.mp3 "https://assets.mixkit.co/music/download/mixkit-<track-name>.mp3"
# Source 3: Uppbeat (direct download for free tier)
# Browse: https://uppbeat.io/browse/music
# Free tracks have direct download URLs after browsing
# Source 4: YouTube royalty-free music (always works as last resort)
yt-dlp -x --audio-format mp3 -o public/brand/bgm-raw.mp3 \
"ytsearch1:royalty free corporate ambient background music 30 seconds"
# After downloading from ANY source, trim + fade:
ffmpeg -i public/brand/bgm-raw.mp3 -t 45 -af "afade=in:0:d=2,afade=out:st=42:d=3" public/brand/bgm.mp3
Tone matching guide:
| Brand Tone | Search Keywords |
|---|---|
| Tech/SaaS | "corporate ambient", "tech minimal", "digital innovation" |
| Creative/Design | "inspiring cinematic", "modern elegant" |
| Startup/Hype | "upbeat technology", "energetic corporate" |
| Enterprise/Serious | "ambient corporate", "calm business" |
| Playful/Consumer | "happy upbeat", "positive modern" |
If one source fails (login wall, CAPTCHA, region block), move to the next. yt-dlp YouTube search (Source 4) ALWAYS works as ultimate fallback. See rules/workflow.md for full BGM sourcing protocol.
⛔ BLOCKING GATE — Verify Before Proceeding
ls -la public/brand/
# MUST contain ALL of these:
# ✅ logo.svg (or logo.png) — brand logo, downloaded verbatim
# ✅ demo.mp4 OR hero.png — real product visual (video preferred)
# ✅ bgm.mp3 — background music track
# ✅ homepage.png — reference screenshot
🚫 DO NOT PROCEED TO STEP 2 IF ANY OF THESE ARE MISSING:
- No
logo.svg? → Go back and download it. NEVER hand-write SVG paths. - No
demo.mp4AND nohero.png? → Go back and download product visuals. NEVER build a video with zero real assets. - No
bgm.mp3? → Go back and download from Pixabay. NEVER ship a silent video.
Extract from scrape: exact hex colors, font families, hero copy, product features, visual style.
Step 1.5: Ask User for Storyline (BLOCKING — never assume narrative)
After scraping, STOP and ask the user:
I've scraped [brand] and extracted: [colors, fonts, product type, features list].
Before I build scenes, I need your storyline:
- What story do you want to tell? (product launch? feature highlight? brand intro? problem→solution?)
- Which features to showcase? (I found: [list from scrape]. Pick 2-4, or tell me others)
- What's the key message / tagline? (or I can use: "[hero copy from scrape]")
- Any proof points? (metrics, benchmarks, user count, testimonials — or skip Act 4)
- Tone? (hype launch? calm authority? playful? technical?)
Why this step exists: Every user's video must be DIFFERENT. The 5-act structure is a FRAMEWORK, not a script. ACT 1 (Hook) is always a product UI — but WHICH UI, showing WHAT interaction, depends on the user's story. ACT 3 (Showcase) could be 2 features or 4. ACT 4 could be data or testimonials or cut entirely for a longer showcase.
Match industry template: After identifying the brand's industry, load rules/narrative-templates.md for pre-built narrative patterns (AI SaaS, FinTech, DevTool, E-Commerce, Healthcare, Cybersecurity, Collaboration). Use the matching template as a STARTING POINT, then adapt to the user's answers.
NEVER auto-generate storyline. "It reasons. It codes. It creates." is lazy template output. Ask, listen, then build.
Step 2: Build Theme from Scraped Data
Update theme.ts using ONLY scraped values. Replace all #REPLACE_ME tokens. Update lib/fonts.ts to load the brand's actual fonts. Update index.css @theme vars to match.
Step 3: Build 6-Act Scenes (from user's storyline) — MUST USE REAL ASSETS
The structure is a framework. Adapt content to the user's story. ACT 0 (Logo) is MANDATORY.
| Act | Structure (fixed) | Content (from user) | Required Real Asset |
|---|---|---|---|
| ACT 0 Logo | MANDATORY. Brand logo spring entrance + shimmer sweep. 4s. | Real SVG logo | <Img src={staticFile("brand/logo.svg")} /> |
| ACT 1 Hook | Product UI mockup, spring entrance | Which product screen? | <OffthreadVideo src={staticFile("brand/demo.mp4")} /> or <Img src={staticFile("brand/hero.png")} /> |
| ACT 2 Reveal | Capability icons + tagline | Which capabilities? | Icons from lucide-react |
| ACT 3 Showcase | Headline → UI alternating rhythm | Which features? | At least 1 scene: real screenshot/video inside UI chrome |
| ACT 4 Proof | Data visualization / social proof (optional) | What metrics? | Code-built data viz OK |
| ACT 5 Close | CTA lockup + brand logo again | What tagline? | <Img src={staticFile("brand/logo.svg")} /> again |
⚠️ CRITICAL: ACT 0/5 logo usage does NOT count. Among ACT 1-4, at least 2 acts MUST use a real downloaded video or screenshot via staticFile(). This means <OffthreadVideo src={staticFile("brand/demo.mp4")} /> or <Img src={staticFile("brand/hero.png")} /> showing actual product visuals — not just the logo SVG. Pure code-built UIs are SUPPLEMENTS, not replacements. If ACT 1-4 contain zero staticFile("brand/...") references for video/images, you are doing it wrong.
How to use assets in scenes:
// Video inside browser chrome (product UI recordings)
<div style={{ borderRadius: 16, overflow: "hidden", border: "1px solid rgba(255,255,255,0.1)" }}>
<OffthreadVideo src={staticFile("brand/demo.mp4")} style={{ width: 1200 }} />
</div>
// Full-screen video (cinematic/lifestyle footage)
<AbsoluteFill>
<OffthreadVideo src={staticFile("brand/demo.mp4")} style={{ width: "100%", height: "100%" }} />
</AbsoluteFill>
// Product screenshot inside UI mockup
<Img src={staticFile("brand/product-ui.png")} style={{ width: "100%", objectFit: "contain" }} />
ACT 0 Logo Animation Requirements:
- Real brand SVG wordmark/logo — downloaded, NEVER hand-written
- Spring scale entrance (0→1, damping 16, stiffness 50)
- Shimmer sweep across logo (frame 40-80)
- NO text under the logo — logo stands alone, pure and confident
- Premium background required — NEVER plain white/black. Add: GradientMesh (brand colors, low opacity 0.05-0.08), center glow pulse (radial-gradient breathing), subtle conic-gradient radial lines. The background sells luxury.
- Logo appears ONLY in ACT 0 and ACT 5 — NOT in middle acts
See rules/workflow.md for Asset Strategy details.
⛔ Step 3 BLOCKING GATE: Asset Relevance Check (MANDATORY — every asset must make sense)
Before moving to Step 3.5, review EVERY real asset you placed in a scene. Each one MUST pass ALL 4 checks:
| Check | Question | FAIL Example |
|---|---|---|
| Context Match | Does this asset show what this scene is ABOUT? | Login page video in a "speed & performance" scene |
| Narrative Flow | Does the asset support the headline above/below it? | "Collaborate in real-time" headline over a solo-user screenshot |
| Visual Quality | Is it high-res, no watermarks, no OS chrome/cursors? | 480p YouTube rip with mouse cursor visible |
| Brand Alignment | Does it look like official brand marketing material? | Third-party review video used as if it's the brand's own |
How to check:
- For each scene file, find every
staticFile("brand/...")usage - Open the actual asset file and WATCH/VIEW it fully
- Read the scene's headline text — does the asset illustrate THAT specific point?
- If the asset doesn't match the scene context → find a better asset or change the scene narrative to match
Common violations:
- Downloading one generic product demo and reusing it in 3 different scenes (lazy — each scene needs context-appropriate footage)
- Using a "getting started" tutorial clip in the "enterprise scale" proof scene
- Placing a dashboard screenshot in a scene about "beautiful design" when the dashboard isn't visually impressive
- Using ANY asset you haven't actually watched/viewed yourself
If ANY asset fails relevance → replace it or re-download a better one BEFORE proceeding.
Step 3.5: Wire BGM into MainVideo (MANDATORY — already downloaded in Step 1D)
BGM was downloaded in Step 1D. Now wire it into MainVideo.tsx. This is NOT optional.
// Add to MainVideo.tsx — FIRST thing inside <AbsoluteFill>
import { Audio, staticFile, interpolate, useCurrentFrame, useVideoConfig } from "remotion";
export const MainVideo: React.FC = () => {
const frame = useCurrentFrame();
const { fps, durationInFrames } = useVideoConfig();
// BGM volume envelope: fade in 2s, sustain at 0.3, fade out 3s
const bgmVolume = Math.min(
interpolate(frame, [0, 2 * fps], [0, 0.3], { extrapolateLeft: "clamp", extrapolateRight: "clamp" }),
interpolate(frame, [durationInFrames - 3 * fps, durationInFrames], [0.3, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" })
);
return (
<AbsoluteFill>
<Audio src={staticFile("brand/bgm.mp3")} volume={bgmVolume} />
{/* ... TransitionSeries with scenes ... */}
</AbsoluteFill>
);
};
⛔ BLOCKING: After writing MainVideo.tsx, grep for <Audio in the file. If not found, you forgot BGM. Add it NOW.
Step 3.6: Beat-Sync Scene Transitions (AUTOMATIC)
# Analyze BGM and generate beat map
cp /path/to/skills/remotion-video/scripts/beat-sync.ts scripts/
npx tsx scripts/beat-sync.ts public/brand/bgm.mp3
Use suggestedCuts from public/brand/beat-map.json to fine-tune TransitionSeries durationInFrames so scene cuts land on beats.
Step 4: Polish
Film grain + vignette + color grade + shimmer sweeps. See rules/cinematic.md.
Step 4.5: Readability & Watchability Audit (MANDATORY)
Before rendering, automatically validate every scene's timing:
- Every text element must be on screen long enough to READ (word_count × 10 frames minimum)
- Headlines hold 60+ frames (2s), UI mockups hold 120+ frames (4s)
- Typing animations MUST complete before scene transitions
- No text smaller than 28px at 1920x1080
- If any scene fails → fix duration/speed BEFORE rendering
See rules/taste.md "Automatic Readability & Watchability Audit" for full checklist.
MANDATORY: Print Timing Audit Table after writing EVERY scene. Do NOT proceed to the next scene without outputting this:
TIMING AUDIT — [SceneName] (durationInFrames: XXXf)
| Element | Type | delay | chars/items | finish frame | breathing (scene end - finish) | PASS/FAIL |
|---------|------|-------|-------------|-------------|-------------------------------|-----------|
| "text" | SplitText | 10 | 24 chars × 2f stagger | 58f | 92f | ✓ PASS |
If ANY row shows breathing < 45f → STOP and fix before continuing. This is not optional.
Step 5: Open Remotion Studio for User Preview (BLOCKING — never skip)
NEVER render directly. ALWAYS open Remotion Studio first and let the user preview.
# Start studio on an available port
npx remotion studio --port <available-port>
# Then open in browser for the user
open http://localhost:<port>
Tell the user the URL and WAIT for their feedback. Only proceed to render after the user confirms the video looks good. The user may request changes — iterate until approved.
Why this step exists: Rendering takes time. If the video has visual bugs (cropped images, animations cut off, bad pacing), the user discovers them AFTER waiting for a render. Studio preview catches issues in seconds.
Step 6: Run Asset + BGM + Visual Audit (BLOCKING — render will not proceed without this)
Before rendering, run THREE mandatory checks:
6A. Asset Usage Check (MANUAL)
# Check: do scenes actually USE real assets?
grep -r "staticFile" src/scenes/ | grep -E "\.(mp4|png|jpg)" | head -20
# ⚠️ logo.svg references do NOT count for this check.
# MUST find at least 2 matches in ACT 1-4 scenes (Hook, Reveal, Showcase, Proof)
# using demo.mp4, hero.png, product-ui.png, or other downloaded visuals.
#
# ✅ PASS: HookScene.tsx:staticFile("brand/demo.mp4") + ShowcaseScene.tsx:staticFile("brand/product-ui.png")
# ❌ FAIL: only LogoScene.tsx:staticFile("brand/logo.svg") + CloseScene.tsx:staticFile("brand/logo.svg")
# If fewer than 2 video/image matches in ACT 1-4 → GO BACK TO STEP 3 and add real assets.
6A-2. Asset Relevance Check (MANUAL)
For EVERY staticFile("brand/...") match from 6A, verify the asset makes sense for that scene:
- Open the asset, watch/view it
- Read the scene's headline — does the asset illustrate THAT point?
- If mismatched → swap asset or adjust scene narrative
- See Step 3 BLOCKING GATE above for the full 4-check relevance table
6B. BGM Check (MANUAL)
# Check: does MainVideo have <Audio> with bgm.mp3?
grep -n "Audio" src/MainVideo.tsx
grep -n "bgm" src/MainVideo.tsx
# MUST find <Audio src={staticFile("brand/bgm.mp3")} with volume envelope
# If not found → ADD IT NOW. Copy the code from Step 3.5 above.
# Also verify no localhost URLs survived:
grep -r "localhost:8888" src/
# MUST return ZERO results. Fix any matches with staticFile().
6C. Visual Audit Script
cp /path/to/skills/remotion-video/scripts/visual-audit.ts scripts/
cp /path/to/skills/remotion-video/scripts/beat-sync.ts scripts/
npx tsx scripts/visual-audit.ts
The audit checks (9 categories):
- TIMING — animations complete with 45+ frames breathing room
- FONT-SIZE — no text smaller than 28px
- FONT-WEIGHT — no weight above 600 (semi-bold)
- SAFE-ZONE — padding ≥ 60px from edges for content
- OBJECTFIT — no
objectFit: "cover"on screenshots - CONTRAST — basic WCAG AA contrast checks
- IMG-SAFETY — all
<Img>have objectFit or maxHeight - REAL-ASSETS — at least 2 scenes reference
staticFile("brand/...")for real media - BGM-WIRED — MainVideo.tsx contains
<Audio src={staticFile("brand/bgm.mp3")}>
If ANY FAIL → fix → re-run → only then render:
npx remotion render --codec h264 --crf 16 --image-format png
Premium vs Template
| Premium ($50k) | Template (avoid) |
|---|---|
| Logo animation opens the video | No logo or text-only logo |
| BGM with beat-synced transitions | Silent or stock music slapped on |
| Full product UI mockups | Text on gradient background |
| Real brand assets inside UI chrome | Pure code mockups, no screenshots |
| Per-character text stagger | Entire text block fades in |
| SVG chart path-drawing | Big numbers with no visualization |
| Spring physics (overshoot + settle) | Linear or basic ease |
| easeOutExpo (Apple keynote feel) | Cubic or bounce easing |
| 40s with breathing room | 30s of rushing through features |
| Film grain + vignette + color grade | Perfectly clean digital |
| One typeface, weight contrast 300-600 | Multiple fonts or bold 700+ |