Skip to content
remotion-best-practices logo

Remotion Best Practices

remotion-best-practices

Domain-specific knowledge base for building videos with Remotion and React.

remotion-dev/skills574.2Kinstalls4.8KstarsGenerative Media

SKILL.md

Full skill instructions

When to use

Use this skill whenever you are dealing with Remotion code to obtain the domain-specific knowledge.

New project setup

When in an empty folder or workspace with no existing Remotion project, scaffold one using:

npx create-video@latest --yes --blank --no-tailwind my-video

Replace my-video with a suitable project name.

Designing a video

Before designing visual scenes, layouts, promos, motion graphics, or text-heavy videos, load rules/​video-layout.md for video-first layout and text sizing guidance.

Animate properties using useCurrentFrame() and interpolate(). Prefer interpolate() over spring() unless physics-based motion is explicitly needed. Use Easing.bezier() to customize timing, including jumpy or overshooting motion.

For animations that should be editable in Remotion Studio, keep the interpolate() call inline in the style prop and use individual CSS transform properties (scale, translate, rotate) instead of composing a transform string.

import { useCurrentFrame, Easing, interpolate, useVideoConfig } from "remotion";

export const FadeIn = () => {
  const frame = useCurrentFrame();
  const { fps } = useVideoConfig();

  const opacity = interpolate(frame, [0, 2 * fps], [0, 1], {
    extrapolateRight: "clamp",
    extrapolateLeft: "clamp",
    easing: Easing.bezier(0.16, 1, 0.3, 1),
  });

  return <div style={{ opacity }}>Hello World!</​div>;
};

Prefer:

style={{
  scale: interpolate(frame, [0, 100], [0, 1]),
  translate: interpolate(frame, [0, 100], ["0px 0px", "100px 100px"]),
  rotate: interpolate(frame, [0, 100], ["20deg", "90deg"]),
}}

Over:

const scale = interpolate(frame, [0, 100], [0, 1]);

style={{
  transform: `scale(${scale})`,
}}

CSS transitions or animations are FORBIDDEN - they will not render correctly.
Tailwind animation class names are FORBIDDEN - they will not render correctly.

Place assets in the public/ folder at your project root.

Use staticFile() to reference files from the public/ folder.

Add images using the <Img> component:

import { Img, staticFile } from "remotion";

export const MyComposition = () => {
  return <Img src={staticFile("logo.png")} style={{ width: 100, height: 100 }} />;
};

Add videos using the <Video> component from @remotion/​media:

import { Video } from "@remotion/​media";
import { staticFile } from "remotion";

export const MyComposition = () => {
  return <Video src={staticFile("video.mp4")} style={{ opacity: 0.5 }} />;
};

Add audio using the <Audio> component from @remotion/​media:

import { Audio } from "@remotion/​media";
import { staticFile } from "remotion";

export const MyComposition = () => {
  return <Audio src={staticFile("audio.mp3")} />;
};

Assets can be also referenced as remote URLs:

import { Video } from "@remotion/​media";

export const MyComposition = () => {
  return <Video src="https://remotion.media/​video.mp4" />
};

To delay content wrap it in <Sequence> and use from. To limit the duration of an element, use durationInFrames of <Sequence>. <Sequence> by default is an absolute fill. For inline content, use layout="none".

import { Sequence } from "remotion";

export const Title = () => {
  const frame = useCurrentFrame();
  const { fps } = useVideoConfig();

  const opacity = interpolate(frame, [0, 2 * fps], [0, 1], {
    extrapolateRight: "clamp",
    extrapolateLeft: "clamp",
    easing: Easing.bezier(0.16, 1, 0.3, 1),
  });

  return <div style={{ opacity }}>Title</​div>;
};

export const Subtitle = () => {
  return <div>Subtitle</​div>;
};

const Main = () => {
  const {fps} = useVideoConfig();

  return (
    <AbsoluteFill>
      <Sequence>
        <Background />
      </​Sequence>
      <Sequence from={1 * fps} durationInFrames={2 * fps} layout="none">
        <Title />
      </​Sequence>
      <Sequence from={2 * fps} durationInFrames={2 * fps} layout="none">
        <Subtitle />
      </​Sequence>
    </​AbsoluteFill>
  );
}

The width, height, fps, and duration of a video is defined in src/​Root.tsx:

import { Composition } from "remotion";
import { MyComposition } from "./​MyComposition";

