모든 스킬

remotion-best-practices (remotion-dev/skills)

Remotion 작업을 영상 제작, 마크업, 지도, 멀티미디어, 상호작용별 안내로 연결합니다.

Remotion 스킬: 영상 품질은 스킬 없이, 그리고 규칙을 한 문장으로 쓴 경우와 같고, 토큰은 1.4배 사용합니다

상황에 따라안전

Codex CLI · gpt-6-astra

22.9 / 30

스킬 없이 대비 향상폭: -0.01 · 상황에 따라 · 18회 실행

상황에 따라: 향상폭 -0.01가 +1.0 미만. 추천이 되려면 총점 22/30, 출력 품질 3.5, 향상폭 +1.0이 필요합니다.

SOTA

통과

Codex로 테스트

커버 대상 Codex, Claude Code

Codex CLI 0.166 (SOTA 티어): 채점된 실행 18회. 여기서 통과하면 티어 규칙에 따라 Claude Code도 커버되지만, 두 번째 티어에 대해서는 아무것도 말해주지 않습니다.

점수

각 차원은 0~5점이며 여섯 차원을 더하면 30점 만점의 총점이 됩니다. 모든 차원에서 5가 가장 좋습니다. 비용 5는 저렴하고 빠름, 설치 5는 쉬움을 뜻합니다.

트리거 신뢰도
5.0
스킬 없이 대비 향상폭
2.0
출력 품질
4.9
토큰 및 시간 비용
3.0
설치 및 이식성
4.0
안전성
4.0

보안 리뷰

안전

정적 스캔: CRITICAL 13 / HIGH 16 / MEDIUM 0. 수동 검토: 네트워크가 차단된 샌드박스에서 실행 안전. 스캔이 깨끗하다고 해서 스킬이 안전하다는 증거는 아닙니다.

설치

npx skills@latest add remotion-dev/skills --skill remotion-best-practices

출처

고정 커밋: 30d4553ecd46fbc5212fd0ff006ae43af522158b

테스트일: 2026-11-02

테스트한 과제

  • 15초 제품 티저 — 이 Remotion 프로젝트(src/의 React 컴포넌트, composition id 'Main', npx remotion render src/index.ts Main으로 렌더링)에서 월간 해초 스낵 구독 서비스 Tidepool의 15초, 1920x1080, 30 fps 제품 티저를 만드세요. 화면에 반드시 넣을 텍스트: …
  • 20초 애니메이션 막대 차트 설명 영상 — 이 Remotion 프로젝트(src/의 React 컴포넌트, composition id 'Main', npx remotion render src/index.ts Main으로 렌더링)에서 20초, 1920x1080, 30 fps 애니메이션 설명 영상을 만드세요. 월별 매출 막대 차트(Aug $42k, Sep $58k, Oct $71k)입니다. 제목 'Reven…
  • 30초 세로 자막 숏폼 — 이 Remotion 프로젝트(src/의 React 컴포넌트, composition id 'Main', npx remotion render src/index.ts Main으로 렌더링)에서 30초 세로 1080x1920, 30 fps 소셜 숏폼을 만들되 자막을 화면에 구워 넣으세요(burned-in). 자막은 순서대로, 각 자막을 화면에 약 5초…

장점

  • 스킬 이름을 언급하지 않았는데도 적용되었습니다. 스킬 사용군 실행 6/6회에서 스킬 파일을 읽었습니다.
  • 스킬 사용 시 높은 절대 품질: 4.91/5.

단점

  • 스킬 없이보다 측정 가능한 향상 없음(-0.01, 노이즈 범위 안).
  • 한 문장 프롬프트는 4.89점, 스킬 사용은 4.91점(+0.02).
  • 대조군이 이미 4.91점이라 천장 효과가 있어, 이 테스트로는 향상폭을 보여 줄 수 없습니다.
  • 과제·그룹당 n=2이며, 약 1점 미만의 차이는 노이즈입니다.

리뷰

