"영상을 마우스로 자르고 붙이는 대신, React 코드로 짜서 자동으로 뽑아내는 도구"입니다. 우리가 아는 영상 편집은 프리미어·다빈치리졸브처럼 타임라인에 클립을 올리고 손으로 다듬는 방식입니다. Remotion은 발상을 뒤집습니다. "이 영상의 0.5초 지점은 어떻게 생겼는가?"를 코드로 정의해 두면, Remotion이 1초당 30번(또는 60번) 그 코드를 호출해 프레임을 한 장씩 그리고, 그 그림들을 이어 붙여 진짜 동영상 파일을 만듭니다.
이름의 'Remotion'은 'Re(act) + motion(움직임)'의 합성으로 읽힙니다. 핵심은 React + 프레임 단위 결정론 + 자동 렌더링이라는 조합입니다. 덕분에 데이터가 바뀌면 영상도 자동으로 바뀝니다. 1만 명의 사용자에게 각자 이름이 박힌 연말정산 영상을 보내거나, 매출 데이터를 넣으면 매주 자동으로 갱신되는 리포트 영상을 만드는 식의 "대량 개인화·자동화 영상"이 Remotion이 가장 빛나는 영역입니다. GitHub의 "GitHub Unwrapped"(개인별 연간 리뷰 영상)가 대표적인 실사용 사례입니다.
플립북(넘기면 움직이는 그림책)을 만든다고 합시다. 일반 편집기는 종이 100장에 직접 그림을 그려 넘기는 방식입니다. 한 장 한 장 손이 갑니다.
Remotion은 다릅니다. "n번째 장에는 공을 (n×5)픽셀 오른쪽에 그려라"라는 규칙(코드)만 적어 로봇팔에게 줍니다. 그러면 로봇이 알아서 100장을 그려 책으로 묶어줍니다. 공의 속도를 바꾸고 싶으면 숫자 하나만 고치면 됩니다. 1000장짜리도, 사람 이름만 바꾼 100권도 순식간에 찍어냅니다. 이게 "영상을 프로그래밍한다"의 의미입니다.
2026년 들어 "AI로 영상을 자동 생성/편집"하는 흐름이 거세지면서, 코드로 영상을 다루는 Remotion이 AI 에이전트의 '영상 출력 엔진'으로 재조명받고 있습니다. LLM은 텍스트·코드를 잘 만들지만 영상을 직접 만들지는 못합니다. 그런데 Remotion이 있으면 "LLM이 React 코드를 짜고 → Remotion이 그 코드를 영상으로 렌더링"하는 파이프라인이 가능해집니다. 실제로 이 저장소 안에는 skills-evals처럼 AI 스킬 관련 디렉토리까지 생겼습니다.
| 항목 | GUI 편집기(프리미어 등) | 모션 템플릿(AE 템플릿) | Remotion |
|---|---|---|---|
| 제작 방식 | 마우스로 손편집 | 템플릿에 값 끼우기 | React 코드로 정의 |
| 데이터 연동 | 거의 불가 | 제한적 | API·DB·JSON 자유 연동 |
| 대량 개인화 | 불가능 | 수작업 반복 | props만 바꿔 무한 생성 |
| 버전 관리 | 바이너리(불가) | 바이너리(불가) | Git으로 코드 diff 관리 |
| 협업 | 파일 주고받기 | 파일 주고받기 | PR·코드리뷰 |
| 자동 렌더링 | 수동 export | 수동 | CLI·Lambda로 CI 자동화 |
새 영상 언어를 배울 필요가 없습니다. CSS 애니메이션, SVG, Canvas, WebGL(Three.js), HTML 폰트, npm 패키지를 그대로 영상에 씁니다. 프론트엔드 개발자라면 이미 가진 기술로 바로 영상을 만들 수 있다는 점이 강력한 진입 장벽 제거입니다.
영상의 내용이 props(입력값)로 들어갑니다. 사용자 이름·매출 숫자·지도 좌표를 props로 넘기면 같은 코드가 수천 개의 서로 다른 영상을 찍어냅니다. 마케팅·뉴스레터·SaaS 대시보드 영상 등 "콘텐츠는 같고 데이터만 다른" 영상에 압도적으로 강합니다.
Studio(브라우저 미리보기 편집기)로 만들고, Player(React 컴포넌트)로 내 웹앱에 영상 플레이어를 끼워 넣고, @remotion/lambda로 AWS에 수백 대를 동시에 띄워 긴 영상을 몇 초 만에 렌더링합니다. 제작-임베드-대규모 렌더링이 하나의 생태계로 묶여 있습니다.
코드는 공개돼 있지만 라이선스가 특별합니다. 개인·비영리·소규모 회사는 무료로 쓸 수 있으나, 일정 규모 이상의 회사는 유료 '회사 라이선스(Company License)'를 구매해야 합니다. MIT/Apache 같은 통상의 오픈소스로 착각하고 사내 도입했다가 라이선스 위반이 될 수 있으니, 도입 전 LICENSE.md를 반드시 확인해야 합니다.
Remotion은 단일 패키지가 아니라 수십 개의 npm 패키지가 한 저장소에 모인 모노레포(monorepo)입니다. package.json을 보면 bun(패키지 매니저)과 turbo(빌드 오케스트레이터)로 묶여 있고, React 19를 쓰며, AWS SDK·Three.js·WebCodecs 관련 라이브러리가 카탈로그로 버전 고정돼 있습니다. 즉 "영상 코어 + 편집기 + 플레이어 + 분산 렌더링 + 미디어 파서"가 한 묶음으로 개발됩니다.
| 항목 | 내용 |
|---|---|
| 언어 | TypeScript 5.9 (+ 실험적 native-preview 컴파일러) |
| UI 런타임 | React 19.2 / react-dom — 프레임을 그리는 주체 |
| 핵심 API | Composition, useCurrentFrame(), interpolate(), spring(), Sequence, AbsoluteFill, Series |
| 검증 | Zod 4 — Composition의 props 스키마를 정의해 Studio에서 폼으로 편집 |
| 패키지 | 역할 |
|---|---|
| @remotion/cli | 터미널에서 remotion render, remotion studio 실행 |
| @remotion/studio | 브라우저 기반 실시간 미리보기·타임라인 편집기 |
| @remotion/player | 내 React 앱에 끼워 넣는 영상 플레이어 컴포넌트(렌더 없이 실시간 재생) |
| create-video | npx create-video@latest — 템플릿 스캐폴딩 |
| 패키지 | 역할 |
|---|---|
| @remotion/lambda | AWS Lambda 분산 렌더링 — 프레임을 쪼개 수백 함수가 병렬 처리 |
| @remotion/serverless | 서버리스 렌더링 공통 로직(클라우드 추상화) |
| @remotion/media-parser | 순수 JS 미디어 컨테이너 파서(mp4/webm 등 메타·프레임 추출) |
| @remotion/webcodecs | 브라우저 WebCodecs로 인코딩/디코딩 — 서버 없이 변환 |
| @remotion/web-renderer | 브라우저 안에서 영상 렌더(서버리스의 끝판) |
| @remotion/whisper-web | 브라우저에서 음성→자막 변환(Whisper) |
| @remotion/three | Three.js / react-three-fiber로 3D 영상 |
@remotion/webcodecs·web-renderer가 이 위에 서 있다.Remotion의 마법을 한 문장으로 줄이면 이렇습니다. "헤드리스 크롬으로 React 화면을 한 프레임씩 띄워 스크린샷을 찍고, 그 PNG들을 ffmpeg로 이어 붙여 동영상으로 인코딩한다." 즉 진짜 영상 코덱을 React가 다루는 게 아니라, "브라우저 화면 캡처 + 인코딩"을 자동화한 것입니다.
여기서 가장 중요한 설계 원칙은 결정론(determinism)입니다. 같은 프레임 번호는 언제 그려도 똑같은 그림이어야 한다는 규칙입니다. Math.random()이나 현재 시각 같은 "매번 달라지는 값"을 화면에 직접 쓰면 안 되고, Remotion이 주는 random()(시드 고정)을 써야 합니다. 이 원칙 덕분에 프레임 0번과 89번을 서로 다른 컴퓨터가 동시에 그려도 결과가 일관됩니다 — 이것이 분산 렌더링의 전제입니다.
10분짜리 4K 영상을 한 대로 렌더링하면 수십 분이 걸립니다. @remotion/lambda는 프레임 구간을 청크(chunk)로 쪼개, 수백 개의 Lambda 함수에 "너는 0~30프레임, 너는 31~60프레임" 식으로 나눠줍니다. 각자 부분 영상을 만들어 S3에 올리면, 마지막에 하나로 합칩니다(concat). 프레임이 서로 독립적(결정론)이기에 가능한 전략입니다.
// 프레임 번호를 '값'으로 바꾸는 것이 Remotion의 전부
import {useCurrentFrame, interpolate, spring, useVideoConfig} from 'remotion';
const MyTitle = () => {
const frame = useCurrentFrame(); // 지금 몇 번째 프레임?
const {fps} = useVideoConfig();
// frame 0→30 동안 투명도를 0→1로 (페이드 인)
const opacity = interpolate(frame, [0, 30], [0, 1], {
extrapolateRight: 'clamp',
});
// 통통 튀는 자연스러운 등장 (물리 기반 스프링)
const scale = spring({frame, fps, config: {damping: 12}});
return <div style={{opacity, transform: `scale(${scale})`}}>안녕!</div>;
};
핵심 패턴이 보입니다. useCurrentFrame()로 "지금"을 숫자로 받고, interpolate()로 그 숫자를 "투명도·위치·크기" 같은 화면 값으로 변환합니다. spring()은 물리 시뮬레이션으로 자연스러운 가속/감속을 줍니다. 시간을 if문이 아니라 함수로 다룬다는 점이 핵심입니다.
각 프레임이 다른 프레임에 의존하지 않으니, ① 어느 지점이든 즉시 미리보기(Player)가 되고 ② 여러 머신이 동시에 렌더링할 수 있고 ③ 같은 입력이면 결과가 항상 같아 테스트·캐싱이 쉽습니다. "복잡한 영상 = 단순한 함수의 모음"으로 분해한 것이 Remotion 아키텍처의 정수입니다.
저장소 루트의 package.json은 "workspaces": {"packages": ["packages/**"]}로 돼 있습니다. 즉 실질 코드는 거의 전부 packages/ 아래에 패키지별로 흩어져 있습니다. 빌드 스크립트 이름(makecore, makestudio, makeplayer, makeserverless…)에서 주요 패키지를 역으로 읽어낼 수 있습니다.
주목할 점은 template-tiktok·template-audiogram·template-recorder 같은 실전 템플릿과, 이들이 @remotion/install-whisper-cpp 패키지를 통해 whisper.cpp(C++ 음성인식)를 런타임에 다운로드하는 구조라는 사실입니다. 즉 "틱톡용 자막 영상"이나 "오디오 파형 시각화 영상" 같은 흔한 수요를 바로 시작할 수 있는 출발점이 들어 있습니다. skills-evals의 존재는 Remotion이 AI 영상 생성 쪽으로 영역을 넓히고 있다는 신호입니다.
Remotion을 배우면 애니메이션이 결국 "시간(t) → 화면 속성" 함수임을 체득합니다. interpolate·spring·Easing의 사용법은 CSS 애니메이션, 게임 루프, 데이터 시각화 트랜지션에 그대로 전이됩니다.
spring의 damping 값을 바꿔가며 "탄성"이 어떻게 달라지는지 관찰해 보세요.<Sequence from={30} durationInFrames={60}>로 "이 장면은 30프레임부터 60프레임 동안만 보인다"를 선언합니다. 여러 장면을 시간축 위에 배치·중첩하는 사고는 복잡한 UI 상태를 컴포넌트로 쪼개는 훈련과 똑같습니다.
Series로 구성하고, 각 구간을 별도 컴포넌트로 분리해 보세요.Composition에 schema={zodSchema}를 주면 Studio가 자동으로 입력 폼을 그려줍니다. "입력값에 따라 결과가 달라지는 영상" 설계는 곧 함수형 사고이며, 대량 개인화 영상의 토대입니다.
{name, score} props를 받아 "○○님의 점수는 △△점!"을 보여주는 영상을 만들고, 같은 코드에 props만 바꿔 5개의 다른 영상을 CLI로 렌더링해 보세요.remotion render를 GitHub Actions에 넣으면 "데이터가 바뀌면 영상이 자동 갱신"되는 파이프라인이 됩니다. Lambda 편을 파면 서버리스·S3·병렬 처리·동시성 제한 같은 클라우드 개념을 영상이라는 구체적 맥락으로 익히게 됩니다.
npx remotion render MyComp out.mp4로 첫 영상을 뽑은 뒤, props를 JSON 파일로 빼서 --props=./data.json으로 주입해 보세요.| 항목 | 요구사항 |
|---|---|
| Node.js | 16 이상(engines 명시). 실제로는 18/20 LTS 권장 |
| OS | macOS · Windows · Linux(서버 렌더링 시 Linux + 폰트/Chrome 의존성 설치 필요) |
| 브라우저 | 렌더 시 헤드리스 Chrome/Chromium 자동 사용(Remotion이 내려받음) |
| 메모리 | HD는 4~8GB로 충분, 4K·고해상도·동시 렌더는 16GB+ 권장 |
| CPU/GPU | 코어가 많을수록 동시 프레임 렌더가 빠름. GPU는 일부 가속에만 관여 |
| 디스크 | 중간 PNG 프레임 저장 공간 필요(긴 4K 영상은 수 GB 임시 사용) |
| 클라우드(선택) | AWS 계정(@remotion/lambda) — Lambda·S3·IAM 권한 설정 |
영상 1초가 30fps면 프레임 30장을 모두 그려야 합니다. 길고(분), 크고(4K), 촘촘할수록(60fps) 렌더 시간이 급격히 늘어납니다. 로컬에서 오래 걸린다면 동시성(--concurrency) 조절, 그래도 부족하면 Lambda 분산이 정답입니다. "미리보기(Player)는 즉시, 최종 렌더는 무거움"을 항상 염두에 두세요.
npx create-video@latest로 프로젝트를 만들고 npm run dev로 Studio를 엽니다. 기본 컴포넌트에서 useCurrentFrame() + interpolate로 텍스트가 좌→우로 미끄러지게 만들어 보세요. 타임라인을 드래그하며 프레임별 변화를 눈으로 확인하는 것이 목표입니다.
로고 등장 → 슬로건 → 콜투액션(CTA) 세 장면을 <Sequence>로 시간축에 배치합니다. 각 장면을 별도 컴포넌트로 분리하고, spring()으로 등장 애니메이션을 입혀 보세요.
Zod 스키마로 {name, stats[]} props를 정의하고, 막대그래프가 자라나는 "연간 리뷰" 영상을 만듭니다. 그런 다음 CLI에서 서로 다른 JSON 5개를 --props로 넣어 5개의 다른 MP4를 자동 생성해 보세요. (GitHub Unwrapped의 미니 버전)
공식 template-audiogram을 받아 코드를 뜯어봅니다. @remotion/media-utils로 오디오 진폭을 읽어 파형을 그리고, @remotion/whisper-web 또는 자막 파일로 가사를 동기화해 보세요. 팟캐스트 클립 제작 워크플로를 체험합니다.
GitHub Actions에서 remotion render를 돌려, 저장소의 데이터 파일이 바뀌면 영상이 자동으로 다시 만들어지는 파이프라인을 구축합니다. 여력이 되면 AWS 계정을 연결해 @remotion/lambda로 긴 영상을 분산 렌더링하고, 단일 머신 대비 시간을 비교해 보세요.
| 주차 | 주제 | 학습 내용 |
|---|---|---|
| 1주차 | React + 시간 모델 | 함수형 컴포넌트·hooks 복습, useCurrentFrame·interpolate·spring·Easing로 애니메이션 기본기 |
| 2주차 | 구성과 합성 | Composition·Sequence·Series·AbsoluteFill, 오디오/이미지/비디오 삽입, 레이어링 |
| 3주차 | 데이터·검증·렌더 | Zod 스키마 props, CLI 렌더링, --props 주입, 대량 개인화 영상 자동화 |
| 4주차 | 인프라·확장 | @remotion/player 임베드, @remotion/lambda 분산 렌더, CI 연동, (옵션) @remotion/three 3D·webcodecs |
처음부터 Lambda·WebCodecs 같은 인프라로 가지 마세요. "프레임 → 값" 한 줄 애니메이션이 손에 붙는 1~2주차가 가장 중요합니다. 이 직관만 생기면 나머지(합성·데이터·렌더)는 React/클라우드 지식의 응용일 뿐입니다.
durationInFrames(길이)·fps·width·height를 묶는다. "이 영상은 1920×1080, 30fps, 90프레임짜리이고 이 컴포넌트를 그린다"를 선언하는 것.clamp 등)도 지정한다. 애니메이션 값 계산의 일꾼.damping(감쇠)·stiffness(강성)로 통통 튀는 정도를 조절한다. 선형 변환(interpolate)보다 생동감 있는 모션에 쓴다.Sequence는 자식 요소를 특정 프레임 구간에만 보이게 하고 그 안의 시간 기준을 0부터 다시 센다. Series는 여러 장면을 순서대로 이어 붙이는 편의 컴포넌트. 장면 배치의 핵심 도구.random()을 써야 보장된다. 분산·재시도·캐싱의 전제 조건.공식 — 깃허브 remotion-dev/remotion · 문서 remotion.dev/docs · API remotion.dev/api · 쇼케이스 remotion.dev/showcase
시작하기 — 터미널에서 npx create-video@latest 한 줄. 라이선스는 저장소의 LICENSE.md(개인/소규모 무료, 일정 규모 이상 회사는 유료)를 반드시 확인.
실전 사례 — GitHub Unwrapped(개인별 연간 리뷰 영상) · Fireship의 "코드로 만든 영상" 등. 저장소 packages/template-*의 tiktok·audiogram·recorder 템플릿이 좋은 출발점.