Remotion Best Practices
lyonjs/shortvid.io
Best practices for Remotion - Video creation in React. An agent skill from lyonjs/shortvid.io.
A skill your agent uses when you need to render an actual video file with Remotion — React compositions, the Composition/Sequence/TransitionSeries graph, transitions, burned-in word-by-word captions…
$ npx skills add ericrisco/rsc-harness --skill remotion-video -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ericrisco/rsc-harness remotion-video --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/remotion-video .claude/skills/remotion-video && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "remotion-video" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/remotion-video into .claude/skills/remotion-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "remotion-video", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/ericrisco/rsc-harness/tree/main/skills/remotion-videoType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add ericrisco/rsc-harness --skill remotion-video -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ericrisco/rsc-harness remotion-video --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/remotion-video .agents/skills/remotion-video && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "remotion-video" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/remotion-video into .agents/skills/remotion-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "remotion-video", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ericrisco/rsc-harness --skill remotion-video -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ericrisco/rsc-harness remotion-video --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/remotion-video .cursor/skills/remotion-video && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "remotion-video" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/remotion-video into .cursor/skills/remotion-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "remotion-video", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/ericrisco/rsc-harness.git --path skills/remotion-video--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add ericrisco/rsc-harness --skill remotion-video -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ericrisco/rsc-harness remotion-video --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/remotion-video .gemini/skills/remotion-video && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "remotion-video" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/remotion-video into .gemini/skills/remotion-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "remotion-video", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install ericrisco/rsc-harness remotion-videoInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add ericrisco/rsc-harness --skill remotion-video -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/remotion-video .github/skills/remotion-video && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "remotion-video" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/remotion-video into .github/skills/remotion-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "remotion-video", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ericrisco/rsc-harness --skill remotion-video -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ericrisco/rsc-harness remotion-video --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ericrisco/rsc-harness.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/remotion-video .opencode/skills/remotion-video && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "remotion-video" agent skill from https://github.com/ericrisco/rsc-harness/tree/main/skills/remotion-video into .opencode/skills/remotion-video/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "remotion-video", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
remotion-videoA skill your agent uses when you need to render an actual video file with Remotion — React compositions, the Composition/Sequence/TransitionSeries graph, transitions, burned-in word-by-word captions…
Remotion Video is an agent skill from ericrisco/rsc-harness. Use when you need to render an actual video file with Remotion — React compositions, the Composition/Sequence/TransitionSeries graph, transitions, burned-in word-by-word captions from a transcript, automatic silence removal, b-roll overlays, headless CI renders, and a final MP4 or MOV. NOT writing the script, hook, beats or caption text (that is video-shorts), NOT mastering audio to LUFS or building an RSS feed (that is podcast), NOT structuring the narrative arc (that is course-storytelling).
Its SKILL.md is about 3.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including scripts and reference files (for example `evals/README.md`, `evals/cases.yaml` and `references/captions-pipeline.md`).
It sits in Media & Creative, covering Video production and Storytelling. It works with Remotion and React. The repository describes itself as: Your agent invents things because it has no memory, and can't touch your database because it has no arms. rsc is the meta-harness that gives it both, plus the trade to know the… The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit e3d5b33. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (Shell), which the agent can run.
Shell commands in SKILL.md call:
npxnpmpipbashFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npx, npm and pip, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Remotion Video loads about 3.5k tokens when it runs, and up to ~6.2k if it reads all its reference files. Until then it costs about 130 tokens; SKILL.md has 1,377 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from ericrisco/rsc-harness at commit e3d5b33, republished under its MIT licence (© ericrisco). 1,377 words, ~3,550 tokens.
.claude/skills/remotion-video/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.You are the encoder and renderer. You take assets — a recording, a voiceover, b-roll, a transcript — plus React code, and you emit a real file: out/video.mp4. Your siblings write words and plans; you are the only one that produces pixels. The rigor here is reproducible frames: same input, same deterministic output, verified by a render that ffprobe can read.
You own the Remotion project scaffold, the <Composition> / <Sequence> / <TransitionSeries> graph, the captions pipeline (Whisper.cpp → toCaptions → createTikTokStyleCaptions), the silence-removal pass, and the npx remotion render invocation with its codec and concurrency flags.
If the ask is to produce a file, you are in the right place. If it is to produce text or a plan, route out before writing a single .tsx.
| The ask | Goes to | Why |
|---|---|---|
| Produce an MP4/MOV, transitions, burned captions, render | here | These are pixels and frames |
| Write the script, hook, beats, on-screen caption text, edit decision sheet | ../video-shorts/SKILL.md | Those are words; the cut decisions, not the cut execution |
Master audio to a LUFS target, produce chapters + RSS <item> | ../podcast/SKILL.md | Audio mastering and feed, not video encode |
| Structure the lesson/video narrative arc and flow | ../course-storytelling/SKILL.md | Narrative architecture, not rendering |
| Design the thumbnail image | ../youtube-thumbnails/SKILL.md | A still image, not a video |
Boundary in one line: video-shorts decides the cuts and writes the caption text; you execute the cuts in code and burn the captions into frames.
npx create-video@latest --yes --blank my-video
cd my-video
npm i
npm run dev # opens Remotion Studio in the browserRemotion's current stable line is 4.0.471; it needs Node 16+ (or Bun 1.0.3+), and local rendering targets macOS 15 (Sequoia)+. Since January 2026 Remotion ships Agent Skills — npx skills add remotion-dev/skills wires Remotion-aware guidance into Claude Code. Run it inside a Remotion project when you want the framework's own skill loaded alongside this one.
Pin fps and dimensions on <Composition> first, and never change them mid-project. Why: every duration downstream is measured in frames, and frames = seconds * fps. Change fps after you have written durations and every timing silently shifts. Vertical shorts are 1080×1920 @ 30; landscape is 1920×1080 @ 30.
// src/Root.tsx
import { Composition } from "remotion";
import { MyVideo } from "./MyVideo";
export const RemotionRoot: React.FC = () => {
return (
<Composition
id="MyVideo" // the id you pass to `remotion render`
component={MyVideo}
durationInFrames={300} // 10s at 30fps
fps={30}
width={1080}
height={1920}
/>
);
};// src/MyVideo.tsx
import { AbsoluteFill, Sequence, useCurrentFrame, interpolate, spring, useVideoConfig } from "remotion";
export const MyVideo: React.FC = () => {
const frame = useCurrentFrame();
const { fps } = useVideoConfig();
const opacity = interpolate(frame, [0, 30], [0, 1], { extrapolateRight: "clamp" });
const scale = spring({ frame, fps, config: { damping: 200 } });
return (
<AbsoluteFill style={{ backgroundColor: "black" }}>
<Sequence from={0} durationInFrames={90}>
<AbsoluteFill style={{ opacity, transform: `scale(${scale})` }}>{/* scene 1 */}</AbsoluteFill>
</Sequence>
<Sequence from={90} durationInFrames={210}>{/* scene 2 */}</Sequence>
</AbsoluteFill>
);
};Animate off useCurrentFrame() with interpolate() and spring() only. Never read wall-clock time (Date.now()) or call Math.random() unseeded inside a composition. Why: rendering is parallel and frame-addressable — each frame is computed independently, so any non-frame input produces a different pixel on re-render and breaks the "same input, same output" guarantee. If you need randomness, use Remotion's random(seed).
Use @remotion/transitions (available since v4.0.53). <TransitionSeries> interleaves .Sequence (a clip, with durationInFrames) and .Transition (a presentation + a timing). The transition duration is subtracted from the total, so adjacent sequences overlap during the wipe.
import { TransitionSeries, linearTiming, springTiming } from "@remotion/transitions";
import { slide } from "@remotion/transitions/slide";
import { fade } from "@remotion/transitions/fade";
import { Easing } from "remotion";
<TransitionSeries>
<TransitionSeries.Sequence durationInFrames={90}>{/* scene A */}</TransitionSeries.Sequence>
<TransitionSeries.Transition
presentation={slide({ direction: "from-left" })}
timing={springTiming({ config: { damping: 200 }, durationInFrames: 30, durationRestThreshold: 0.001 })}
/>
<TransitionSeries.Sequence durationInFrames={120}>{/* scene B */}</TransitionSeries.Sequence>
<TransitionSeries.Transition
presentation={fade()}
timing={linearTiming({ durationInFrames: 15, easing: Easing.inOut(Easing.ease) })}
/>
<TransitionSeries.Sequence durationInFrames={90}>{/* scene C */}</TransitionSeries.Sequence>
</TransitionSeries>Each presentation is a sub-import (@remotion/transitions/slide, /fade, /wipe, /flip, /clockWipe, /none).
| Presentation | Feel / when |
|---|---|
slide | Scene pushes the next in; directional momentum between beats |
fade | Soft crossfade; calm, neutral scene change |
wipe | A hard edge sweeps across; energetic, "next topic" |
flip | 3D card flip; playful, for reveals |
clockWipe | Radial sweep; countdowns, "time passing" |
none | A hard cut with no motion, but still as a TransitionSeries node |
linearTiming for predictable, frame-exact cuts; springTiming for organic motion. Why: linear is deterministic in duration so you can budget frames exactly; spring overshoots and settles, which reads as natural but needs durationRestThreshold so the render knows when it has finished.
The native @remotion/captions package shipped in v4.0.216 (the same release that deprecated the old convertToCaptions() helper). The pipeline runs once on a Node server, then the composition reads the captions:
@remotion/install-whisper-cpp downloads Whisper.cpp and a model (medium.en is ~1.5 GB) and transcribes the audio on a Node server to Whisper JSON.toCaptions() from @remotion/install-whisper-cpp turns that JSON into a Caption[] with per-token timestamps. (convertToCaptions() is the legacy alias — deprecated as of v4.0.216; use toCaptions().)@remotion/captions createTikTokStyleCaptions({ captions, combineTokensWithinMilliseconds }) groups tokens into "pages" that appear together.The combineTokensWithinMilliseconds value is the page-size dial. Why: a low value (~200ms) keeps each word on its own page → word-by-word pop animation; a high value (~1200ms) packs a phrase per page. Low ms = TikTok word-by-word energy; high ms = readable phrases. Pick by the format, not by default.
Full Whisper.cpp install, the transcribe server, and the token-highlight caption renderer component (with safe-zone styling) live in references/captions-pipeline.md — read it before building the captions layer.
The silence pass runs on the source audio/video BEFORE it enters Remotion, not inside a composition. Why: Remotion renders frames you give it; trimming dead air is an upstream edit on the asset, and doing it first means every downstream frame number already reflects the tightened timeline.
Use auto-editor (a Python + ffmpeg engine) for a first pass that cuts dead space by audio loudness:
auto-editor input.mp4 --margin 0.2s --edit audio:threshold=4% -o tightened.mp4--margin pads each kept region so cuts do not clip speech.--edit audio:threshold=4% sets the loudness floor below which a region is "silence".--export premiere emits an EDL/XML instead of a file, to re-import into an NLE.pip distribution is stale/discontinued — install via the official binary or pipx, not pip install. Why: the PyPI package lags behind and may not match the documented flags. When auto-editor is unavailable, the low-level fallback is ffmpeg's silencedetect / silenceremove filters. Both, with the full flag matrix, are in references/render-and-pipeline.md.
Stack the overlay above the main video by layering <OffthreadVideo> (or <Img>) inside an <AbsoluteFill>, gated by a <Sequence from>:
import { AbsoluteFill, Sequence, OffthreadVideo, staticFile } from "remotion";
const fps = 30;
const broll = { start: 4.0, duration: 3.0 }; // seconds
<AbsoluteFill>
<OffthreadVideo src={staticFile("main.mp4")} /> {/* base layer */}
<Sequence from={Math.round(broll.start * fps)} durationInFrames={Math.round(broll.duration * fps)}>
<AbsoluteFill style={{ /* e.g. inset for picture-in-picture */ }}>
<OffthreadVideo src={staticFile("broll.mp4")} /> {/* overlay layer */}
</AbsoluteFill>
</Sequence>
</AbsoluteFill>Convert every timecode to frames with Math.round(seconds * fps), once, at the edge. Why: a b-roll cue at 4.0s is frame 120 at 30fps but frame 240 at 60fps — keep seconds in your data and multiply by fps from useVideoConfig() so changing fps never desyncs overlays. Use <OffthreadVideo> (not the DOM <video> or <Video>) for frame-accurate decoding during render.
# region test first: 1-2 seconds, validates the pipeline cheaply
npx remotion render MyVideo out/test.mp4 --frames=0-45
# then the full render
npx remotion render MyVideo out/video.mp4Omit the composition id to get an interactive picker. Configure via @remotion/cli/config in remotion.config.ts, or pass flags on the CLI (flags win):
// remotion.config.ts
import { Config } from "@remotion/cli/config";
Config.setConcurrency(8);
Config.setCodec("h264");| Codec | Use | Flag |
|---|---|---|
h264 | Default for web/YouTube; broad compatibility | (default) |
h265 | Smaller files, same quality; less universal playback | --codec=h265 |
prores | Edit-grade master, large files, re-import to an NLE | --codec=prores --prores-profile=4444 --pixel-format=yuva444p10le --image-format=png |
vp8 / gif | Web-alpha or looping previews | --codec=vp8 / --codec=gif |
Always render a 1–2s region (--frames=0-45) before the full render. Why: a full render of a minutes-long composition costs real time and CPU; a region test surfaces a broken caption layer or missing asset in seconds. For headless/CI renders, deterministic-output rules, and the codec/quality matrix in full, see references/render-and-pipeline.md.
| Bad | Why it breaks | Good |
|---|---|---|
| Hardcoding durations in seconds inside JSX | Remotion thinks in frames; seconds desync the moment fps changes | Store seconds in data, Math.round(seconds * fps) at the edge |
Date.now() / unseeded Math.random() in a composition | Frames render in parallel and on re-render → non-deterministic pixels | Drive everything off useCurrentFrame(); use random(seed) |
Changing fps after writing durations | Every frame-count downstream silently shifts | Pin fps + dimensions on <Composition> up front, leave them |
| Re-downloading the Whisper model every run | The ~1.5 GB medium.en download repeats and stalls the pipeline | Download once, cache the model path, reuse it |
| Committing the 1.5 GB Whisper model to git | Bloats the repo; the model is a build asset | .gitignore the model dir; fetch it in setup/CI |
| Rendering the full video to test a change | Minutes of wasted render to find a broken layer | --frames=0-45 region test, then full render |
| Writing the caption copy or hook here | That is the script, not the encode | Route to ../video-shorts/SKILL.md; you only burn it in |
Plain <video> / <Video> for b-roll in a render | Not frame-accurate; tears or skips on render | <OffthreadVideo> for frame-exact decode |
| Running silence removal inside the composition | Trimming dead air is an upstream asset edit | auto-editor on the source file before Remotion |
bash scripts/verify.sh <project-dir> — checks the Remotion project is well-formed and renders. With Node + ffmpeg present it runs npx remotion compositions to confirm a composition id exists, does a short region render to a temp MP4, and uses ffprobe to confirm a video stream with the expected dimensions/fps. With neither, it falls back to a static check: at least one composition .tsx exists and the render script references a real composition id and an output path. Read-only by default; exits 0 on an empty/clean target.references/captions-pipeline.md — full Whisper.cpp install + transcribe server, toCaptions, the token-highlight caption renderer component, and caption styling/safe-zone notes.references/render-and-pipeline.md — auto-editor + ffmpeg silence commands, the full render flag matrix, headless/CI render, the codec table, and ffprobe verification.© ericrisco, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 5 other files (scripts, references) in skills/remotion-video of ericrisco/rsc-harness.
Open the folder on GitHubat commit e3d5b33
Remotion Video next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Remotion Video this skillericrisco/rsc-harness | 174 | — | ~3.5k | Automated safety check: Pass | MIT | |
| Remotion Best Practiceslyonjs/shortvid.io | 147 | 33 repos | ~1k | Automated safety check: Pass | MIT | |
| Remotion to HyperFrames Porterheygen-com/hyperframes | 59k | 3 repos | ~2.8k | Automated safety check: Pass | Apache-2.0 | |
| Anything2explainerVincentwei1021/anything2explainer | 2.4k | — | ~2.7k | Automated safety check: Pass | Custom licence | |
| Remotion BitsMarve10s/Better-Fullstack | 754 | 1 repos | ~8.2k | Automated safety check: Pass | MIT | |
| Remotion Motion Graphicshaidrrrry/claude-remotion-skill | 299 | — | ~2k | Automated safety check: Pass | MIT |
lyonjs/shortvid.io
Best practices for Remotion - Video creation in React. An agent skill from lyonjs/shortvid.io.
heygen-com/hyperframes
Ports an existing Remotion (React) composition to HyperFrames HTML with GSAP, one way, and grades the result against a tiered set of reference fixtures.
Vincentwei1021/anything2explainer
给一个主题,产出一条黑底 MG 风格(幕底可选星点或点阵波)、有配音字幕章节进度条的科普讲解视频(中文或英文;Remotion 代码动画;时长由用户定,常用 3–5 分钟)。内含可编译模板、图元库、配音/分镜/渲染工具、风格与动效规范、多 agent 分工协议与 QC 判据,以及一条完整样片(《RAG 与知识库》)作为质量标尺。Turn any topic into a narrated…
Marve10s/Better-Fullstack
Animation components and utilities for Remotion video projects.
haidrrrry/claude-remotion-skill
Create and edit professional motion graphics videos with Remotion (React-based video).
Marve10s/Better-Fullstack
Create Remotion videos using the Geist design system aesthetic.
ericrisco/rsc-harness
A skill your agent uses when designing or analyzing a controlled experiment — falsifiable hypothesis, sample size from an MDE, reading significance/CI/power, CUPED, or rescuing tests that won't go…
ericrisco/rsc-harness
A skill your agent uses when making a web UI conform to WCAG 2.2 Level AA — axe-core or Lighthouse a11y violations, keyboard operability, focus management, ARIA roles/names/live regions, contrast…
ericrisco/rsc-harness
A skill your agent uses when running or fixing paid acquisition on Google or Meta — campaign structure (Performance Max, Demand Gen, Search, Advantage+), platform-fit creative, budget/scaling rules…
ericrisco/rsc-harness
A skill your agent uses when measuring whether an LLM or agent system actually got better and gating merges on it: golden sets, fixing an inflated LLM-as-judge, scoring RAG (faithfulness, contextual…
ericrisco/rsc-harness
A skill your agent uses when a creative goal must become a finished media file: pick and order generative-media models per modality — AI voiceover, image-to-video clips, score — then glue them with…
ericrisco/rsc-harness
A skill your agent uses when instrumenting product or web analytics — GA4/PostHog SDK wiring, event taxonomy, funnels, double-counted events, consent gating, PII scrubbing.
Categories
A skill your agent uses when you need to render an actual video file with Remotion — React compositions, the Composition/Sequence/TransitionSeries graph, transitions, burned-in word-by-word captions…. Remotion Video is an agent skill from ericrisco/rsc-harness. Use when you need to render an actual video file with Remotion — React compositions, the Composition/Sequence/TransitionSeries graph, transitions, burned-in word-by-word captions from a transcript, automatic silence removal, b-roll overlays, headless CI renders, and a final MP4 or MOV.
Remotion Video fits situations like: you need to render an actual video file with Remotion — React compositions; the Composition/Sequence/TransitionSeries graph; burned-in word-by-word captions from a transcript; automatic silence removal.
Run `npx skills add ericrisco/rsc-harness --skill remotion-video -a claude-code`. Or copy the skill folder (skills/remotion-video in ericrisco/rsc-harness) into .claude/skills/remotion-video in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ericrisco/rsc-harness --skill remotion-video -a codex`. Or copy the skill folder (skills/remotion-video in ericrisco/rsc-harness) into .agents/skills/remotion-video in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ericrisco/rsc-harness --skill remotion-video -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/remotion-video, .gemini/skills/remotion-video, .github/skills/remotion-video and .opencode/skills/remotion-video in your project.
Going by SKILL.md and its folder, Remotion Video needs a shell for the scripts in its folder and the command-line tools its instructions call (npx, npm, pip and bash). Our summary lists: Python 3; Node.js; A Bash shell.
SKILL.md contains no URLs. Its commands use npx, npm and pip, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Remotion Video is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.5k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 2.7k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Remotion Video: Remotion Best Practices (lyonjs/shortvid.io, 147 stars), Remotion to HyperFrames Porter (heygen-com/hyperframes, 59k stars), Anything2explainer (Vincentwei1021/anything2explainer, 2.4k stars) and Remotion Bits (Marve10s/Better-Fullstack, 754 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ericrisco (a GitHub user) maintains it in ericrisco/rsc-harness, which has 174 GitHub stars. The repository holds 233 skills in this directory. The repository was last updated on October 7, 2026.
Source: ericrisco/rsc-harness on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.