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.
npx -y skills add phamthanhnghia/remotion-agent-skills --skill remotion-mediaAssembled 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
| Type | Tool / Package | Usage |
|---|---|---|
| Background music | Resolved local file | <Audio src={staticFile('bgm.mp3')} volume={0.3} /> |
| SFX | Resolved local file | <Audio src={staticFile('click.mp3')} startFrom={30} /> |
| Images / backgrounds | Local file or staticFile() | <Img src={staticFile('bg.jpg')} /> |
| Google Fonts | @remotion/google-fonts | loadFont() returns {fontFamily} |
| Brand logo (SVG) | Local SVG in public/ | <Img src={staticFile('logo.svg')} /> |
| Voiceover / TTS | Local mp3 file | <Audio src={staticFile('narration.mp3')} /> |
| Video footage | Local mp4 file | <OffthreadVideo src={staticFile('clip.mp4')} /> |
| Captions / subtitles | @remotion/captions | Word-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
| Prop | Effect |
|---|---|
startFrom | Skip the first N frames of the asset |
endAt | Stop playback at frame N of the asset |
volume | 0–1 scalar or a function of frame |
playbackRate | Speed multiplier |
loop | Loop audio (deterministic: repeats based on composition duration) |
OffthreadVideo vs Video
<OffthreadVideo> | <Video> | |
|---|---|---|
| Render accuracy | Frame-perfect (recommended) | May drop frames |
| Seek behavior | Rendered off main thread | Plays back in-browser |
| Use case | Final composition | Preview 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 detected | Offer |
|---|---|
| On-screen text with no voiceover | TTS voiceover option |
| Emoji or placeholder icon div | Resolve real SVG icon |
| Placeholder image or solid-color background | Suggest a real image from public/ |
| Hard cuts with no sound | Suggest transition SFX |
| Piece over ~10 s with no music bed | Suggest BGM track |
Rules: grounded, not generic (no signal → no suggestion); propose the specific fix; once per project (one consolidated ask).
Where to look
| Task | Read |
|---|---|
| staticFile, public/ directory, asset paths | references/static-files.md |
| delayRender for async loading | references/async-assets.md |
| Font loading (@remotion/google-fonts, custom) | references/fonts.md |
| OffthreadVideo, Audio trim, volume curves | references/media-elements.md |
| Captions, transcription, @remotion/captions | references/captions.md |
| Audio-reactive motion, getAudioData | references/audio-reactive.md |
What ships with it: 2 files
4.4 KB alongside SKILL.md
references/
- captions.md1.9 KB
- media-elements.md2.5 KB