remotion-to-hyperframes
Port an existing Remotion (React) composition's source to HyperFrames HTML. Use ONLY on an explicit ask to port/convert/migrate/translate a Remotion source — one-way, Remotion-only. A passing Remotion mention, reference-only code, or "make something like my Remotion video" is a fresh build (/general
By heygen-com · 274,198 installs
npx skills add heygen-com/hyperframes --skill remotion-to-hyperframes
Source repository · Upstream listing
First, keep this skill fresh — confirm with the user before running: npx hyperframes skills update remotion to hyperframes . A fast no op when everything is current; otherwise it refreshes this skill plus the core domain skills it depends on before you rely on them.
Remotion to HyperFrames
The front door is /hyperframes . Use this only to port an existing Remotion (React) composition's source into HyperFrames, one way. Authoring a new composition, re creating from a non Remotion source (After Effects, Framer Motion, plain React / CSS — there is no Remotion source to translate), a passing Remotion mention, or any uncertainty → read /hyperframes first: the intent layer owns every route decision.
Overview
Translate Remotion (React based) video compositions into HyperFrames (HTML + GSAP) compositions. Most Remotion idioms have direct HyperFrames 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](https://github.com/heygen com/hyperframes/pull/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 HyperFrames"
"convert this Remotion code to HyperFrames"
"migrate from Remotion"
"translate this Remotion comp"
"rewrite this as HyperFrames HTML"
Do NOT use this skill when:
(a) The user is authoring a new HyperFrames 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 HyperFrames build.
NOT SUPPORTED (decline — this is not what this skill does):
The reverse direction. Exporting a HyperFrames composition back out to Remotion (or to any other framework) is not a workflow — the translation is Remotion → HyperFrames only. Say so plainly.
Non Remotion sources. An After Effects project ( .aep ), a Framer Motion / plain React / CSS animation, or any other tool's source is not a Remotion composition — there is no Remotion source to translate. Re create it natively via /general video , or decline if HyperFrames can't represent it.
When in doubt, default to authoring a native HyperFrames composition with /general video (the general HyperFrames authoring flow) instead.
Workflow
Step 1: Lint the source
Run [ scripts/lint source.py ](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 ](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 ](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 contains Load reference
Composition , defaultProps , schema , calculateMetadata [ parameters.md ](references/parameters.md)
Sequence , Series , Loop , AbsoluteFill , Freeze [ sequencing.md ](references/sequencing.md)
useCurrentFrame , interpolate , spring , Easing , interpolateColors [ timing.md ](references/timing.md)
Audio , Video , Img , IFrame , staticFile , delayRender [ media.md ](references/media.md)
TransitionSeries , @remotion/transitions [ transitions.md ](references/transitions.md)
@remotion/lottie [ lottie.md ](references/lottie.md)
@remotion/google fonts/<Family , Font.loadFont , @font face [ fonts.md ](references/fonts.md)
Don't load all of them — load only what the specific source needs.
Search the live catalog for any visual effect the table does not map. When the source paints a look with no HF API equivalent — a scanline/CRT overlay, a glitch or chromatic aberration pass, a shader wipe, a film grain treatment — run npx hyperframes catalog query "<the effect, in plain English " json before hand writing it in GSAP. The search needs nothing installed : no project, no prior add , no account. It ranks the whole hosted registry (~400 blocks and components) from any directory, and transitions.md already takes this route for clockWipe() / iris() via npx hyperframes add sdf iris . A real component is closer to the source than a hand approximation, so it usually raises the SSIM rather than lowering it — but the render diff in Step 4 is still the arbiter. Hand write the effect when a search returns nothing that fits, and record the substitution in TRANSLATION NOTES.md either way.
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 ](references/parameters.md) for the per instance data pattern).
Step 4: Validate
Run the eval harness — [ references/eval.md ](references/eval.md) for the full guide. Quick path:
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 ](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 ](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 HyperFrames' seek driven model. Recommend the runtime interop pattern.
Run Remotion's render pipeline alongside HyperFrames. That's the runtime interop pattern from [PR 214](https://github.com/heygen com/hyperframes/pull/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 ](references/escape hatch.md).)
How to grade your own translation
Run the test corpus orchestrator:
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):
Tier Composition shape Mean SSIM Threshold
T1 single element fade in 0.974 0.95
T2 multi scene + spring + audio + image 0.985 0.95
T3 data driven, custom subcomponents, count up 0.953 0.90
T4 escape hatch (8 lint cases) 8/8 pass n/a