Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Render videos from React/Remotion component code via inference.sh. Pass TSX code, get MP4. Supports all Remotion APIs: useCurrentFrame, useVideoConfig, spring, interpolate, AbsoluteFill, Sequence. Configurable resolution, FPS, duration, codec. Use for: programmatic video generation, animated graphics, motion design, data-driven videos, React animations to video. Triggers: remotion, render video from code, tsx to video, react video, programmatic video, remotion render, code to video, animated vid
.claude/skills/aiskillstore-remotion-render/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 13 |
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 145% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -26% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 89% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 71% | 0% |
| case-14 | ✗→✓ | ▲ Improved | 126% | 0% |
Render videos from React/Remotion component code via inference.sh CLI.
> Requires inference.sh CLI (infsh). Get installation instructions: npx skills add inference-sh/skills@agent-tools
bashinfsh login # Render a simple animation infsh app run infsh/remotion-render --input '{ "code": "import { useCurrentFrame, AbsoluteFill } from \"remotion\"; export default function Main() { const frame = useCurrentFrame(); return <AbsoluteFill style={{backgroundColor: \"#000\", display: \"flex\", justifyContent: \"center\", alignItems: \"center\"}}><h1 style={{color: \"white\", fontSize: 100, opacity: frame / 30}}>Hello World</h1></AbsoluteFill>; }", "duration_seconds": 3, "fps": 30, "width": 1920, "height": 1080 }'
| Parameter | Type | Required | Description | |-----------|------|----------|-------------| | code | string | Yes | React component TSX code. Must export default a component. | | composition_id | string | No | Composition ID to render | | props | object | No | Props passed to the component | | width | number | No | Video width in pixels | | height | number | No | Video height in pixels | | fps | number | No | Frames per second | | duration_seconds | number | No | Video duration in seconds | | codec | string | No | Output codec |
Your TSX code can import from remotion and react:
tsx// Remotion APIs import { useCurrentFrame, useVideoConfig, spring, interpolate, AbsoluteFill, Sequence, Audio, Video, Img } from "remotion"; // React import React, { useState, useEffect } from "react";
bashinfsh app run infsh/remotion-render --input '{ "code": "import { useCurrentFrame, AbsoluteFill, interpolate } from \"remotion\"; export default function Main() { const frame = useCurrentFrame(); const opacity = interpolate(frame, [0, 30], [0, 1]); return <AbsoluteFill style={{backgroundColor: \"#1a1a2e\", display: \"flex\", justifyContent: \"center\", alignItems: \"center\"}}><h1 style={{color: \"#eee\", fontSize: 80, opacity}}>Welcome</h1></AbsoluteFill>; }", "duration_seconds": 2, "fps": 30, "width": 1920, "height": 1080 }'
bashinfsh app run infsh/remotion-render --input '{ "code": "import { useCurrentFrame, useVideoConfig, AbsoluteFill } from \"remotion\"; export default function Main() { const frame = useCurrentFrame(); const { fps, durationInFrames } = useVideoConfig(); const progress = Math.floor((frame / durationInFrames) * 100); return <AbsoluteFill style={{backgroundColor: \"#000\", display: \"flex\", justifyContent: \"center\", alignItems: \"center\", flexDirection: \"column\"}}><h1 style={{color: \"#fff\", fontSize: 200}}>{progress}%</h1><p style={{color: \"#666\", fontSize: 30}}>Loading...</p></AbsoluteFill>; }", "duration_seconds": 5, "fps": 60, "width": 1080, "height": 1080 }'
bashinfsh app run infsh/remotion-render --input '{ "code": "import { useCurrentFrame, useVideoConfig, spring, AbsoluteFill } from \"remotion\"; export default function Main() { const frame = useCurrentFrame(); const { fps } = useVideoConfig(); const scale = spring({ frame, fps, config: { damping: 10, stiffness: 100 } }); return <AbsoluteFill style={{backgroundColor: \"#6366f1\", display: \"flex\", justifyContent: \"center\", alignItems: \"center\"}}><div style={{width: 200, height: 200, backgroundColor: \"white\", borderRadius: 20, transform: `scale(${scale})`}} /></AbsoluteFill>; }", "duration_seconds": 2, "fps": 60, "width": 1080, "height": 1080 }'
bashinfsh app run infsh/remotion-render --input '{ "code": "import { AbsoluteFill } from \"remotion\"; export default function Main({ title, subtitle }) { return <AbsoluteFill style={{backgroundColor: \"#000\", display: \"flex\", justifyContent: \"center\", alignItems: \"center\", flexDirection: \"column\"}}><h1 style={{color: \"#fff\", fontSize: 80}}>{title}</h1><p style={{color: \"#888\", fontSize: 40}}>{subtitle}</p></AbsoluteFill>; }", "props": {"title": "My Video", "subtitle": "Created with Remotion"}, "duration_seconds": 3, "fps": 30, "width": 1920, "height": 1080 }'
bashinfsh app run infsh/remotion-render --input '{ "code": "import { useCurrentFrame, AbsoluteFill, Sequence, interpolate } from \"remotion\"; function FadeIn({ children }) { const frame = useCurrentFrame(); const opacity = interpolate(frame, [0, 20], [0, 1]); return <div style={{ opacity }}>{children}</div>; } export default function Main() { return <AbsoluteFill style={{backgroundColor: \"#000\", display: \"flex\", justifyContent: \"center\", alignItems: \"center\", flexDirection: \"column\", gap: 20}}><Sequence from={0}><FadeIn><h1 style={{color: \"#fff\", fontSize: 60}}>First</h1></FadeIn></Sequence><Sequence from={30}><FadeIn><h1 style={{color: \"#fff\", fontSize: 60}}>Second</h1></FadeIn></Sequence><Sequence from={60}><FadeIn><h1 style={{color: \"#fff\", fontSize: 60}}>Third</h1></FadeIn></Sequence></AbsoluteFill>; }", "duration_seconds": 4, "fps": 30, "width": 1920, "height": 1080 }'
pythonfrom inferencesh import inference client = inference() result = client.run({ "app": "infsh/remotion-render", "input": { "code": """ import { useCurrentFrame, AbsoluteFill, interpolate } from "remotion"; export default function Main() { const frame = useCurrentFrame(); const opacity = interpolate(frame, [0, 30], [0, 1]); return ( <AbsoluteFill style={{ backgroundColor: "#1a1a2e", display: "flex", justifyContent: "center", alignItems: "center" }}> <h1 style={{ color: "#eee", fontSize: 80, opacity }}> Hello from Python </h1> </AbsoluteFill> ); } """, "duration_seconds": 3, "fps": 30, "width": 1920, "height": 1080 } }) print(result["output"]["video"])
pythonfor update in client.run({ "app": "infsh/remotion-render", "input": { "code": "...", "duration_seconds": 10 } }, stream=True): if update.get("progress"): print(f"Rendering: {update['progress']}%") if update.get("output"): print(f"Video: {update['output']['video']}")
bash# Remotion best practices (component patterns) npx skills add remotion-dev/skills@remotion-best-practices # AI video generation (for AI-generated clips) npx skills add inference-sh/skills@ai-video-generation # Image generation (for video assets) npx skills add inference-sh/skills@ai-image-generation # Python SDK reference npx skills add inference-sh/skills@python-sdk # Full platform skill npx skills add inference-sh/skills@agent-tools
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-20 | pass→pass | 7,652 | 6,790 | -11% | 1 | 1 | 0% | 1,315 | 3,459 | +163% | 0 | 0 | — |
case-01 | fail→pass | 7,930 | 6,935 | -13% | 1 | 1 | 0% | 1,557 | 3,816 | +145% | 0 | 0 | — |
case-02 | fail→pass | 27,016 | 7,041 | -74% | 1 | 1 | 0% | 5,007 | 3,704 | -26% | 0 | 0 | — |
case-03 | fail→pass | 10,537 | 7,338 | -30% | 1 | 1 | 0% | 2,038 | 3,861 | +89% | 0 | 0 | — |
case-04 | fail→pass | 13,457 | 9,600 | -29% | 1 | 1 | 0% | 2,476 | 4,239 | +71% | 0 | 0 | — |
case-05 | pass→pass | 13,183 | 10,789 | -18% | 1 | 1 | 0% | 2,495 | 4,416 | +77% | 0 | 0 | — |
case-14 | fail→pass | 7,677 | 3,012 | -61% | 1 | 1 | 0% | 1,178 | 2,665 | +126% | 0 | 0 | — |
case-06 | fail→pass | 11,637 | 2,841 | -76% | 1 | 1 | 0% | 1,944 | 2,691 | +38% | 0 | 0 | — |
case-07 | fail→pass | 14,727 | 7,485 | -49% | 1 | 1 | 0% | 2,480 | 3,586 | +45% | 0 | 0 | — |
case-08 | fail→pass | 6,547 | 3,782 | -42% | 1 | 1 | 0% | 1,093 | 2,991 | +174% | 0 | 0 | — |
case-09 | pass→pass | 5,646 | 3,344 | -41% | 1 | 1 | 0% | 962 | 2,821 | +193% | 0 | 0 | — |
case-10 | pass→pass | 11,781 | 9,566 | -19% | 1 | 1 | 0% | 2,082 | 4,106 | +97% | 0 | 0 | — |
case-11 | pass→pass | 3,263 | 3,116 | -5% | 1 | 1 | 0% | 433 | 2,712 | +526% | 0 | 0 | — |
case-12 | pass→pass | 8,383 | 6,396 | -24% | 1 | 1 | 0% | 1,517 | 3,479 | +129% | 0 | 0 | — |
case-13 | pass→pass | 12,150 | 4,676 | -62% | 1 | 1 | 0% | 2,073 | 3,068 | +48% | 0 | 0 | — |
case-15 | pass→pass | 9,671 | 2,230 | -77% | 1 | 1 | 0% | 1,575 | 2,635 | +67% | 0 | 0 | — |
case-16 | fail→pass | 8,011 | 2,187 | -73% | 1 | 1 | 0% | 1,356 | 2,571 | +90% | 0 | 0 | — |
case-17 | pass→pass | 5,330 | 3,610 | -32% | 1 | 1 | 0% | 975 | 2,891 | +197% | 0 | 0 | — |
case-18 | fail→pass | 11,339 | 1,536 | -86% | 1 | 1 | 0% | 1,831 | 2,446 | +34% | 0 | 0 | — |
case-19 | fail→fail | 26,913 | 2,109 | -92% | 1 | 1 | 0% | 4,566 | 2,486 | -46% | 0 | 0 | — |
case-21 | pass→pass | 6,973 | 4,389 | -37% | 1 | 1 | 0% | 1,167 | 2,964 | +154% | 0 | 0 | — |
case-22 | pass→pass | 12,855 | 11,969 | -7% | 1 | 1 | 0% | 2,037 | 4,138 | +103% | 0 | 0 | — |
case-23 | fail→pass | 9,452 | 2,132 | -77% | 1 | 1 | 0% | 1,845 | 2,573 | +39% | 0 | 0 | — |
case-24 | pass→pass | 6,689 | 5,597 | -16% | 1 | 1 | 0% | 1,335 | 3,369 | +152% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted. The headline lift of +46 percentage points is the difference between those two pass rates over the 24 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/21/2026 | +73% |
Other measured skills in the registry, with their headline benchmark lift.