Senior Specialist in Remotion v4.0+, React 19, and Next.js 16. Expert in programmatic video generation, sub-frame animation precision, and AI-driven video workflows for 2026.
Senior Specialist in Remotion v4.0+, React 19, and Next.js 16. Expert in programmatic video generation, sub-frame animation precision, and AI-driven video workflows for 2026.
Remotion allows you to create videos programmatically using React. This skill expands the LLM's capabilities to handle complex animations, dynamic data-driven videos, and high-fidelity rendering pipelines.
useCurrentFrame and interpolate.Scaffold a new project using Bun (recommended for 2026):
bun create video@latest my-video
cd my-video
bun start
import { AbsoluteFill, interpolate, useCurrentFrame, useVideoConfig } from 'remotion';
export const MyVideo = () => {
const frame = useCurrentFrame();
const { fps, durationInFrames } = useVideoConfig();
// Animate from 0 to 1 over the first second
const opacity = interpolate(frame, [0, fps], [0, 1], {
extrapolateRight: 'clamp',
});
return (
<AbsoluteFill style={{
backgroundColor: 'white',
justifyContent: 'center',
alignItems: 'center'
}}>
<h1 style={{ opacity, fontSize: 100 }}>Remotion 2026</h1>
</AbsoluteFill>
);
};
@keyframes or transition. They are not deterministic and will fail during rendering. Use interpolate() or spring().frame. Avoid Math.random() or Date.now() inside components unless seeded.defaultProps to ensure type safety in parameterized videos.staticFile() for local assets and ensure remote assets are reachable during render.Everything is a function of the current frame.
const frame = useCurrentFrame();
const scale = interpolate(frame, [0, 20], [0, 1], { easing: Easing.bezier(0.25, 0.1, 0.25, 1) });
Compositions are the "entry points". They define the canvas.
<Composition
id="Main"
component={MyComponent}
durationInFrames={300}
fps={60}
width={1920}
height={1080}
defaultProps={{ title: 'Hello' }}
/>
Integration with "Remotion Skills" allows for natural language instructions to modify compositions.
// Pattern: Instruction-driven prop updates
export const aiUpdateHandler = async (instruction: string, currentProps: Props) => {
// Logic to map LLM output to Remotion props
return updatedProps;
};
Fetch data before the composition renders to set duration or dimensions.
export const calculateMetadata = async ({ props }) => {
const response = await fetch(`https://api.v2.com/video-data/${props.id}`);
const data = await response.json();
return {
durationInFrames: data.duration * 60,
props: { ...props, content: data.content }
};
};
setTimeout or setInterval. They do not sync with the renderer.npm for 2026 workflows; prefer bun for sub-second install and execution.<Sequence> for delaying elements. Manual frame offsets are error-prone.useState for animation progress. Animation state must always be derived from frame.useMemo. Remember that the component renders every frame.window.requestAnimationFrame. They won't be captured by the Remotion renderer.2 * fps.Updated: January 22, 2026 - 20:00