export const RemotionRoot = () => {
  return (
    <Composition
      id="MyComposition"
      component={MyComposition}
      durationInFrames={100}
      fps={30}
      width={1080}
      height={1080}
    />
  );
};

Metadata can also be calculated dynamically:

import { Composition, CalculateMetadataFunction } from "remotion";
import { MyComposition, MyCompositionProps } from "./​MyComposition";

const calculateMetadata: CalculateMetadataFunction<
  MyCompositionProps
> = async ({ props, abortSignal }) => {
  const data = await fetch(`https://api.example.com/​video/​${props.videoId}`, {
    signal: abortSignal,
  }).then((res) => res.json());

  return {
    durationInFrames: Math.ceil(data.duration * 30),
    props: {
      ...props,
      videoUrl: data.url,
    },
    width: 1080,
    height: 1080,
  };
};

export const RemotionRoot = () => {
  return (
    <Composition
      id="MyComposition"
      component={MyComposition}
      fps={30}
      width={1080}
      height={1080}
      defaultProps={{ videoId: "abc123" }}
      calculateMetadata={calculateMetadata}
    />
  );
};

Starting preview

Start the Remotion Studio to preview a video:

npx remotion studio

Optional: one-frame render check

You can render a single frame with the CLI to sanity-check layout, colors, or timing.
Skip it for trivial edits, pure refactors, or when you already have enough confidence from Studio or prior renders.

npx remotion still [composition-id] --scale=0.25 --frame=30

At 30 fps, --frame=30 is the one-second mark (--frame is zero-based).

Captions

When dealing with captions or subtitles, load the ./​rules/​subtitles.md file for more information.

Using FFmpeg

For some video operations, such as trimming videos or detecting silence, FFmpeg should be used. Load the ./​rules/​ffmpeg.md file for more information.

Silence detection

When needing to detect and trim silent segments from video or audio files, load the ./​rules/​silence-detection.md file.

Audio visualization

When needing to visualize audio (spectrum bars, waveforms, bass-reactive effects), load the ./​rules/​audio-visualization.md file for more information.

Sound effects

When needing to use sound effects, load the ./​rules/​sfx.md file for more information.

Visual and pixel effects

When creating a visual effect, prefer: 1. normal Remotion/​HTML/​CSS/​SVG/​filter/​blend/​mask animation, 2. a listed effect via rules/​effects.md, including on HTML rendered through <HtmlInCanvas>, 3. a custom createEffect() via rules/​effects.md when the user asks for a reusable/​project-specific effect, 4. custom <HtmlInCanvas onPaint> via rules/​html-in-canvas.md only if no effect fits.

For light leak overlays, see rules/​light-leaks.md. Docs: https://www.remotion.dev/docs/effects

Available effects: brightness(), contrast(), colorKey(), duotone(), grayscale(), hue(), invert(), saturation(), tint(), linearGradient(), linearGradientTint(), thermalVision(), blur(), linearProgressiveBlur(), radialProgressiveBlur(), zoomBlur(), dropShadow(), glow(), lightTrail(), evolve(), venetianBlinds(), mirror(), scale(), uvTranslate(), xyTranslate(), barrelDistortion(), chromaticAberration(), fisheye(), cornerPin(), wave(), burlap(), emboss(), dotGrid(), halftone(), noise(), noiseDisplacement(), paper(), pattern(), pixelate(), pixelDissolve(), scanlines(), speckle(), shine(), shrinkwrap(), vignette(), contourLines(), checkerboard(), halftoneLinearGradient(), gridlines(), whiteNoise(), tvSignalOff(), lines(), rings(), waves(), zigzag(), lightLeak(), starburst().

3D content

See rules/​3d.md for 3D content in Remotion using Three.js and React Three Fiber.

Advanced audio

See rules/​audio.md for advanced audio features like trimming, volume, speed, pitch.

Dynamic duration, dimensions and data

See rules/​calculate-metadata.md for dynamically set composition duration, dimensions, and props.

Advanced compositions

See rules/​compositions.md for how to define stills, folders, default props and for how to nest compositions.

Google Fonts

Is the recommended way to load fonts in Remotion. See rules/​google-fonts.md for how to load Google Fonts.

Local fonts

See rules/​local-fonts.md for how to load local fonts.

Getting audio duration

See rules/​get-audio-duration.md for getting the duration of an audio file in seconds with Mediabunny.

Getting video dimensions

See rules/​get-video-dimensions.md for getting the width and height of a video file with Mediabunny.

Getting video duration

