remotion-best-practices
Skill4 starsChanged 5 months agoMITView on GitHub
Best practices for Remotion - Video creation in React
149 other projects use a version of this, 104 of them edited.
Adopted by
Most recently taken up by
- anyreachai/claude-skillsedited, first seen Nov 8, 2026
- mia-cx/skillstheir own version, first seen Nov 8, 2026
- mxrsv/agents-skillstheir own version, first seen Nov 8, 2026
- HeteroCat/heterocat-skillsedited, first seen Nov 8, 2026
- insight68/Skillsedited, first seen Nov 8, 2026
- OpenMontageInc/OpenMontageedited, first seen Nov 8, 2026
Used with
Projects with it also use ltx2, canvas-procedural-animation and 10 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
LinHao-citySkillltx2
AI video generation with LTX-2.3 22B — text-to-video, image-to-video clips for video production. Use when generating video clips, animating images, creating b-roll, animated backgrounds, or motion content. Triggers include video generation, animate image, b-roll, motion, video clip, text-to-video, image-to-video.
Also in 6 projects that use this
LinHao-citySkillcanvas-procedural-animation
Use p5.js/canvas for local procedural character effects: particles, weather, squash/stretch, walk cycles, and environmental motion.
Also in 5 projects that use this
OpenAISkillremotion-saas
Build an app with Remotion
Also in 21 projects that use this
OpenAISkillremotion-maps
Remotion Map animation knowledge
Also in 17 projects that use this
mia-cxSkillremotion-license
Find Remotion license information, FAQs, terms, and where to buy a license.
Also in 4 projects that use this
- +5 more from openai
- +2 more from LinHao-city
Other versions149 projects use a version of this.
Word for word · 0
None found.
Edited · 104
- calesthio/OpenMontage★ 78k41% same
- OpenMontageInc/OpenMontage★ 78k41% same
- vercel-labs/json-render★ 19k33% same
- netease-youdao/LobsterAI★ 6.2k32% same
- KurtGokhan/tegaki★ 3.3k99% same
- chmod777john/agent-wechat★ 1.5k28% same
- chmod777john/swarm-ide★ 1.5k28% same
- dtsola/xiaoyaosearch★ 1k27% same
- freestylefly/wesight★ 96932% same
- kapishdima/soundcn★ 86439% same
94 more not listed
Wrote their own version · 45
- openai/plugins★ 7.8ksame name
- remotion-dev/skills★ 6.6ksame name
- composio-community/open-claude-cowork★ 4.3ksame name
- ComposioHQ/open-claude-cowork★ 4.3ksame name
- digitalsamba/claude-code-video-toolkit★ 2.5ksame name
- remotion-dev/claude-code-plugin★ 79same name
- PinkR1ver/vibe-roast★ 49same name
- anton-abyzov/vskill★ 47same name
- doggy8088/agentready★ 34same name
- STARDUSTLC666/dsh-remotion★ 34same name
35 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository40 other files it gives its agents.
- academic-paper-reviewerSkill
- academic-paperSkill
- academic-pipelineSkill
- brandkitSkill
- industrial-brutalist-uiSkill
- chinese-novelistSkill
- claude-verifierSkill
- deep-researchSkill
- find-skillsSkill
- generate-imageSkill
- gpt-tasteSkill
- imagegen-frontend-mobileSkill
- imagegen-frontend-webSkill
- image-to-codeSkill
- infographicsSkill
- md-to-pptxSkill
- minimalist-uiSkill
- n8n-code-javascriptSkill
- n8n-code-pythonSkill
- n8n-expression-syntaxSkill
- n8n-mcp-tools-expertSkill
- n8n-node-configurationSkill
- n8n-validation-expertSkill
- n8n-workflow-patternsSkill
- full-output-enforcementSkill
- page-agentSkill
- pptx-postersSkill
- pptxSkill
- redesign-existing-projectsSkill
- scientific-slidesSkill
- skill-creatorSkill
- skill-evolutionSkill
- skill-factorySkill
- skill-lookupSkill
- skill-managerSkill
- skill-writerSkill
- high-end-visual-designSkill
- stitch-design-tasteSkill
- design-taste-frontendSkill
- design-taste-frontend-v1Skill
The file
We split this skill into the rules it gives an agent
12 rules. 1 is common, 6 are distinctive, and 5 are very specific to this project.
1
Common
Most of the 146 edited versions we read keep these.
6
Distinctive
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Common: line 12
Use this skills whenever you are dealing with Remotion code to obtain the domain-specific knowledge.
- Distinctive: line 16
When in an empty folder or workspace with no existing Remotion project, scaffold one using:
- Very specific: line 48
Place assets in the public/ folder at your project root.
- Very specific: line 50
Use staticFile() to reference files from the public/ folder.
- Very specific: line 52
Add images using the <Img> component:
- Very specific: line 62
Add videos using the <Video> component from @remotion/media:
- Very specific: line 73
Add audio using the <Audio> component from @remotion/media:
- Distinctive: line 198
Start the Remotion Studio to preview a video:
- Distinctive: line 217
When dealing with captions or subtitles, load the ./rules/subtitles.md file for more information.
- Distinctive: line 225
When needing to detect and trim silent segments from video or audio files, load the ./rules/silence-detection.md file.
- Distinctive: line 229
When needing to visualize audio (spectrum bars, waveforms, bass-reactive effects), load the ./rules/audio-visualization.md file for more …
- Distinctive: line 233
When needing to use sound effects, load the ./rules/sfx.md file for more information.
“Common” is measured: kept by at least 6 in 10 of the 146 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
When to use
Use this skills 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-videoReplace my-video with a suitable project name.
Designing a video
Animate properties using useCurrentFrame() and interpolate(). Use Easing to customize the timing of the animation.
import { useCurrentFrame, Easing } 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>;
};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 studioOptional: 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=30At 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.
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.
Light leaks
See rules/light-leaks.md for light leak overlay effects using @remotion/light-leaks.
Lottie animations
See rules/lottie.md for embedding Lottie animations in Remotion.
HTML in canvas
See rules/html-in-canvas.md if you need to render HTML into a <canvas> to apply 2D or WebGL effects via <HtmlInCanvas>.
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 Bezier 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.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