Codex CLI 0.166 (gpt-6-astra, low reasoning)을 Mac 테스트 머신에서 실행했고, 실행마다 새 임시 프로젝트와 임시 HOME/TMPDIR/캐시를 사용했습니다. 스킬 설치(스킬 사용군), 미설치(대조군), 미설치 상태에서 스킬의 핵심 요구사항만 한 문장으로 압축해 프롬프트에 덧붙인 경우(한 문장 프롬프트군)로 나눴으며, 과제·그룹당 2회씩 실행했습니다. 네트워크는 끄고 /tmp 쓰기는 차단했습니다. 프롬프트에는 스킬 이름을 언급하지 않았습니다(아래에 적은 경우 제외). 환경: 프로젝트 템플릿(composition id가 Main인 Remotion 프로젝트)은 모든 그룹에 동일합니다. 샌드박스에는 네트워크도 Remotion 툴링도 없어 어느 그룹도 Studio를 실행하거나 렌더링할 수 없었고, 소스 코드만 작성했습니다. 이후 별도의 오프라인 머신에서 Remotion 4.0.539로 모든 프로젝트를 렌더링했습니다. 스킬의 '먼저 프리뷰 열기' 단계는 수행할 수 없었습니다.

3개 그룹 비교

그룹평균 점수 (0-5)실행당 토큰
스킬 없음4.91159k
한 문장 프롬프트4.89156k
스킬 사용4.91217k

Codex CLI에서 18회 실행해 측정했고, LLM 심사 없이 규칙 기반 검사로 채점했습니다. 총점 22.9 / 30, 판정 상황에 따라.

판정: 상황에 따라 다름 (22.9 / 30). 출처: remotion-dev/skills, skills/remotion-best-practices, 커밋 30d4553에 고정. 설치: npx skills@latest add remotion-dev/skills --skill remotion-best-practices. 라이선스: Remotion License(3인 초과 기업은 유료 라이선스 필요, 평가 전용).

무엇인가

remotion-best-practices 스킬은 Remotion 공식 스킬 세트의 라우터입니다(remotion-dev/skills, 버전 4.0.539, Remotion License). SKILL.md(약 600단어)는 에이전트를 하위 스킬로 안내합니다. 영상 만들기, 마크업 모범 사례(useCurrentFrame()과 interpolate()로 애니메이션 구동, useVideoConfig()에서 fps 가져오기, CSS 트랜지션과 Tailwind 애니메이션 클래스 금지), 지도, 자막, 스튜디오, 렌더링 등입니다. Markdown 하위 스킬 약 12개와 작은 로컬 .mjs 스크립트 2개로 구성됩니다. 또한 에이전트에게 Remotion Studio 미리보기를 열고, 요청받지 않으면 렌더링하지 말라고 지시합니다.

테스트 방법

Mac 테스트 머신에서 Codex CLI 0.166(gpt-6-astra, 낮은 추론)을 실행했고, 실행마다 새 임시 프로젝트와 임시 HOME/TMPDIR/캐시를 사용했습니다. 스킬을 설치한 경우(스킬 사용군), 설치하지 않은 경우(대조군), 스킬 없이 스킬의 핵심 요구사항을 한 문장으로 압축해 프롬프트 끝에 붙인 경우(한 문장 프롬프트군)로 나눴고, 작업마다 각 군 2회씩 실행했습니다. 네트워크는 끄고 /tmp 쓰기는 차단했습니다. 프롬프트에는 스킬 이름을 전혀 언급하지 않았습니다(아래에 적은 표현은 예외).

환경: 프로젝트 템플릿(컴포지션 id가 Main인 Remotion 프로젝트)은 모든 군에 동일합니다. 샌드박스에는 네트워크와 Remotion 도구가 없어 어느 군도 Studio를 시작하거나 렌더링할 수 없었고, 소스 코드만 작성했습니다. 이후 별도의 오프라인 머신에서 Remotion 4.0.539로 모든 프로젝트를 렌더링했습니다. 스킬의 '먼저 미리보기를 여세요' 단계는 수행할 수 없었습니다.

  1. 15초 제품 티저 — 이 Remotion 프로젝트(src/의 React 컴포넌트, 컴포지션 id 'Main', npx remotion render src/index.ts Main으로 렌더링)에서 월간 김 스낵 구독 브랜드 Tidepool의 15초, 1920x1080, 30 fps 제품 티저를 만드세요. 화면에 반드시 넣을 텍스트: …
  2. 20초 애니메이션 막대 차트 설명 영상 — 이 Remotion 프로젝트(src/의 React 컴포넌트, 컴포지션 id 'Main', npx remotion render src/index.ts Main으로 렌더링)에서 20초, 1920x1080, 30 fps 애니메이션 설명 영상을 만드세요: 월별 매출 막대 차트(8월 $42k, 9월 $58k, 10월 $71k). 제목 '매출…'
  3. 30초 세로형 자막 숏 — 이 Remotion 프로젝트(src/의 React 컴포넌트, 컴포지션 id 'Main', npx remotion render src/index.ts Main으로 렌더링)에서 30초 세로형 1080x1920, 30 fps 소셜 숏 영상을 자막을 화면에 구워 넣어(burned-in) 만드세요. 자막은 순서대로 각각 약 5초…