See rules/​get-video-duration.md for getting the duration of a video file in seconds with Mediabunny.

GIFs

See rules/​gifs.md for how to display GIFs synchronized with Remotion's timeline.

Advanced Images

See rules/​images.md for sizing and positioning images, dynamic image paths, and getting image dimensions.

Lottie animations

See rules/​lottie.md for embedding Lottie animations in Remotion.

Measuring DOM nodes

See rules/​measuring-dom-nodes.md for measuring DOM element dimensions in Remotion.

Measuring text

See rules/​measuring-text.md for measuring text dimensions, fitting text to containers, and checking overflow.

Advanced sequencing

See rules/​sequencing.md for more sequencing patterns - delay, trim, limit duration of items.

TailwindCSS

See rules/​tailwind.md for using TailwindCSS in Remotion.

Text animations

See rules/​text-animations.md for typography and text animation patterns.

Advanced timing

See rules/​timing.md for advanced timing with interpolate and Bézier easing, and springs.

Transitions

See rules/​transitions.md for scene transition patterns.

Transparent videos

See rules/​transparent-videos.md for rendering out a video with transparency.

Trimming

See rules/​trimming.md for trimming patterns - cutting the beginning or end of animations.

Advanced Videos

See rules/​videos.md for advanced knowledge about embedding videos - trimming, volume, speed, looping, pitch.

Parameterized videos

See rules/​parameters.md for making a composition parametrizable by adding a Zod schema.

Maps

For simple maps with little flyovers, consider using static map images. For complex maps with animated routes or flyovers, load the maps rule: rules/​maplibre.md

Voiceover

See rules/​voiceover.md for adding AI-generated voiceover to Remotion compositions using ElevenLabs TTS.

More Generative Media skills

image-to-video logo
Generative Media

image-to-video

Smart router matching user intent to the right image-to-video model on RunComfy.

52 177K
View
flux-kontext logo
Generative Media

flux-kontext

Precise single-image editing with Flux 1 Kontext Pro on RunComfy, optimized for high-fidelity local edits.

52 176.8K
View
happyhorse-1-0 logo
Generative Media

happyhorse-1-0

Text-to-video generation with native 1080p, synchronized audio, and multi-shot character consistency.

52 176.7K
View
nano-banana-2 logo
Generative Media

nano-banana-2

Flash-tier text-to-image model optimized for rapid iteration, social thumbnails, and predictable in-image typography.

52 176.5K
View
seedance-v2 logo
Generative Media

seedance-v2

Cinematic short-form video generation with multi-modal references and native lip-sync.

52 176.4K
View
gpt-image-edit logo
Generative Media

gpt-image-edit

Image editing with OpenAI GPT Image 2, optimized for text rewriting, identity preservation, and multi-reference composition.

52 176.2K
View
wan-2-7 logo
Generative Media

wan-2-7

Text-to-video generation with audio-driven lip-sync and multi-reference motion control.

52 176.2K
View
flux-2-klein logo
Generative Media

flux-2-klein

Fast image generation with Flux 2 Klein, optimized for sub-second iteration and multi-reference brand styling.

52 176.2K
View
gpt-image-2 logo
Generative Media

gpt-image-2

Generate images via your ChatGPT subscription using text-to-image, image editing, and style transfer.

16 169.5K
View
ai-image-generation logo
Generative Media

ai-image-generation

Smart router across 11+ image models for text-to-image and image-to-image generation via RunComfy CLI.

52 120.9K
View
ai-video-generation logo
Generative Media

ai-video-generation

Route across 10+ video models (HappyHorse, Kling, Seedance, Veo, Wan, Hailuo, Dreamina) for text-to-video, image-to-video, and video extension.

52 120.6K
View
face-swap logo
Generative Media

face-swap

Swap faces into videos or stills by routing to the right model for your intent.

52 120.3K
View

Images AI tools

Transform Your Design with AI Designer by ImgCreator.ai

Freemium
View

Extend an image past the frame and let AI fill the new aspect ratio.

Freemium
View
Maze Guru logo
Images

Maze Guru

Chat-to-edit AI studio for product photos, portraits, branding, and video.

Freemium
View
BGBYE logo
Images

BGBYE

Compare specialist background removers and keep the best transparent cutout.

Freemium
View

AI-powered image editing and creation

Paid
View
W
Images

Whisk

Evolve your image creation.

Free
View

Magnific AI: Pricing, Features, FAQs, and Alternatives

Paid
View