agentsclimarketplace

Remotion media

Skill phamthanhnghia/remotion-agent-skills/skills/remotion-media

Programmatic video creation agent skills suite for Remotion, modeled on HyperFrames architecture. Build explainers, product launches, motion graphics, captions, and data viz with AI.

Install
npx -y skills add phamthanhnghia/remotion-agent-skills --skill remotion-media

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

3 things to look at

  • 15 days oldThe repository was created 15 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Agent Media OS for Remotion projects. Resolve BGM, SFX, images, fonts, brand logos, TTS voiceover, and color grades into frozen local files or paste-ready blocks.

SKILL.md

5.1 KB, ~1.3k tokens by cl100k_base, as published. Nobody here has run it

remotion-media

The media OS for Remotion: resolve · place · verify — every media type, one skill.

The placement contract

All static assets live in the public/ directory. Reference them exclusively via staticFile():

import {staticFile} from 'remotion';

// Images
<Img src={staticFile('hero.jpg')} />

// Audio
<Audio src={staticFile('background.mp3')} volume={0.4} />

// Video
<OffthreadVideo src={staticFile('footage.mp4')} />

Never use relative paths, absolute disk paths, or CDN URLs that require network access at render time (they will fail in offline renders or Lambda).

Asset types and their tools

TypeTool / PackageUsage
Background musicResolved local file<Audio src={staticFile('bgm.mp3')} volume={0.3} />
SFXResolved local file<Audio src={staticFile('click.mp3')} startFrom={30} />
Images / backgroundsLocal file or staticFile()<Img src={staticFile('bg.jpg')} />
Google Fonts@remotion/google-fontsloadFont() returns {fontFamily}
Brand logo (SVG)Local SVG in public/<Img src={staticFile('logo.svg')} />
Voiceover / TTSLocal mp3 file<Audio src={staticFile('narration.mp3')} />
Video footageLocal mp4 file<OffthreadVideo src={staticFile('clip.mp4')} />
Captions / subtitles@remotion/captionsWord-timed <Captions> component

Fonts

Always use @remotion/google-fonts for Google Fonts — never a <link> tag:

npm install @remotion/google-fonts
import {loadFont} from '@remotion/google-fonts/Inter';

const {fontFamily} = loadFont();

const Text = () => (
  <div style={{fontFamily, fontWeight: 700}}>Hello</div>
);

For custom fonts, place the font file in public/fonts/ and load via FontFace inside calculateMetadata or a delayRender/continueRender pair.

delayRender — async asset loading

Use delayRender / continueRender from remotion when assets must be fetched or generated before the first frame renders:

import {delayRender, continueRender} from 'remotion';

const handle = delayRender('Loading font');

fetch('/api/data')
  .then(r => r.json())
  .then(data => {
    setData(data);
    continueRender(handle);
  });

Do not use delayRender inside the render function — call it at module scope or in a useEffect that fires once.

Audio / Video timing

PropEffect
startFromSkip the first N frames of the asset
endAtStop playback at frame N of the asset
volume0–1 scalar or a function of frame
playbackRateSpeed multiplier
loopLoop audio (deterministic: repeats based on composition duration)

OffthreadVideo vs Video

<OffthreadVideo><Video>
Render accuracyFrame-perfect (recommended)May drop frames
Seek behaviorRendered off main threadPlays back in-browser
Use caseFinal compositionPreview only

Always use <OffthreadVideo> for renders. <Video> is acceptable in Studio preview only.

Captions

Use @remotion/captions for word-timed captions:

npm install @remotion/captions
import {Captions} from '@remotion/captions';

<Captions
  subtitles={wordTimedSubtitles}
  startFrom={0}
  windowStart={currentWordStart}
  windowEnd={currentWordEnd}
  style={{fontSize: 48, color: 'white'}}
/>

Transcription workflow → references/captions.md.

Audio-reactive prep

Pre-analyze audio outside the render pipeline using @remotion/media-utils:

import {getAudioData, visualizeAudio} from '@remotion/media-utils';

// In calculateMetadata (runs once before render):
const audioData = await getAudioData(staticFile('music.mp3'));

Full audio-reactive authoring → remotion-creative/references/audio-reactive.md.

Be proactive — run a media opportunity pass

When you build or review a composition, do one grounded scan and then ask once:

Signal detectedOffer
On-screen text with no voiceoverTTS voiceover option
Emoji or placeholder icon divResolve real SVG icon
Placeholder image or solid-color backgroundSuggest a real image from public/
Hard cuts with no soundSuggest transition SFX
Piece over ~10 s with no music bedSuggest BGM track

Rules: grounded, not generic (no signal → no suggestion); propose the specific fix; once per project (one consolidated ask).

Where to look

TaskRead
staticFile, public/ directory, asset pathsreferences/static-files.md
delayRender for async loadingreferences/async-assets.md
Font loading (@remotion/google-fonts, custom)references/fonts.md
OffthreadVideo, Audio trim, volume curvesreferences/media-elements.md
Captions, transcription, @remotion/captionsreferences/captions.md
Audio-reactive motion, getAudioDatareferences/audio-reactive.md

What ships with it: 2 files

4.4 KB alongside SKILL.md

references/

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.