mcpField
R
remotion-to-framevideo

remotion-to-framevideo

github.com/chanjing-aiCreative & media052 installsUpdated 14w ago
Repository

About remotion-to-framevideo

Remotion to FrameVideo is a skill for translating Remotion video compositions into FrameVideo HTML and GSAP compositions. It is intended for explicit migration requests and combines API mapping, lint checks, and render comparisons to identify unsupported patterns and translation gaps.

Key features

  1. 01Map Remotion APIs to FrameVideo equivalents
  2. 02Lint source for unsupported or lossy patterns
  3. 03Generate HTML and GSAP timeline compositions
  4. 04Compare renders using an SSIM evaluation harness
  5. 05Document translation gaps

Use cases

  1. 01Migrate a Remotion composition to FrameVideo
  2. 02Check source code for migration blockers
  3. 03Verify translated video output against a baseline

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/chanjing-ai/framevideo --skill remotion-to-framevideo

After installing, type/remotion-to-framevideoin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

assets/
.gitkeep
assets/test-corpus/
.gitignore
run.sh
assets/test-corpus/tier-1-title-card/
.gitignore
expected.json
README.md
assets/test-corpus/tier-1-title-card/fv-src/
index.html
assets/test-corpus/tier-1-title-card/remotion-src/
package.json
remotion.config.ts
tsconfig.json
assets/test-corpus/tier-1-title-card/remotion-src/src/
index.ts
Root.tsx
TitleCard.tsx
assets/test-corpus/tier-2-multi-scene/
.gitignore
expected.json
README.md
setup.sh
assets/test-corpus/tier-2-multi-scene/fv-src/
index.html
assets/test-corpus/tier-2-multi-scene/remotion-src/
package.json
remotion.config.ts
tsconfig.json
assets/test-corpus/tier-2-multi-scene/remotion-src/src/
index.ts
MultiScene.tsx
Root.tsx
assets/test-corpus/tier-3-data-driven/
.gitignore
expected.json
README.md
assets/test-corpus/tier-3-data-driven/fv-src/
index.html
assets/test-corpus/tier-3-data-driven/remotion-src/
package.json
remotion.config.ts

Details

From the project README

Remotion to FrameVideo

Overview

Translate Remotion (React-based) video compositions into FrameVideo (HTML + GSAP) compositions. Most Remotion idioms have direct FrameVideo equivalents — the translation is mechanical for ~80% of typical compositions. This skill encodes the mapping and guards against the lossy 20% by refusing to translate patterns that don't fit HF's seek-driven model and recommending the runtime interop pattern from PR #214 instead.

The skill ships with a tiered test corpus (T1–T4, 4 fixtures total) that grades translations against measured SSIM thresholds. Don't translate without running the eval — a translation that "looks right" but renders 0.05 SSIM lower than the validated baseline is silently wrong.

When to use

Use this skill ONLY when the user explicitly asks to migrate from Remotion. Example trigger phrases:

  • "port my Remotion project to FrameVideo"
  • "convert this Remotion code to FrameVideo"
  • "migrate from Remotion"
  • "translate this Remotion comp"
  • "rewrite this as FrameVideo HTML"

Do NOT use this skill when:

  • (a) The user is authoring a new FrameVideo composition, even if they have or are A/B-testing a similar Remotion video.
  • (b) The user mentions Remotion in passing without asking for migration.
  • (c) The user shares Remotion code as reference material rather than asking for a translation.
  • (d) The user asks for "the same video as my Remotion one" without explicitly asking to migrate the source — treat that as a fresh FrameVideo build.

When in doubt, default to authoring a native FrameVideo composition with the framevideo skill instead.

Workflow

Step 1: Lint the source

Run scripts/lint_source.py over the Remotion source directory. The lint detects patterns that can't translate cleanly:

  • Blockers (refuse + recommend interop): useState, useReducer, useEffect/useLayoutEffect with non-empty deps, async calculateMetadata, third-party React UI libraries (MUI, Chakra, Mantine, antd, shadcn, Radix, NextUI).
  • Warnings (translate after dropping the construct): @remotion/lambda config, delayRender, useCallback, useMemo, custom hooks.
  • Info (translate with note): staticFile, interpolateColors.