채점은 프로그램 방식(숨은 테스트, 심어 둔 문제 탐지, 제약 조건 검사, 해당되는 경우 렌더링+OCR)으로 실행당 0~5점입니다. 점수를 결정한 LLM 심사자는 없습니다.

결과

세 번째 군에 전달한 한 문장 프롬프트: "모든 애니메이션을 useCurrentFrame()과 interpolate()/spring()으로 구동하세요(CSS transition/animation은 절대 사용 금지). fps는 useVideoConfig()에서 가져와 초를 프레임으로 변환하고, 영상은 컴포지션 안의 <Sequence>/<Series> 장면으로 구성하세요."

작업대조군 점수한 문장 프롬프트스킬 사용대조군 토큰한 문장 프롬프트 토큰스킬 사용 토큰스킬 읽음
t1-teaser5.04.935.0230k168k254k2/2
t2-chart4.744.734.71121k168k198k2/2
t3-vertical5.05.05.0124k129k197k2/2

평균 점수: 스킬 없음 4.91, 스킬 사용 4.91(차이 -0.01). 실행당 토큰: 159k 대 217k(1.36배), 시간: 161초 대 177초. 한 문장 프롬프트 군: 4.89(한 문장 프롬프트 대비 스킬의 이득 +0.02, 스킬 없음 대비 한 문장 프롬프트의 이득 -0.03). 한 문장 프롬프트의 실행당 토큰은 156k이므로 스킬은 한 문장 프롬프트의 1.39배 비용을 씁니다.

무슨 일이 있었나

  • 영상 품질은 같았습니다. 18개 프로젝트 모두 올바른 크기, 길이, 프레임 레이트로 렌더링되었고, OCR이 각 프로젝트에서 필요한 모든 텍스트(이름, 태그라인, $14 / box, 마지막 문구, 차트 제목, 자막)를 찾아냈습니다. 평균 점수는 스킬 없음 4.91, 스킬 규칙을 한 문장으로만 넣은 경우 4.89, 스킬 사용 4.91입니다. 모든 군에서 감점된 유일한 부분은 막대 차트 설명 영상이 오랫동안 정지해 있던 것(모션이 있는 프레임 15~23%)과 한 문장 티저 2개가 48~52%였던 것입니다.
  • 세 군의 티저 콘택트 시트를 살펴봤습니다. 모두 완성된 제품 광고처럼 보였고(크림색과 짙은 초록색 장면, 파우치 일러스트, 가격 엔드 카드), 순위를 매길 수 없었습니다.
  • 스킬의 핵심 구체 규칙은 스킬이 있든 없든 지켜졌습니다. 소스를 읽어 보면 스킬 없는 6개 프로젝트 중 useVideoConfig()를 호출한 것은 없고(30 fps를 하드코딩), 스킬 프로젝트 6개와 한 문장 프로젝트 6개는 모두 사용했습니다. 어느 군의 프로젝트도 CSS 트랜지션이나 키프레임을 쓰지 않았습니다. 즉 한 문장이 같은 규칙을 전달했고, 에이전트들은 이미 지시 없이도 useCurrentFrame()과 interpolate()로 애니메이션합니다.
  • 스킬은 매번 읽혔고(6/6 스킬 사용 실행) 비용이 더 큽니다. 실행당 217k 토큰으로 스킬 없음 159k(1.36배), 한 문장 156k(1.39배)이며, 명령은 14개 대 9개입니다. 테스트한 영상 스킬 세 개 중 가장 작은 오버헤드입니다.
  • 일부는 실행할 수 없었습니다. 스킬의 첫 지시는 만들기 전에 Remotion Studio를 시작해 미리보기를 여는 것인데, 네트워크와 도구가 없어 이루어지지 않았습니다. 따라서 결과는 스킬의 텍스트만 반영합니다.

항목별 점수

항목점수근거
1. 출력 품질4.91

