programmatic-video — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited programmatic-video (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Part of Agent Skills™ by googleadsagent.ai™
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.
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.
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={{ fontSize: 32, color: "#a1a1aa", marginTop: 16 }}>{metric}</div>
</div>
</AbsoluteFill>
);
};
export const MainComposition: React.FC<{ title: string; metrics: Array<{ name: string; value: number }> }> = ({
title, metrics
}) => {
return (
<AbsoluteFill style={{ background: "#0a0a0a" }}>
<Sequence durationInFrames={60}>
<TextReveal text={title} />
</Sequence>
{metrics.map((m, i) => (
<Sequence key={m.name} from={60 + i * 75} durationInFrames={75}>
<DataDrivenSlide metric={m.name} value={m.value} />
</Sequence>
))}
</AbsoluteFill>
);
};
export const RemotionRoot: React.FC = () => (
<Composition
id="MainVideo"
component={MainComposition}
durationInFrames={300}
fps={30}
width={1920}
height={1080}
defaultProps={{
title: "Q1 Performance",
metrics: [
{ name: "Page Views", value: 18247 },
{ name: "Conversions", value: 1432 },
{ name: "Revenue", value: 89500 },
],
}}
/>
);# Preview in browser
npx remotion studio
# Render to MP4
npx remotion render MainVideo output.mp4
# Batch render with different data
npx remotion render MainVideo --props='{"title":"Q2","metrics":[...]}'spring() for natural-feeling animations instead of linear interpolationinterpolate() calls to prevent values from overshooting<Sequence> to organize scenes with explicit timing, not frame-based conditionals| Platform | Support | Notes |
|---|---|---|
| Cursor | Full | React + Remotion development |
| VS Code | Full | Remotion extension available |
| Windsurf | Full | React-based development |
| Claude Code | Full | Component + config generation |
| Cline | Full | Video pipeline setup |
| aider | Partial | Code generation only |
programmatic-video remotion react-video animation data-driven-video batch-rendering composition spring-animation
© 2026 googleadsagent.ai™ | Agent Skills™ | MIT License
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.