Remotion Video Generator
"Create professional motion graphics videos programmatically with React and Remotion."
Credits & References
Original Skill
Modifications
- - Firecrawl replaced with Scrapling for brand data extraction
- Uses Python
scrapling library instead of Firecrawl API - Added comprehensive troubleshooting for Remotion v4 API
Core Technologies
- - Remotion: https://www.remotion.dev/
- Scrapling: https://github.com/D4Vinci/Scrapling
- React: https://react.dev/
Tested With
- - OpenClaw promotional video - successfully rendered! 🎉
Quick Usage Guide (Step-by-Step)
Step 1: Scrape Brand Data
CODEBLOCK0
This extracts: brandName, tagline, logoUrl, faviconUrl, primaryColors, ogImageUrl, screenshotUrl
Step 2: Download Brand Assets
CODEBLOCK1
Step 3: Create Project Structure
CODEBLOCK2
Step 4: Create package.json
CODEBLOCK3
Step 5: Install Dependencies
CODEBLOCK4
Step 6: Create Video Component
Create
src/MyVideo.tsx with:
- - AbsoluteFill for full-screen layout
- Sequence components for scene timing
- useCurrentFrame, useVideoConfig, interpolate, spring for animations
Step 7: Create Entry Point (Remotion v4 API)
Create
src/index.tsx -
MUST use .tsx extension:
CODEBLOCK5
⚠️ CRITICAL Remotion v4 Rules:
- 1. Use
.tsx extension (NOT .ts) for files with JSX - MUST use
registerRoot + Composition API - ALWAYS pass
fps to spring(): INLINECODE10 - Use
useVideoConfig() to get fps: INLINECODE12 - Render with composition name: INLINECODE13
Step 8: Start Dev Server
cd my-video && npm run dev
Server runs on http://localhost:3000
Step 9: Preview & Iterate
- - Open browser to preview
- Edit source files - hot-reloads automatically
- User reviews and requests changes
Step 10: Render Final Video (when user asks)
npx remotion render index out/final-video.mp4
Credits
- - Original Skill: https://superskills.vibecode.run/
- Modified: Firecrawl replaced with Scrapling for brand data extraction
- Remotion: https://www.remotion.dev/
Installation
CODEBLOCK8
Agent Instructions
When to Use Video Generator
Use this skill when:
- - Creating promotional videos
- Making product demos
- Social media video content
- Animated explainers
- Commercials
- Any programmatic video content
Do NOT use for:
- - Simple slideshows (use other tools)
- Video editing of existing footage
- Live streaming
Default Workflow (ALWAYS follow this)
- 1. Scrape brand data (if featuring a product) using Scrapling (NOT Firecrawl)
- Create the project in INLINECODE14
- Build all scenes with proper motion graphics
- Install dependencies with INLINECODE15
- Fix package.json scripts to use
npx remotion (not bun):
"scripts": {
"dev": "npx remotion studio",
"build": "npx remotion bundle"
}
- 6. Start Remotion Studio as a background process:
cd output/<project-name> && npm run dev
- 7. Expose via Cloudflare tunnel so user can access:
bash skills/cloudflare-tunnel/scripts/tunnel.sh start 3000
- 8. Send the user the public URL (e.g.
https://xxx.trycloudflare.com)
The user will preview in their browser, request changes, and you edit the source files. Remotion hot-reloads automatically.
Rendering (only when user explicitly asks to export)
CODEBLOCK12
Quick Start
CODEBLOCK13
Fetching Brand Data with Scrapling
MANDATORY: When a video mentions or features any product/company, use Scrapling to scrape the product's website for brand data, colors, screenshots, and copy BEFORE designing the video. This ensures visual accuracy and brand consistency.
Using the Scrapling Script
CODEBLOCK14
This returns structured brand data: brandName, tagline, headline, description, features, logoUrl, faviconUrl, primaryColors, ctaText, socialLinks, plus screenshot URL and OG image URL.
Manual Scrapling Extraction
If the script isn't available, use Python directly:
CODEBLOCK15
Download Assets After Scraping
CODEBLOCK16
Note: Some S3 buckets block direct access. Use thum.io screenshot service as fallback.
Core Architecture
Scene Management
Use scene-based architecture with proper transitions:
CODEBLOCK17
Video Structure Pattern
CODEBLOCK18
Motion Graphics Principles
AVOID (Slideshow patterns)
- - Fading to black between scenes
- Centered text on solid backgrounds
- Same transition for everything
- Linear/robotic animations
- Static screens
- Emoji icons — NEVER use emoji, always use Lucide React icons
PURSUE (Motion graphics)
- - Overlapping transitions (next starts BEFORE current ends)
- Layered compositions (background/midground/foreground)
- Spring physics for organic motion
- Varied timing (2-5s scenes, mixed rhythms)
- Continuous visual elements across scenes
- Custom transitions with clipPath, 3D transforms, morphs
- Lucide React for ALL icons (
npm install lucide-react) — never emoji
Transition Techniques
| Technique | Description |
|---|
| Morph/Scale | Element scales up to fill screen, becomes next scene's background |
| Wipe |
Colored shape sweeps across, revealing next scene |
|
Zoom-through | Camera pushes into element, emerges into new scene |
|
Clip-path reveal | Circle/polygon grows from point to reveal |
|
Persistent anchor | One element stays while surroundings change |
|
Directional flow | Scene 1 exits right, Scene 2 enters from right |
|
Split/unfold | Screen divides, panels slide apart |
|
Perspective flip | Scene rotates on Y-axis in 3D |
Animation Timing Reference
CODEBLOCK19
Visual Style Guidelines
Typography
- - One display font + one body font max
- Massive headlines, tight tracking
- Mix weights for hierarchy
- Keep text SHORT (viewers can't pause)
Colors
- - Use brand colors from Scrapling scrape as the primary palette — match the product's actual look
- Avoid purple/indigo gradients unless the brand uses them or the user explicitly requests them
- Simple, clean backgrounds are generally best — a single dark tone or subtle gradient beats layered textures
- Intentional accent colors pulled from the brand
Layout
- - Use asymmetric layouts, off-center type
- Edge-aligned elements create visual tension
- Generous whitespace as design element
- Use depth sparingly — a subtle backdrop blur or single gradient, not stacked textures
Remotion Essentials
Interpolation
CODEBLOCK20
Sequences with Overlap
CODEBLOCK21
Cross-Scene Continuity
Place persistent elements OUTSIDE Sequence blocks:
CODEBLOCK22
Quality Tests
Before delivering, verify:
- - Mute test: Story follows visually without sound?
- Squint test: Hierarchy visible when squinting?
- Timing test: Motion feels natural, not robotic?
- Consistency test: Similar elements behave similarly?
- Slideshow test: Does NOT look like PowerPoint?
- Loop test: Video loops smoothly back to start?
Implementation Steps
- 1. Scrapling brand scrape — If featuring a product, scrape its site first
- Director's treatment — Write vibe, camera style, emotional arc
- Visual direction — Colors, fonts, brand feel, animation style
- Scene breakdown — List every scene with description, duration, text, transitions
- Plan assets — User assets + generated images/videos + brand scrape assets
- Define durations — Vary pacing (2-3s punchy, 4-5s dramatic)
- Build persistent layer — Animated background outside scenes
- Build scenes — Each with enter/exit animations, 3-5 timed moments
- Open with hook — High-impact first scene
- Develop narrative — Content-driven middle scenes
- Strong ending — Intentional, resolved close
- Start Remotion Studio —
npm run dev on port 3000 - Expose via tunnel — INLINECODE20
- Send user the public URL — They preview and request changes live
- Iterate — Edit source, hot-reload, repeat
- Render — Only when user says to export final video
File Structure
CODEBLOCK23
Common Components
See references/components.md for reusable:
- - Animated backgrounds
- Terminal windows
- Feature cards
- Stats displays
- CTA buttons
- Text reveal animations
Tunnel Management
CODEBLOCK24
Troubleshooting
Common Issues & Fixes
| Issue | Solution |
|---|
| INLINECODE22 | Use .tsx extension for files with JSX, not INLINECODE24 |
| INLINECODE25 |
Use
registerRoot +
Composition API (see Step 7) |
|
"fps" must be a number, but you passed undefined to spring() | Pass
fps to spring:
spring({ frame, fps, from: 0.8, to: 1 }) |
|
Could not find composition with ID index | Use composition name:
npx remotion render MyVideo out.mp4 |
|
Module build failed | Ensure
react and
react-dom are in dependencies |
| Remotion not found | Run
npm install in project directory |
| Hot reload not working | Ensure running
npm run dev, not
npx remotion directly |
| Brand colors not extracting | Some sites use CSS variables - check page source manually |
File Extension Rules
- - Use
.tsx for files with JSX (components with < tags >) - Use
.ts for pure TypeScript files - Entry point MUST be
.tsx if it uses JSX
Testing Your Video
- 1. Start dev server: INLINECODE43
- Open http://localhost:3000
- Make changes - auto-refreshes
- Check composition in browser
Changelog
v1.0.0 (2026-02-25)
- - Initial release (adapted from superskills)
- Firecrawl replaced with Scrapling for brand data extraction
- Uses StealthyFetcher for JS-heavy sites
- Full brand data extraction: brandName, tagline, headline, description, features, logoUrl, faviconUrl, primaryColors, ctaText, socialLinks, screenshotUrl, ogImageUrl
v1.1.0 (2026-02-25)
- - Added Quick Usage Guide with step-by-step instructions
- Added troubleshooting section for common issues
- Tested with OpenClaw promotional video - working! 🎉
- Documented file extension requirements (.tsx vs .ts)
- Fixed Remotion v4 API:
registerRoot + Composition pattern - Fixed spring() must receive
fps parameter - Fixed composition name in render command
Practical Example: OpenClaw Promo Video
Here's the actual project created during testing:
Location: INLINECODE47
Brand Data Extracted:
- - Tagline: "The AI that actually does things."
- Logo: favicon.svg from openclaw.ai
- Primary Color: #FF6B35 (extracted from design)
- Screenshot: Generated via thum.io
Project Structure:
CODEBLOCK25
Commands:
cd skills/remotion-video-generator/openclaw-promo
npm run dev # Start studio at localhost:3000
npm run build # Bundle for production
Last updated: 2026-02-25
Remotion 视频生成器
使用 React 和 Remotion 以编程方式创建专业动态图形视频。
致谢与参考
原始技能
修改内容
- - Firecrawl 替换为 Scrapling 用于品牌数据提取
- 使用 Python scrapling 库替代 Firecrawl API
- 新增针对 Remotion v4 API 的全面故障排除指南
核心技术
- - Remotion: https://www.remotion.dev/
- Scrapling: https://github.com/D4Vinci/Scrapling
- React: https://react.dev/
测试验证
快速使用指南(分步操作)
第一步:抓取品牌数据
bash
运行 scrapling 脚本获取品牌颜色、Logo、标语
bash skills/remotion-video-generator/scripts/scrapling.sh https://brand-website.com
这将提取:brandName、tagline、logoUrl、faviconUrl、primaryColors、ogImageUrl、screenshotUrl
第二步:下载品牌素材
bash
mkdir -p public/images/brand
curl -sL https://brand.com/logo.svg -o public/images/brand/logo.svg
curl -sL https://brand.com/og-image.png -o public/images/brand/og-image.png
curl -sL https://image.thum.io/get/width/1200/crop/800/https://brand.com -o screenshot.png
第三步:创建项目结构
bash
mkdir -p my-video/src my-video/public/images/brand my-video/public/audio
第四步:创建 package.json
json
{
name: my-video,
scripts: {
dev: npx remotion studio,
build: npx remotion bundle
},
dependencies: {
@remotion/cli: ^4.0.0,
react: ^18.2.0,
react-dom: ^18.2.0,
remotion: ^4.0.0,
lucide-react: ^0.300.0
}
}
第五步:安装依赖
bash
cd my-video && npm install
第六步:创建视频组件
创建 src/MyVideo.tsx,包含:
- - AbsoluteFill 实现全屏布局
- Sequence 组件控制场景时间
- useCurrentFrame、useVideoConfig、interpolate、spring 实现动画
第七步:创建入口文件(Remotion v4 API)
创建 src/index.tsx -
必须使用 .tsx 扩展名:
tsx
import { registerRoot, Composition } from remotion;
import { AbsoluteFill, Sequence, useCurrentFrame, useVideoConfig, interpolate, spring } from remotion;
const MyVideo = () => {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
// 动画 - 始终将 fps 传递给 spring()
const scale = spring({ frame, fps, from: 0.8, to: 1 });
return (
Hello World
);
};
registerRoot(() => {
return (
id=MyVideo
component={MyVideo}
durationInFrames={240}
fps={30}
width={1920}
height={1080}
/>
);
});
⚠️ Remotion v4 关键规则:
- 1. 使用 .tsx 扩展名(非 .ts)处理包含 JSX 的文件
- 必须使用 registerRoot + Composition API
- 始终将 fps 传递给 spring():spring({ frame, fps, from: 0.8, to: 1 })
- 使用 useVideoConfig() 获取 fps:const { fps } = useVideoConfig()
- 使用合成名称渲染:npx remotion render MyVideo out/video.mp4
第八步:启动开发服务器
bash
cd my-video && npm run dev
服务器运行在 http://localhost:3000
第九步:预览与迭代
- - 打开浏览器预览
- 编辑源文件 - 自动热重载
- 用户审阅并请求修改
第十步:渲染最终视频(当用户要求时)
bash
npx remotion render index out/final-video.mp4
致谢
- - 原始技能: https://superskills.vibecode.run/
- 修改内容: Firecrawl 替换为 Scrapling 用于品牌数据提取
- Remotion: https://www.remotion.dev/
安装
bash
全局安装 Remotion
npm install -g remotion
安装视频项目依赖
npm install lucide-react
安装 Scrapling(工作区技能中已有)
pip install scrapling
代理指令
何时使用视频生成器
使用此技能的场景:
- - 创建宣传视频
- 制作产品演示
- 社交媒体视频内容
- 动画解说
- 商业广告
- 任何程序化视频内容
不适用于:
- - 简单幻灯片(使用其他工具)
- 现有素材的视频编辑
- 直播流
默认工作流程(始终遵循此流程)
- 1. 抓取品牌数据(如果展示产品)使用 Scrapling(非 Firecrawl)
- 创建项目 在 output// 目录下
- 构建所有场景 使用适当的动态图形
- 安装依赖 使用 npm install
- 修复 package.json 脚本 使用 npx remotion(非 bun):
json
scripts: {
dev: npx remotion studio,
build: npx remotion bundle
}
- 6. 启动 Remotion Studio 作为后台进程:
bash
cd output/
&& npm run dev
- 7. 通过 Cloudflare 隧道暴露 以便用户访问:
bash
bash skills/cloudflare-tunnel/scripts/tunnel.sh start 3000
- 8. 向用户发送公共 URL(例如 https://xxx.trycloudflare.com)
用户将在浏览器中预览、请求修改,您编辑源文件。Remotion 自动热重载。
渲染(仅在用户明确要求导出时)
bash
cd output/
npx remotion render CompositionName out/video.mp4
快速开始
bash
搭建项目
cd output && npx --yes create-video@latest my-video --template blank
cd my-video && npm install
添加动效库
npm install lucide-react
修复 package.json 中的脚本(将所有 bun 引用替换为 npx remotion)
启动开发服务器
npm run dev
公开暴露
bash skills/cloudflare-tunnel/scripts/tunnel.sh start 3000
使用 Scrapling 获取品牌数据
必须执行: 当视频提及或展示任何产品/公司时,在设计视频前使用 Scrapling 抓取产品网站的品牌数据、颜色、截图和文案。这确保视觉准确性和品牌一致性。
使用 Scrapling 脚本
bash
运行品牌数据提取脚本
bash skills/remotion-video-generator/scripts/scrapling.sh https://example.com
返回结构化品牌数据:brandName、tagline、headline、description、features、logoUrl、faviconUrl、primaryColors、ctaText、socialLinks,以及截图 URL 和 OG 图片 URL。
手动 Scrapling 提取
如果脚本不可用,直接使用 Python:
python
import json
from scrapling.fetchers import StealthyFetcher
from urllib.parse import urljoin
import re
url = https://brand.com
page = StealthyFetcher.fetch(url, headless=True)
html = page.text
def resolve(u):
return urljoin(url, u) if u and not u.startswith(http) else u
colors = list(set(re.findall(r#(?:[0-9a-fA-F]{3}){1,2}, html)))[:5]
data = {
brandName: page.css([property=og:site_name]::