If any blocker fires, stop. Read references/escape-hatch.md and surface the recommendation message. Warnings don't stop translation — drop the offending construct in step 3 and note the gap in TRANSLATION_NOTES.md. @remotion/lambda config is the canonical warning case: the skill drops the import + renderMediaOnLambda(...) calls but translates the rest of the composition.

Step 2: Plan the translation

Read references/api-map.md — the index of every Remotion API and its HF equivalent or per-topic reference. Identify which topic references you'll need based on what the source uses:

Source containsLoad reference
Composition, defaultProps, schema, calculateMetadataparameters.md
Sequence, Series, Loop, AbsoluteFill, Freezesequencing.md
useCurrentFrame, interpolate, spring, Easing, interpolateColorstiming.md
Audio, Video, Img, IFrame, staticFile, delayRendermedia.md
TransitionSeries, @remotion/transitionstransitions.md
@remotion/lottielottie.md
@remotion/google-fonts/<Family>, Font.loadFont, @font-facefonts.md

Don't load all of them — load only what the specific source needs.

Step 3: Generate the HF composition

Emit index.html with:

  • Root <div id="stage"> carrying the composition's data-composition-id, data-start="0", data-duration (in seconds), data-fps, data-width, data-height, plus one data-* per scalar prop.
  • A flat list of scene divs with data-start / data-duration / data-track-index.
  • Inline <style> for layout; CSS sets the from state of every animated property.
  • A single <script> tag at the bottom containing one paused gsap.timeline({paused: true}). Every Remotion useCurrentFrame() derivation becomes a tween on this timeline at the right offset.
  • window.__timelines["<composition-id>"] = tl; registers the timeline with HF's runtime.

Custom React subcomponents inline as repeated HTML using the prop interface as the template (see parameters.md for the per-instance data-* pattern).

Step 4: Validate

Run the eval harness — references/eval.md for the full guide. Quick path:

# Render Remotion baseline (after npm install in the fixture)
cd remotion-src && npx remotion render <CompositionId> out/baseline.mp4

# Render HF translation
cd ../fv-src && npx framevideo render --output ../fv.mp4

# SSIM diff
../../scripts/render_diff.sh ./remotion-src/out/baseline.mp4 ./fv.mp4 ./diff

Threshold: ~0.02 below p05 of the source's complexity tier (see eval.md's validated thresholds table). If the diff fails, run scripts/frame_strip.sh to see which frames diverged, then re-read the relevant timing/sequencing/media reference.

Critical: both renders must use matching pixel format. Set Config.setVideoImageFormat("png") + Config.setColorSpace("bt709") in the Remotion source's remotion.config.ts — otherwise the diff measures encoder differences (~0.05 SSIM hit), not translation fidelity.

Step 5: Document gaps

Anything that didn't translate cleanly (volume ramps dropped, custom presentations approximated, fonts substituted) gets a TRANSLATION_NOTES.md written next to the HF output. See references/limitations.md for the format.

What this skill explicitly does NOT do

  • Translate React state machines. Compositions that drive animation via useState + useEffect are not deterministic frame-capture targets in FrameVideo' seek-driven model. Recommend the runtime interop pattern.
  • Run Remotion's render pipeline alongside FrameVideo. That's the runtime interop pattern from PR #214 — a separate solution for compositions that fail this skill's lint.

(@remotion/lambda is not a blocker — Lambda config is deployment, not animation. The skill drops it as a warning and translates the rest. See references/escape-hatch.md.)

How to grade your own translation

Run the test corpus orchestrator:

./assets/test-corpus/run.sh

It runs T1, T2, T3 (render + diff) and T4 (lint validation), prints a per-tier pass/fail table, and emits an aggregate JSON report. Use this to verify the skill is working end-to-end on a clean checkout — and as a regression check after editing any reference.

Validated baseline (as of 2026-04-27):

TierComposition shapeMean SSIMThreshold
T1single-element fade-in0.9740.95
T2multi-scene + spring + audio + image0.9850.95
T3data-driven, custom subcomponents, count-up0.9530.90
T4escape-hatch (8 lint cases)8/8 passn/a

Comments

Markdown supported