
Programmatic Video
Author Remotion React compositions with sequences, springs, and data-driven props to batch-render MP4/WebM without a traditional NLE.
Overview
Programmatic Video is an agent skill for the Build phase that implements Remotion React compositions for data-driven, git-versioned MP4/WebM rendering.
Install
npx skills add https://github.com/itallstartedwithaidea/agent-skills --skill programmatic-videoWhat is this skill?
- React-based Remotion model: every frame is a component; animations expressed in code
- Sequences, transitions, spring physics, and parameterized batch rendering from input data
- MP4/WebM output via headless Chromium—no manual video editor required
- Git-versioned templates for personalized demos, social clips, and onboarding video at scale
Adoption & trust: 1 installs on skills.sh; 18 GitHub stars; 3/3 security scanners passed (skills.sh audits); trending (+100% hot-view momentum).
What problem does it solve?
Manual video editing is slow, non-reproducible, and cannot personalize or batch-render thousands of clips from product data.
Who is it for?
Indie SaaS and content builders who already ship React/TypeScript and need templated video at scale.
Skip if: Creators who only need one-off cinematic edits in a GUI NLE with no code pipeline.
When should I use this skill?
Building or extending Remotion compositions, batch renders, or React-based video pipelines with sequences and data-driven props.
What do I get? / Deliverables
You get Remotion composition patterns with sequences, springs, and parameterized renders suitable for automated export pipelines.
- Remotion composition and scene components
- Rendered MP4/WebM outputs from parameterized templates
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
Canonical shelf is Build because the skill teaches implementing video as versioned React code and render pipelines. Frontend subphase matches frame-based React components, Sequence timing, and headless Chromium render output.
Where it fits
Compose scenes with Sequence and spring() from a shared brand layout component.
Render platform-specific social cuts by swapping props per campaign CSV.
Regenerate onboarding videos when feature names change in product data.
How it compares
Code-first Remotion rendering—not stock FFmpeg one-liners and not a non-programmatic Canva workflow.
Common Questions / FAQ
Who is programmatic-video for?
Solo developers and agent users building Remotion projects for marketing, onboarding, or personalized outbound video from structured data.
When should I use programmatic-video?
During Build when scaffolding compositions; during Launch when generating campaign or social clips; during Grow when lifecycle emails need fresh rendered variants.
Is programmatic-video safe to install?
Review the Security Audits panel on this Prism page; rendering uses local Chromium and your assets—validate fonts, media licenses, and npm dependencies yourself.
SKILL.md
READMESKILL.md - Programmatic Video
# Programmatic Video Part of [Agent Skills™](https://github.com/itallstartedwithaidea/agent-skills) by [googleadsagent.ai™](https://googleadsagent.ai) ## Description Programmatic Video enables React-based video rendering with Remotion, where every frame is a React component and every animation is expressed in code. The agent builds video compositions with sequences, transitions, spring animations, and data-driven content, producing MP4/WebM output rendered in headless Chromium without any video editing software. Traditional video editing is manual, non-reproducible, and impossible to template. Programmatic video treats video as code: compositions are versioned in git, parameterized for batch rendering, and tested with snapshot assertions. A single template can generate thousands of personalized videos by changing the input data—product demos, social media clips, onboarding sequences, or marketing videos, each customized per recipient. Remotion's architecture maps React's component model to video: each component receives a `frame` number and the total `durationInFrames`, using these to calculate animations, transitions, and timing. The agent composes scenes from reusable components, orchestrates their timing with `<Sequence>` wrappers, and applies spring-based physics animations for natural motion. ## Use When - Creating videos from code without video editing software - Generating personalized or data-driven video content at scale - Building animated explainers, product demos, or social media clips - Automating video production in CI/CD pipelines - The user requests "programmatic video", "Remotion", or "video from code" - Producing video assets with consistent branding across hundreds of variants ## How It Works ```mermaid graph TD A[Video Specification] --> B[Define Composition: FPS + Duration] B --> C[Build Scene Components] C --> D[Arrange with Sequences] D --> E[Add Spring Animations] E --> F[Inject Dynamic Data] F --> G[Preview in Browser] G --> H{Approved?} H -->|No| C H -->|Yes| I[Render: Headless Chromium] I --> J[Encode: MP4 / WebM] J --> K[Output Video File] ``` Each scene is a React component that receives the current frame number. Compositions define the canvas size, frame rate, and total duration. Sequences place scenes at specific time offsets. Rendering captures each frame as a screenshot and encodes them into video. ## Implementation ```tsx import { AbsoluteFill, Composition, Sequence, useCurrentFrame, useVideoConfig, interpolate, spring } from "remotion"; const TextReveal: React.FC<{ text: string }> = ({ text }) => { const frame = useCurrentFrame(); const { fps } = useVideoConfig(); const opacity = interpolate(frame, [0, 15], [0, 1], { extrapolateRight: "clamp" }); const translateY = spring({ frame, fps, config: { damping: 12, stiffness: 200 } }); const y = interpolate(translateY, [0, 1], [40, 0]); return ( <AbsoluteFill style={{ justifyContent: "center", alignItems: "center" }}> <h1 style={{ fontSize: 72, fontWeight: "bold", color: "white", opacity, transform: `translateY(${y}px)`, }}> {text} </h1> </AbsoluteFill> ); }; const DataDrivenSlide: React.FC<{ metric: string; value: number }> = ({ metric, value }) => { const frame = useCurrentFrame(); const displayValue = Math.round(interpolate(frame, [0, 45], [0, value], { extrapolateRight: "clamp" })); return ( <AbsoluteFill style={{ justifyContent: "center", alignItems: "center", background: "#0a0a0a" }}> <div style={{ textAlign: "center" }}> <div style={{ fontSize: 120, fontWeight: "bold", color: "#3b82f6" }}> {displayValue.toLocaleString()} </div> <div style={{ font