스킬 사용 시 평균 4.91/5(프로그램 검사, 작업별 표 참조).

2. 스킬 없음 대비 향상1.99

스킬 없음 4.91 대비 -0.01점(작업당 n=2, 약 1점 미만은 노이즈).

3. 트리거5.0스킬 사용군 6/6회 실행에서 스킬 파일을 읽었습니다.
4. 지침 이식성4

하위 스킬 파일이 많은 라우터 스킬. '먼저 Studio 열기' 규칙은 브라우저와 실행 중인 개발 서버가 필요해, 많은 에이전트 샌드박스에는 없습니다.

5. 효율성3

토큰 1.36배(실행당 217k 대 159k), 시간 1.10배(177초 대 161초).

6. 안전성·위생4

Markdown과 로컬 .mjs 스크립트 2개(네트워크 없음, 실행 없음). 스캐너 히트는 문서 예시의 .env/process.env(Mapbox, ElevenLabs 키)입니다. Remotion License는 3인 초과 기업에 유료 라이선스가 필요합니다.

이 테스트의 한계

  • 샌드박스에 Studio 미리보기, 렌더링, Remotion CLI가 없어 스킬 워크플로는 일부만 수행되었습니다.
  • 코드로 그린 작업 세 가지(티저, 막대 차트, 세로형 자막 숏). 영상 푸티지, 오디오, 음성 자막, 지도, Lottie, 3D, SaaS 렌더링 기능은 테스트하지 않았습니다.
  • 렌더링은 소프트웨어 GL을 쓰는 Linux에서 이루어졌고, 모션 검사는 조잡한 프레임 차이 임계값입니다. 차트 작업은 모든 군에서 점수를 잃습니다.
  • useVideoConfig 사용 횟수는 소스를 읽어 센 것으로 0~30 점수에는 포함되지 않습니다.
  • Remotion License: 개인과 3인 이하 기업은 무료, 그 이상은 유료. 우리는 평가만 했고 재배포하지 않습니다.
  • 작업·군당 n = 2: 약 1점 미만의 차이는 노이즈입니다.
  • 규칙 기반 채점은 검사가 볼 수 있는 것만 측정합니다. 취향이나 결과가 최선인지는 판단할 수 없습니다.

보안

security.md를 참조하세요. 스캔: CRITICAL 13 / HIGH 16 / MEDIUM 0. 판정: 실행해도 안전(네트워크 차단 샌드박스). 깨끗한 스캔 결과가 스킬의 안전성을 증명하지는 않습니다.

결론

일회성 코드 기반 영상에서는 스킬이 측정 가능한 차이를 만들지 못했습니다. 에이전트는 이미 건실한 Remotion 코드를 작성하며, 스킬 핵심 규칙을 한 문장으로 적은 것이 약 0.7배 비용으로 작은 구조적 효과를 재현했습니다. Remotion 프로젝트를 자주 만든다면 설치해 둘 만큼 저렴하지만(하위 스킬은 우리가 테스트하지 않은 지도, 자막, 렌더링을 다룸), 단순한 영상을 개선한다는 증거는 여기에 없습니다.

트랜스크립트

실행 로그: remotion-best-practices (Codex CLI, network off, per-run temp HOME/TMPDIR, one row per graded run.)
열: 작업, 그룹-회차, 점수(0-5), 토큰, 초, 통과한 검사, 에이전트가 연 스킬 파일.

t1-teaser control-1: 점수 5.0, 토큰 258594, 초 285.6, 검사 5/5, 연 파일 없음
t1-teaser control-2: 점수 5.0, 토큰 202623, 초 189.4, 검사 5/5, 연 파일 없음
t1-teaser oneliner-1: 점수 4.94, 토큰 218510, 초 266.6, 검사 5/5, 연 파일 없음
t1-teaser oneliner-2: 점수 4.92, 토큰 118109, 초 174.8, 검사 5/5, 연 파일 없음
t1-teaser treatment-1: 점수 5.0, 토큰 217450, 초 209.8, 검사 5/5, 연 파일 remotion-best-practices
t1-teaser treatment-2: 점수 5.0, 토큰 291582, 초 227.3, 검사 5/5, 연 파일 remotion-best-practices
t2-chart control-1: 점수 4.73, 토큰 130647, 초 112.9, 검사 4/5, 연 파일 없음
t2-chart control-2: 점수 4.74, 토큰 112740, 초 110.9, 검사 4/5, 연 파일 없음
t2-chart oneliner-1: 점수 4.73, 토큰 140990, 초 152.9, 검사 4/5, 연 파일 없음

