| name | c-video-edit |
| description | Programmatic video creation using Remotion (React-based) and Editly (JSON-based declarative). Create, render, and compose videos from code. |
| tags | ["video","editing","remotion","editly","react","rendering","creative"] |
Video Editing — Remotion & Editly
Create, render, and compose videos programmatically. Use Remotion for React-based dynamic videos or Editly for quick JSON-based assembly.
Remotion (React-based video creation)
Project Setup
npx create-video@latest my-video
cd my-video
npx remotion studio
Rendering
npx remotion render src/index.ts MyComposition out/video.mp4
npx remotion still src/index.ts MyComposition out/thumbnail.png --frame=30
npx remotion compositions src/index.ts
Render Options
npx remotion render src/index.ts MyComp out.mp4 --width 1920 --height 1080 --fps 30
npx remotion render src/index.ts MyComp out.mp4 --codec h264
npx remotion render src/index.ts MyComp out.mp4 --crf 18
npx remotion render src/index.ts MyComp out.mp4 --x264-preset fast
npx remotion render src/index.ts MyComp out.mp4 --props='{"title":"Hello","color":"blue"}'
npx remotion render src/index.ts MyComp out.mp4 --concurrency 4
npx remotion benchmark src/index.ts MyComp
Composition Structure
import { Composition } from "remotion";
import { MyVideo } from "./MyVideo";
export const RemotionRoot = () => (
<Composition id="MyVideo" component={MyVideo}
durationInFrames={150} fps={30} width={1920} height={1080} />
);
import { useCurrentFrame, interpolate, AbsoluteFill, Sequence } from "remotion";
export const MyVideo = () => {
const frame = useCurrentFrame();
const opacity = interpolate(frame, [0, 30], [0, 1]);
return (
<AbsoluteFill style={{ backgroundColor: "black" }}>
<Sequence from={0} durationInFrames={60}>
<h1 style={{ color: "white", opacity }}>Hello World</h1>
</Sequence>
</AbsoluteFill>
);
};
Editly (JSON-based declarative editing)
Quick Assembly
editly title:'Intro' clip1.mov clip2.mov title:'THE END' --out output.mp4
editly spec.json5 --fast --out output.mp4
editly spec.json5 --audio-file-path music.mp3 --out output.mp4
JSON Spec Format
{
"width": 1920,
"height": 1080,
"fps": 30,
"outPath": "output.mp4",
"defaults": {
"duration": 4,
"transition": { "name": "fade", "duration": 0.5 }
},
"clips": [
{
"duration": 3,
"layers": [{ "type": "title-background", "text": "My Video", "background": { "type": "linear-gradient" } }]
},
{
"layers": [{ "type": "video", "path": "clip1.mp4", "cutFrom": 0, "cutTo": 10 }]
},
{
"layers": [
{ "type": "image", "path": "photo.jpg" },
{ "type": "title", "text": "Caption", "position": "bottom" }
]
}
],
"audioFilePath": "background.mp3",
"keepSourceAudio": false
}
Layer Types
video — video clip (cutFrom/cutTo for trimming)
audio — audio track
image — static image
title-background — full-screen title card with background
title — text overlay
subtitle — subtitle text
gl — WebGL shader transition/effect
Guidelines
- Remotion — best for complex, data-driven, animated videos (dashboards, branded content, social media)
- Editly — best for quick assembly (concatenation, transitions, title cards, slideshows)
- Both require
ffmpeg (installed automatically with this skill)
- Remotion renders can be CPU-intensive — warn user about duration for long compositions
- Always confirm output path before rendering to avoid overwriting
- Use
--fast flag with Editly for quick previews before final render