18회 실행, 아티팩트 21개

샘플 출력

SOTA · With the skill: src/Tidepool.tsx (t1-teaser, run 1, Codex)

import React from 'react'; import {AbsoluteFill, Sequence, interpolate, Easing, useCurrentFrame, useVideoConfig} from 'remotion'; const cream = '#F6F1DF', ink = '#123E36', lime = '#D9EF79', orange = '#FF8552'; const serif = 'Georgia, "Times New Roman", serif'; const easing = {extrapolateLeft: 'clamp' as const, extrapolateRight: 'clamp' as const, easing: Easing.bezier(.16, 1, .3, 1)}; const Enter: React.FC<{children: React.ReactNode; delay?: number; style?: React.CSSProperties}> = ({children, delay = 0, style}) => { const f = useCurrentFrame(); return <div style={{...style, opacity: interpolate(f, [delay, delay + 18], [0, 1], easing), translate: `0 ${interpolate(f, [delay, delay + 23], [60, 0], easing)}px`}}>{children}</div>; }; const Wave = ({color = ink, bottom = -100}: {color?: string; bottom?: number}) => { const f = useCurrentFrame(); return <svg width="2200" height="300" viewBox="0 0 2200 300" style={{position: 'absolute', left: -100, bottom, translate: `${Math.sin(f / 65) * 65}px 0`}}><path d="M0 95 Q275 -15 550 95 T1100 95 T1650 95 T2200 95 V300 H0Z" fill={color}/><path d="M0 60 Q275 -50 550 60 T1100 60 T1650 60 T2200 60" fill="none" stroke={color} strokeWidth="2"/></svg>; }; const Pouch = () => { const f = useCurrentFrame(); return <div style={{width: 420, height: 610, position: 'relative', rotate: `${-7 + Math.sin(f / 40) * 1.5}deg`, translate: `0 ${Math.sin(f / 28) * 9}px`, filter: 'drop-shadow(18px 25px 0 rgba(18,62,54,.13))'}}> <svg width="420" height="610" viewBox="0 0 420 610" style={{position: 'absolute'}}> <path d="M26 5 H394 L382 55 L407 573 Q411 600 380 604 H40 Q9 600 13 573 L38 55Z" fill={lime} stroke={ink} strokeWidth="3"/> <path d="M29 18 H391 M32 29 H388 M35 43 H385 M22 577 H398 M22 587 H398" stroke={ink} strokeWidth="2" opacity=".35"/> <path d="M22 472 Q120 427 210 477 T399 477 L404 571 H16Z" fill={ink}/> <path d="M25 455 Q120 410 210 460 T397 460" fill="none" stroke={ink} strokeWidth="3"/> </svg> <div style={{position: 'absolute', top: 77, width: '100%', textAlign: 'center', color: ink}}> <div style={{fontSize: 65, fontFamily: serif, letterSpacing: -4}}>Tidepool</div> <div style={{fontSize: 15, letterSpacing: 4, marginTop: 15}}>SEAWEED SNACKS</div> <svg width="190" height="210" viewBox="0 0 190 210" fill="none" style={{marginTop: 18}}><path d="M96 203 C67 143 135 95 96 12 M96 164 C28 163 29 115 45 100 C48 138 85 116 96 164 M99 118 C157 119 163 70 143 59 C143 89 108 79 99 118 M100 71 C57 74 55 36 66 24 C72 49 94 37 100 71" stroke={ink} strokeWidth="9" strokeLinecap="round"/></svg> <div style={{fontSize: 18, letterSpacing: 3, marginTop: 9}}>A LITTLE OCEAN JOY</div> </div> <div style={{position: 'absolute', top: 513, width: '100%', textAlign: 'center', color: cream, fontSize: 20, letterSpacing: 3}}>CRISP • SAVORY • SEAWEED</div> </div>; }; const Chip = ({x, y, angle, index}: {x: number; y: number; angle: number; index: number}) => { const f = useCurrentFrame(); return <svg width="340" height="260" viewBox="0 0 260 200" style={{position: 'absolute', left: x, top: y, rotate: `${angle + Math.sin(f / 35 + index) * 6}deg`, translate: `0 [... excerpt: first 3200 of 8030 characters]

Pro 보기