Remotion Video logo

Remotion Video

Community
melgarafael
remotion-video

Remotion video composition knowledge — 6 template specs, storyboard-to-composition mapping, frame calculations, animation catalog, transition types, platform rules, retention triggers, and anti-patterns for video production

Overview

Publishermelgarafael
RepositorygrowthOS
Skill nameremotion-video
Stars
58
Forks
33
Bundled files
Instructions only
LicenseMIT
Links
  • Markdown instructions

    A SKILL.md file the model loads on demand, so it only costs tokens when a request actually matches.

  • Works with any LLM

    AI skills are plain Markdown, not provider-specific code, so this works with GPT, Claude, Gemini, Grok, or a local model.

  • Self-contained

    Everything the model needs lives in the instructions — no extra files to sync.

  • Open source

    Published by melgarafael on GitHub. Read the source before you install it.

Installation

Install the Remotion Video AI skill in TypingMind to use it with any LLM, or drop it into another agent that reads SKILL.md.

1

Install in TypingMind

TypingMind installs a skill straight from its GitHub folder — it reads SKILL.md, bundles the resource files, and stores the result locally.

  1. Open the app and go to Plugins → Skills.
  2. Choose "Install from GitHub".
  3. Paste the skill folder URL below and confirm.
    https://github.com/melgarafael/growthOS/tree/main/skills/remotion-video
  4. Enable the skill in any chat where you want it available.
Plugins → Skills → Add skill → From GitHub URL, then paste the folder URL and press Continue.
2

Install in another agent

Any agent that reads the Agent Skills format can use this skill — copy the folder into that agent's skills directory.

Claude Code — .claude/skills
git clone --depth 1 https://github.com/melgarafael/growthOS.git /tmp/growthOS
mkdir -p .claude/skills
cp -r /tmp/growthOS/skills/remotion-video .claude/skills/remotion-video
Restart Claude Code after copying so it picks up the new skill.

Use it in TypingMind

Enable Remotion Video in any TypingMind chat and the model takes it from there. Its name and description sit in the system prompt, and the moment a request matches, the model loads the full instructions itself — you never invoke it by hand, and it costs no tokens until it is actually used.

The model loads Remotion Video on its own as soon as a request matches it.

Works with any AI model

AI skills are plain Markdown instructions rather than provider-specific code, so Remotion Video is not tied to the model it was written for. Install it once in TypingMind and use it with GPT-5, Claude, Gemini, Grok, DeepSeek, Mistral, Llama, or a local model you run yourself — all on your own API keys.

  • Loaded only when it is needed

    The system prompt carries just the name and description. The instructions are fetched on the first matching request, so an idle skill costs nothing.

  • Switch models mid-chat

    Because the skill is instructions rather than code, changing model does not break it — the next model reads the same SKILL.md.

Skill instructions

This is the SKILL.md content the model loads. Read it before installing — a skill is instructions your model will follow.

Remotion Video Skill

Specialized knowledge base for mapping creative video concepts to Remotion compositions. Covers template selection, storyboard-to-composition translation, timing and pacing rules, animation and transition catalogs, platform-specific constraints, brand integration, retention psychology, and anti-patterns. This skill is consumed by the video-producer agent and integrates with the copywriting, video-production, and platform-mastery skills.


Trigger Conditions

Use this skill when the user asks to:

  • Create a video, reel, short, or explainer
  • Produce an animated carousel from existing slide content
  • Map a storyboard to a Remotion composition
  • Select the right video template for a given topic
  • Calculate frame timing for video scenes
  • Choose animations or transitions for video content
  • Optimize video pacing for retention
  • Convert carousel slides into animated video format
  • Render a video using Remotion
  • Review or improve an existing video storyboard

Template Registry

Six composition templates are available, each with specific constraints and scene flow patterns.

1. ReelTips

PropertyValue
Aspect Ratio9:16 (1080x1920)
FPS30
Duration Range15-60 seconds (450-1800 frames)
Scene Flowhook(3s) > points(5s each) > CTA(4s)
BackgroundDark gradient with accent color from brand
Default Animationsfade-in + scale-in for hook, alternating slide-left/right for points, bounce for CTA
Best ForQuick tips, lists, how-tos, hacks

Props Schema:

typescript
{
  template: "ReelTips",
  fps: 30,
  width: 1080,
  height: 1920,
  brand: BrandProps,
  scenes: SceneProps[],  // types: hook, point, cta
  showProgressBar: boolean,
  showWatermark: boolean
}

2. ReelBeforeAfter

PropertyValue
Aspect Ratio9:16 (1080x1920)
FPS30
Duration Range15-30 seconds (450-900 frames)
Scene Flowhook(3s) > comparisons(6s each) > reveal(4s) > CTA(3s)
BackgroundSplit dark/light for before/after contrast
Default Animationswipe transitions for comparisons, slide for reveal
Best ForTransformations, comparisons, results, upgrades

Props Schema:

typescript
{
  template: "ReelBeforeAfter",
  fps: 30,
  width: 1080,
  height: 1920,
  brand: BrandProps,
  scenes: SceneProps[],  // types: hook, comparison, point, cta
  showProgressBar: boolean,
  showWatermark: boolean
}

3. ReelNumbers

PropertyValue
Aspect Ratio9:16 (1080x1920)
FPS30
Duration Range15-30 seconds (450-900 frames)
Scene Flowhook(3s) > number+context(5s each) > insight(5s) > CTA(3s)
BackgroundSolid dark with accent-colored number highlights
Default Animationscounter-up for numbers, fade for context text
Best ForStatistics, data points, metrics, growth numbers

Props Schema:

typescript
{
  template: "ReelNumbers",
  fps: 30,
  width: 1080,
  height: 1920,
  brand: BrandProps,
  scenes: SceneProps[],  // types: hook, number, point, cta
  showProgressBar: boolean,
  showWatermark: boolean
}

4. ExplainerSteps

PropertyValue
Aspect Ratio16:9 (1920x1080)
FPS30
Duration Range60-180 seconds (1800-5400 frames)
Scene Flowintro(5s) > steps(15s each) > summary grid(10s) > CTA(5s)
BackgroundClean light or branded gradient
Default Animationsslide-up for steps, scale-in for summary
Best ForTutorials, how-to guides, processes, setup guides

Props Schema:

typescript
{
  template: "ExplainerSteps",
  fps: 30,
  width: 1920,
  height: 1080,
  brand: BrandProps,
  scenes: SceneProps[],  // types: hook, step, point, cta
  showProgressBar: boolean,
  showWatermark: boolean
}

5. ExplainerDemo

PropertyValue
Aspect Ratio16:9 (1920x1080)
FPS30
Duration Range30-120 seconds (900-3600 frames)
Scene Flowproblem(5s) > solution intro(5s) > features(15s each) > social proof(10s) > CTA(5s)
BackgroundBranded gradient or solid
Default Animationsfade transitions, scale for features
Best ForProduct demos, feature showcases, SaaS walkthroughs

Props Schema:

typescript
{
  template: "ExplainerDemo",
  fps: 30,
  width: 1920,
  height: 1080,
  brand: BrandProps,
  scenes: SceneProps[],  // types: hook, point, demo, cta
  showProgressBar: boolean,
  showWatermark: boolean
}

6. CarouselAnimated

PropertyValue
Aspect Ratio4:5 (1080x1350)
FPS30
Duration Range15-60 seconds (450-1800 frames)
Scene Flowcover(4s) > content slides(4s each) > CTA(4s)
BackgroundInherits from carousel design spec or brand palette
Default Animationsslide-left transitions between slides
Best ForAnimated versions of existing carousel content

Props Schema:

typescript
{
  template: "CarouselAnimated",
  fps: 30,
  width: 1080,
  height: 1350,
  brand: BrandProps,
  scenes: SceneProps[],  // types: hook, point, cta
  showProgressBar: boolean,
  showWatermark: boolean
}

Storyboard-to-Composition Mapping

Mapping Rules

The storyboard YAML produced by the video-producer agent must be translated into a Remotion composition JSON. Follow these rules exactly.

Scene Type Mapping
Storyboard Scene TypeRemotion SceneProps.typeTypical AnimationNotes
hook"hook"fade-in, scale-inAlways first scene. Must fire immediately.
point"point"slide-left, slide-rightContent scenes. Alternate directions for pattern interrupt.
comparison"comparison"wipe, slide-leftBefore/after pairs. Use wipe for dramatic reveal.
number"number"counter-upNumbers animate from 0 to target value.
step"step"slide-up, fade-inTutorial steps. Numbered prominently.
demo"demo"scale-in, fade-inProduct feature highlights.
cta"cta"bounce, scale-inAlways last scene. Brand handle visible.
Frame Calculation
For each scene in storyboard.scenes:
  scene.durationFrames = scene.duration * storyboard.fps
  scene.startFrame = sum of all previous scenes' durationFrames

Total composition frames:
  totalFrames = sum of all scene durationFrames

Example calculation (30fps):

Scene 1 (hook, 3s):     startFrame=0,    durationFrames=90
Scene 2 (point, 5s):    startFrame=90,   durationFrames=150
Scene 3 (point, 5s):    startFrame=240,  durationFrames=150
Scene 4 (point, 5s):    startFrame=390,  durationFrames=150
Scene 5 (cta, 4s):      startFrame=540,  durationFrames=120
Total:                   totalFrames=660  (22 seconds)
Brand Injection

Map brand-voice.yaml colors to Remotion BrandProps:

yaml
# Input: brand-voice.yaml
visual_identity:
  colors:
    primary: "#6c5ce7"
    secondary: "#00cec9"
    background: "#0a0a0a"
    text: "#ffffff"
    accent: "#fd79a8"
  handle: "@myhandle"
  name: "My Brand"

# Output: BrandProps
brand:
  name: "My Brand"
  handle: "@myhandle"
  colors:
    primary: "#6c5ce7"
    secondary: "#00cec9"
    background: "#0a0a0a"
    text: "#ffffff"
    accent: "#fd79a8"
  watermark_position: "bottom-right"
Composition Assembly
json
{
  "template": "<from storyboard.template>",
  "fps": 30,
  "width": "<from template spec>",
  "height": "<from template spec>",
  "totalFrames": "<calculated sum>",
  "brand": "<BrandProps from brand-voice.yaml>",
  "scenes": [
    {
      "type": "<mapped scene type>",
      "startFrame": "<calculated>",
      "durationFrames": "<scene.duration * fps>",
      "text": "<from storyboard scene>",
      "subtext": "<from storyboard scene, optional>",
      "icon": "<from storyboard scene, optional>",
      "animation": "<from storyboard scene>",
      "transition": "<from storyboard scene, default crossfade>"
    }
  ],
  "showProgressBar": true,
  "showWatermark": true
}

Timing and Pacing

Duration Rules by Scene Type

Scene TypeMinimumRecommendedMaximumNotes
hook1.5s2-3s3sMust fire immediately. Hook text readable in under 2s.
point3s4-6s8sOne concept per scene. Text + subtext readable in duration.
comparison4s6-8s10sBefore/after pair needs time to register contrast.
number3s4-5s6sCounter-up animation needs 2-3s, context text needs 2s.
step8s12-15s20sTutorial steps need reading time + comprehension.
demo8s12-15s20sProduct features need visual demonstration time.
cta2s3-4s5sShort, clear, actionable. Don't linger.

Pacing by Platform

PlatformTotal Duration Sweet SpotScene PacingHook Window
Instagram Reels15-30sFast (3-5s per scene)< 1.5s
YouTube Shorts30-60sMedium (4-6s per scene)< 2s
TikTok15-60sFast (3-5s per scene)< 1s
YouTube (long)60-180sMeasured (8-15s per scene)< 3s

Pacing Rules

  1. 3-5 second visual change rule: No scene should go more than 5 seconds without a visible change (animation, new text, transition, or motion element).
  2. Descending duration: Later scenes can be slightly shorter than earlier ones to create acceleration toward the CTA.
  3. Hook compression: The hook scene should feel urgent. 2-3 seconds maximum. If the hook needs more time, the text is too long.
  4. CTA brevity: The CTA scene is not for new information. Keep it under 4 seconds. The viewer has already decided to act or not.
  5. Reading speed: Assume 150 words per minute for on-screen text. A 5-second scene supports approximately 12 words.

Animation Catalog

Ten animation types are available. Each maps to a Remotion animation implementation using useCurrentFrame() and interpolate().

AnimationDescriptionBest ForRemotion Implementation
fade-inOpacity from 0 to 1 over 15 framesHook scenes, gentle revealsinterpolate(frame, [0, 15], [0, 1]) on opacity
fade-outOpacity from 1 to 0 over 15 framesScene exits, before transitionsinterpolate(frame, [end-15, end], [1, 0]) on opacity
slide-leftElement enters from right edge, slides to centerContent points (odd positions)interpolate(frame, [0, 20], [width, 0]) on translateX
slide-rightElement enters from left edge, slides to centerContent points (even positions)interpolate(frame, [0, 20], [-width, 0]) on translateX
slide-upElement enters from bottom, slides to centerSteps, reveals, listsinterpolate(frame, [0, 20], [height, 0]) on translateY
scale-inElement scales from 0.5 to 1.0 with slight bounceHooks, reveals, emphasisinterpolate(frame, [0, 20], [0.5, 1]) on scale with spring config
bounceElement enters with elastic bounce effectCTAs, emphasis, fun revealsspring({ frame, fps, config: { damping: 8, stiffness: 100 } })
typewriterText appears character by characterQuotes, statements, dramatic revealsRender substring text.slice(0, charIndex) per frame
counter-upNumber counts from 0 to target valueStatistics, metrics, datainterpolate(frame, [0, durationFrames], [0, targetNumber]) rounded
wipeHorizontal wipe reveals new contentBefore/after reveals, dramatic transitionsClipPath animation from inset(0 100% 0 0) to inset(0 0 0 0)

Animation Selection Rules

  1. Hook scenes: Use fade-in, scale-in, or wipe. Never use slide-left or slide-right for the first scene — they feel like continuation, not an opening.
  2. Point scenes: Alternate slide-left and slide-right for pattern interrupt. Same direction on every scene is monotonous.
  3. Number scenes: Always use counter-up for the number itself. Use fade-in for the context text below.
  4. CTA scenes: Use bounce or scale-in for emphasis. The CTA must feel like an arrival, not a slide.
  5. Comparison scenes: Use wipe for dramatic before/after reveals. slide-left/slide-right for less dramatic comparisons.
  6. Step scenes: Use slide-up consistently for all steps. The upward motion creates a sense of building/progressing.
  7. Never use more than 3 different animation types in a single video. Consistency is more important than variety.

Animation Timing

AnimationDefault Duration (frames)At 30fps
fade-in150.5s
fade-out150.5s
slide-left200.67s
slide-right200.67s
slide-up200.67s
scale-in200.67s
bounce301.0s
typewritervaries (2 frames/char)varies
counter-upmatches scene durationvaries
wipe250.83s

Transitions

Four transition types connect scenes. Transitions occur between the end of one scene and the start of the next.

TransitionFrame DurationAt 30fpsDescriptionBest For
crossfade15 frames0.5sOutgoing scene fades out while incoming fades in. Smooth and professional.Default for most scene changes. Points, steps, generic transitions.
wipe20 frames0.67sHorizontal wipe reveals the new scene from left to right. Dramatic.Before/after reveals, comparison pairs, dramatic moments.
cut0 frames0sInstant switch. No transition effect. Sharp and immediate.Hook scene start (always use cut for the first scene), rhythm breaks.
slide15 frames0.5sOutgoing scene slides out while incoming slides in from opposite edge.Carousel-animated (mimics swipe gesture), sequential content.

Transition Rules

  1. First scene always uses cut: The video must start immediately. No fade-in from black — the hook text must be visible from frame 1.
  2. Default is crossfade: When no transition is specified, use crossfade. It is the safest and most professional option.
  3. Use wipe sparingly: Maximum 2 wipe transitions per video. Overuse makes the video feel gimmicky.
  4. slide for CarouselAnimated: The slide transition mimics the Instagram carousel swipe gesture, making animated carousels feel native.
  5. Transition frames overlap: Transitions consume frames from both the outgoing and incoming scenes. They do not add to total duration.

Platform Rules

Instagram Reels

ParameterValueNotes
Aspect Ratio9:16 (1080x1920)Mandatory for full-screen Reels
Max Duration90 secondsAlgorithm favors 15-30s for reach
Min Duration3 secondsBelow 3s feels like an error
Sweet Spot15-30 secondsHighest completion rate and reach
Hook Window< 1.5 secondsText must be readable immediately
Safe Zones250px top, 400px bottomAvoid UI overlay areas (username, music, buttons)
AudioOptional (motion-only supported)Add caption overlay for sound-off viewers

YouTube Shorts

ParameterValueNotes
Aspect Ratio9:16 (1080x1920)Same as Reels
Max Duration60 secondsHard limit enforced by YouTube
Min Duration15 secondsBelow 15s may not get Shorts shelf
Sweet Spot30-60 secondsYouTube Shorts audience tolerates longer content
Hook Window< 2 secondsSlightly more forgiving than IG
Safe Zones200px top, 350px bottomSimilar to Reels but slightly different UI
AudioRecommendedYouTube Shorts discovery relies more on audio

TikTok

ParameterValueNotes
Aspect Ratio9:16 (1080x1920)Standard vertical
Max Duration3 minutes (180s)Extended from original 60s
Min Duration5 secondsBelow 5s may not surface in For You
Sweet Spot15-60 secondsDepends on content type
Hook Window< 1 secondTikTok has the shortest attention span
Safe Zones150px top, 500px bottomLarge bottom safe zone for comments/buttons
AudioStrongly recommendedTikTok is audio-first platform

YouTube (Horizontal)

ParameterValueNotes
Aspect Ratio16:9 (1920x1080)Standard horizontal
Max DurationNo limitPlatform supports any length
Min Duration30 secondsBelow 30s feels rushed for horizontal
Sweet Spot60-180 secondsFor explainers and demos
Hook Window< 3 secondsMore patient audience
Safe ZonesMinimalFull-screen video, no UI overlays during playback
AudioExpectedHorizontal YouTube content almost always has narration

Brand Integration

Color Mapping from brand-voice.yaml

yaml
# brand-voice.yaml colors map to video elements:
primary:     # Scene accent colors, progress bar fill, icon highlights
secondary:   # Secondary highlights, subtext emphasis, background accents
background:  # Video background color, gradient base
text:        # All text (headlines, body, subtext)
accent:      # CTA button color, emphasis elements, counter-up numbers

Color Application by Scene Type

Scene TypeBackgroundTextAccent Usage
hookbackground color or dark gradienttext color, largeaccent on key word or underline
pointbackground colortext colorprimary on icon, secondary on subtext
comparisonsplit: muted background / vibrant backgroundtext coloraccent on "after" state
numberbackground colortext color for contextaccent on the animated number
stepbackground colortext colorprimary on step number
demobackground color or branded gradienttext coloraccent on feature highlights
ctaaccent color as background or accent bordertext color (inverted if needed)accent dominant

Watermark Positioning

The brand watermark (@handle) is rendered by the BrandWatermark component:

PositionPixel OffsetBest For
bottom-right40px from bottom, 40px from rightDefault. Most natural position.
bottom-left40px from bottom, 40px from leftWhen bottom-right conflicts with platform UI
top-right40px from top, 40px from rightWhen bottom area is crowded

Watermark rules:

  • Fade-in at the start of the first scene, stays visible for entire video
  • Opacity: 0.7 (visible but not distracting)
  • Font size: 18-22px
  • Color: text color from brand at 70% opacity
  • Never place over the main text area of any scene

Progress Bar

The animated progress bar shows video progress (0% to 100% over the full duration):

  • Position: Top of frame (default) or bottom of frame
  • Height: 4px
  • Color: primary color from brand
  • Background: white at 20% opacity
  • Animation: Width interpolates from 0% to 100% linearly across totalFrames

Retention Triggers

Visual Change Cadence

The single most important retention factor in short-form video is visual change frequency. The human brain habituates to static visuals in 3-5 seconds and the viewer's finger moves to scroll.

Rule: A visible change must occur every 3-5 seconds.

Types of visible changes (in order of impact):

  1. Scene transition — new background, new text, new layout (strongest)
  2. Animation start — text slides in, number counts up, element scales (strong)
  3. Color shift — background gradient animates, accent color pulses (moderate)
  4. Progress bar movement — visible progress update (weak but cumulative)

Retention Trigger Catalog

TriggerImplementationWhy It Works
Motion on every sceneAll scenes have entrance animationsStatic text = scroll away. Motion = visual interest.
Counter-up for numbersNumbers animate from 0 to targetBrain tracks counting, creates micro-anticipation.
Alternating slide directionsOdd scenes slide-left, even slide-rightPattern interrupt prevents visual habituation.
Progress barAnimated bar from 0% to 100%Creates completion motivation (endowed progress effect).
Hook in first 1.5sText visible from frame 1, no fade-from-blackFirst impression determines stay/go. No wasted time.
Text in motionTypewriter, slide, fade — never just "appear"Motion triggers peripheral vision attention.
Color contrast on key wordsAccent color on numbers, names, key termsDraws eye to the most important information.
Scene type varietyMix hooks, points, numbers, comparisonsDifferent layouts prevent monotony.

Retention Anti-Pattern Checklist

Before finalizing any storyboard, verify these are NOT present:

Retention Anti-Pattern Checklist:
[ ] No scene exceeds 8 seconds without a visual change
[ ] No two consecutive scenes use the same animation direction
[ ] Hook scene text is visible from frame 1 (no fade-from-black)
[ ] CTA scene is under 5 seconds (viewer has already decided)
[ ] No "intro" scene before the hook (no logos, no "welcome to...")
[ ] Total duration is within platform sweet spot
[ ] Progress bar is enabled (completion motivation)
[ ] At least 1 counter-up animation if content contains numbers
[ ] No scene has more than 20 words of text

Anti-Patterns

Content Anti-Patterns

Anti-PatternWhy It FailsFix
Scene > 8s without visual changeViewer habituates, scrolls awaySplit scene or add mid-scene animation
Static text (no animation)Looks like a screenshot, not a videoAdd entrance animation to every text element
No CTA at the endViewer watches but takes no actionAlways end with a clear, single CTA
Hook > 3 secondsLoses viewers before the content startsCompress hook to 2-3s max. If text is too long, simplify.
Intro/logo before hookWastes the critical first 1.5sHook first, always. Brand watermark handles attribution.
Slow pacing (>6s per point scene)Feels like a slideshow, not a videoSpeed up to 4-5s per point. Cut unnecessary subtext.
Too many words per sceneText unreadable in scene durationMax 20 words per scene. 12 words is ideal for 5s scenes.
Same animation on every sceneMonotonous, no pattern interruptsAlternate directions, mix animation types (max 3 types).

Technical Anti-Patterns

Anti-PatternWhy It FailsFix
Duration outside template rangeRemotion render may fail or produce bad outputCheck template duration constraints before composing
Wrong aspect ratio for platformVideo appears letterboxed or croppedMatch template aspect ratio to target platform
Transition frames exceeding scene durationScene content gets cut by transition overlapEnsure scene durationFrames > transition frame count
Missing brand colorsVideo looks generic, no brand recognitionAlways load and inject BrandProps from brand-voice.yaml
Counter-up without sufficient durationNumber animation too fast to readMinimum 3s for counter-up scenes
Watermark over main textBlocks content, looks amateurPosition watermark in corner away from text area

Strategic Anti-Patterns

Anti-PatternWhy It FailsFix
Using explainer template for reel contentWrong pacing, wrong audience expectationsMatch template to content type and platform
60s reel for a 3-point topicPadded content feels thin, hurts retentionShorter content = shorter video. 3 points = 25-30s reel.
Animated carousel without original carouselNo source content to adaptUse reel or explainer template instead. CarouselAnimated is for converting existing content.
Ignoring platform safe zonesText hidden behind platform UI elementsRespect safe zone margins per platform
No progress bar on reelsViewer has no sense of video lengthAlways enable progress bar for short-form content

Carousel-to-Video Conversion

When to Use CarouselAnimated

Convert existing HTML carousel content to animated video when:

  • The user explicitly requests an animated version of an existing carousel
  • Cross-posting strategy targets video-first platforms (TikTok, YouTube Shorts)
  • Carousel performance data suggests video would perform better
  • The content is evergreen and worth repurposing

Conversion Rules

Slide-to-Scene Mapping
Carousel slide_plan:                    Video storyboard:
  slide 1 (cover)           -->         scene 1 (hook, 4s, fade-in)
  slide 2 (content)         -->         scene 2 (point, 4s, slide-left)
  slide 3 (content)         -->         scene 3 (point, 4s, slide-right)
  ...                                   ...
  slide N (cta)             -->         scene N (cta, 4s, bounce)
Content Adaptation
Carousel ElementVideo Adaptation
Slide headlineScene text (keep as-is, already optimized)
Slide body textScene subtext (may need trimming for reading speed)
Slide bulletsConvert to sequential text reveals within scene
Slide icon/emojiScene icon (keep as-is)
Progress dotsReplace with animated progress bar
Brand watermarkMap to BrandWatermark component
Timing Calculation
Carousel with N slides:
  Each slide becomes a 4-second scene
  Total duration = N * 4 seconds

  Example: 7-slide carousel = 28-second video

  If total > 60s: reduce per-scene duration to 3s
  If total < 15s: increase per-scene duration to 5s
Transition for Carousel-Animated

Always use slide transition for CarouselAnimated. This mimics the Instagram carousel swipe gesture and makes the animated version feel like a natural extension of the carousel format.

Design Spec Inheritance

When converting from an existing carousel, the CarouselAnimated template inherits:

  • Color palette from the carousel's design_spec.palette
  • Brand handle from the carousel's design_spec.brand.handle
  • Typography style from the carousel's design_spec.typography

Do not re-derive these from brand-voice.yaml — use the carousel's existing design decisions for visual consistency between the static and animated versions.


Shared Components Reference

Six Remotion React components are available for all templates:

ComponentPurposeProps
AnimatedTextRenders text with specified animation type and delaytext, animation, delay, style
ProgressBarAnimated bar showing video progress (0-100%)position ("top" or "bottom"), color, height
BrandWatermarkBrand handle overlay in corner, fades in on first scenehandle, position, color, opacity
TransitionWipeRenders transition effect between scenestype ("crossfade", "wipe", "cut", "slide"), durationFrames
BackgroundGradientAnimated gradient background with subtle color shiftcolors (array), direction, animationSpeed
CounterUpCounts from 0 to target number with easingtarget, durationFrames, style, easing

Output Contract

yaml
output_contract:
  skill: remotion-video
  format: composition_json
  required_fields:
    template: string       # Must match a registered template name
    fps: integer           # Always 30
    width: integer         # From template spec
    height: integer        # From template spec
    totalFrames: integer   # Calculated sum of all scene durationFrames
    brand: BrandProps      # From brand-voice.yaml
    scenes: SceneProps[]   # Mapped from storyboard
    showProgressBar: boolean
    showWatermark: boolean
  scene_required_fields:
    type: string           # hook | point | comparison | number | step | demo | cta
    startFrame: integer    # Calculated cumulative position
    durationFrames: integer # scene.duration * fps
    text: string           # Scene headline text
    animation: string      # From animation catalog
  scene_optional_fields:
    subtext: string
    icon: string
    transition: string     # Default: crossfade
  validation:
    total_frames_within_template_range: true
    all_animations_in_catalog: true
    all_transitions_in_catalog: true
    frame_calculations_correct: true
    brand_colors_present: true
    no_scene_exceeds_max_duration: true

Remotion Environment Discovery & Rendering

CRITICAL: Run this discovery routine BEFORE any render attempt.

The Remotion CLI may be installed differently on each user's machine. Never assume a fixed path or command. Follow this discovery sequence exactly.

Step 1: Locate the GrowthOS Remotion Project

The Remotion project lives inside the GrowthOS plugin directory. Discover its path dynamically:

bash
# Strategy 1: Relative to the growthOS plugin root
GROWTHOS_ROOT="$(find . -maxdepth 4 -name 'brand-voice.yaml' -exec dirname {} \; 2>/dev/null | head -1)"
REMOTION_PROJECT="${GROWTHOS_ROOT}/remotion"

# Strategy 2: If brand-voice.yaml not found, search for remotion/src/Root.tsx
REMOTION_PROJECT="$(find . -maxdepth 5 -path '*/growthOS/remotion' -type d 2>/dev/null | head -1)"

# Strategy 3: Check common Claude Code plugin locations
PLUGIN_LOCATIONS=(
  "${HOME}/.claude/plugins"
  "${HOME}/Downloads"
  "$(pwd)"
)
for loc in "${PLUGIN_LOCATIONS[@]}"; do
  if [ -f "${loc}/growthOS/remotion/src/Root.tsx" ] || [ -f "${loc}/growthOS/remotion/index.ts" ]; then
    REMOTION_PROJECT="${loc}/growthOS/remotion"
    break
  fi
done

Validation: After locating, confirm the project is valid:

bash
# Must have at least one of these entry points
[ -f "${REMOTION_PROJECT}/index.ts" ] || [ -f "${REMOTION_PROJECT}/src/Root.tsx" ]

Step 2: Determine the Entry Point

GrowthOS has two Remotion entry point structures. Detect which one is active:

bash
# Preferred: Full project with 6 compositions (src/ structure)
if [ -f "${REMOTION_PROJECT}/src/Root.tsx" ] && [ -f "${REMOTION_PROJECT}/src/compositions/index.ts" ]; then
  ENTRY_POINT="${REMOTION_PROJECT}/src/index.ts"
  ENTRY_TYPE="full"
  # Available compositions: ReelTips, ReelBeforeAfter, ReelNumbers, ExplainerSteps, ExplainerDemo, CarouselAnimated

# Fallback: Simplified structure (root-level)
elif [ -f "${REMOTION_PROJECT}/index.ts" ]; then
  ENTRY_POINT="${REMOTION_PROJECT}/index.ts"
  ENTRY_TYPE="simple"
  # Available compositions: ReelTips only (others must be added)
fi

Entry point decision table:

StructureEntry PointCompositionsWhen to Use
src/ (full)remotion/src/index.tsAll 6 templatesDefault — use this when available
Root-level (simple)remotion/index.tsReelTips onlyFallback if src/ not present

Step 3: Discover the Remotion CLI

Remotion CLI can be installed in multiple ways. Check in order of preference:

bash
# Method 1: Local npx (most reliable — uses project's node_modules)
cd "${REMOTION_PROJECT}" && npx remotion --version 2>/dev/null
REMOTION_CMD="npx remotion"

# Method 2: Project-level node_modules binary
if [ -x "${REMOTION_PROJECT}/node_modules/.bin/remotion" ]; then
  REMOTION_CMD="${REMOTION_PROJECT}/node_modules/.bin/remotion"
fi

# Method 3: GrowthOS parent node_modules (if deps installed at growthOS level)
GROWTHOS_BIN="${GROWTHOS_ROOT}/node_modules/.bin/remotion"
if [ -x "${GROWTHOS_BIN}" ]; then
  REMOTION_CMD="${GROWTHOS_BIN}"
fi

# Method 4: Global install
if command -v remotion &>/dev/null; then
  REMOTION_CMD="remotion"
fi

# Method 5: Not found — install needed
if [ -z "${REMOTION_CMD}" ]; then
  echo "Remotion not found. Installing..."
  cd "${REMOTION_PROJECT}" && npm install
  REMOTION_CMD="npx remotion"
fi

Discovery result table:

MethodCommandReliabilityNotes
npx remotionHighUses local node_modules, auto-resolves versionPreferred
./node_modules/.bin/remotionHighDirect binary, no npx overheadFast alternative
Global remotionMediumMay version-mismatch with project depsCheck version compatibility
Not found——Run npm install in remotion project dir

Step 4: Verify Dependencies

Before rendering, confirm all dependencies are installed:

bash
cd "${REMOTION_PROJECT}"

# Check if node_modules exists and has remotion
if [ ! -d "node_modules/remotion" ]; then
  echo "Installing Remotion dependencies..."
  npm install
fi

# Verify Chrome Headless Shell (Remotion downloads this automatically on first render)
# No manual action needed — Remotion handles this. But if it fails:
# npx remotion browser ensure

Step 5: Render Commands

Use the discovered REMOTION_CMD and ENTRY_POINT to execute renders:

bash
# Ensure output directory exists
mkdir -p "${GROWTHOS_ROOT}/.growthOS/output/videos/$(date +%Y-%m-%d-%H%M%S)"
OUTPUT_DIR="${GROWTHOS_ROOT}/.growthOS/output/videos/$(date +%Y-%m-%d-%H%M%S)"

# List available compositions (verify before render)
cd "${REMOTION_PROJECT}" && ${REMOTION_CMD} compositions "${ENTRY_POINT}"

# Render MP4 video
cd "${REMOTION_PROJECT}" && ${REMOTION_CMD} render "${ENTRY_POINT}" <CompositionId> "${OUTPUT_DIR}/video.mp4"

# Render a still frame (preview/thumbnail)
cd "${REMOTION_PROJECT}" && ${REMOTION_CMD} still "${ENTRY_POINT}" <CompositionId> "${OUTPUT_DIR}/preview.png" --frame=45

# Open Remotion Studio (interactive preview in browser)
cd "${REMOTION_PROJECT}" && ${REMOTION_CMD} studio "${ENTRY_POINT}"

Passing dynamic props (from composition.json):

bash
# Pass scene data from the storyboard via --props flag
cd "${REMOTION_PROJECT}" && ${REMOTION_CMD} render "${ENTRY_POINT}" ReelTips "${OUTPUT_DIR}/video.mp4" \
  --props="${OUTPUT_DIR}/composition.json"

Step 6: Cross-Platform Considerations

PlatformWorking Dir SeparatorShellNPX AvailableNotes
macOS/zsh/bashYes (with Node)Default dev platform. open file.mp4 to play.
Linux/bashYes (with Node)xdg-open file.mp4 to play. May need apt install chromium for headless.
Windows (native)\PowerShell/cmdYes (with Node)Use start file.mp4 to play. Paths need backslash or quotes.
Windows (WSL)/bashYes (with Node)Render inside WSL, output accessible at /mnt/c/.... explorer.exe file.mp4 to play.

macOS-specific:

bash
# Render and open
cd "${REMOTION_PROJECT}" && ${REMOTION_CMD} render "${ENTRY_POINT}" ReelTips out/video.mp4 && open out/video.mp4

Linux-specific:

bash
# Ensure headless Chrome dependencies
sudo apt-get install -y chromium-browser 2>/dev/null || true
cd "${REMOTION_PROJECT}" && ${REMOTION_CMD} render "${ENTRY_POINT}" ReelTips out/video.mp4 && xdg-open out/video.mp4

WSL-specific:

bash
# Render in WSL, open in Windows
cd "${REMOTION_PROJECT}" && ${REMOTION_CMD} render "${ENTRY_POINT}" ReelTips out/video.mp4
explorer.exe "$(wslpath -w out/video.mp4)"

Step 7: Performance Tuning

bash
# Default concurrency (auto-detected from CPU cores)
${REMOTION_CMD} render "${ENTRY_POINT}" ReelTips out/video.mp4

# Explicit concurrency (use 50-75% of available cores)
${REMOTION_CMD} render "${ENTRY_POINT}" ReelTips out/video.mp4 --concurrency=8

# Lower quality for fast preview
${REMOTION_CMD} render "${ENTRY_POINT}" ReelTips out/preview.mp4 --jpeg-quality=60 --scale=0.5

# High quality for publication
${REMOTION_CMD} render "${ENTRY_POINT}" ReelTips out/video.mp4 --jpeg-quality=90 --crf=18

Troubleshooting

ErrorCauseFix
remotion: command not foundCLI not installedcd ${REMOTION_PROJECT} && npm install then use npx remotion
Cannot find module 'remotion'Dependencies not installedcd ${REMOTION_PROJECT} && npm install
Could not find compositionWrong entry point or composition IDRun ${REMOTION_CMD} compositions ${ENTRY_POINT} to list available
Chrome Headless Shell not foundFirst render, downloadingWait for auto-download, or run npx remotion browser ensure
ENOMEM / out of memoryVideo too long or high concurrencyReduce --concurrency or add --scale=0.5
ENOSPC / disk spaceNot enough disk for render framesFree 500MB+ before rendering
Timed outRender exceeds 5minReduce duration, lower quality, or increase --timeout
JSX element type 'X' does not have any constructTypeScript/React version mismatchCheck tsconfig.json has "jsx": "react-jsx"
Module not found: @remotion/cli/configOld remotion.config.ts APIUpdate to import { Config } from "@remotion/cli/config"

Complete Discovery Script (copy-paste ready)

bash
#!/bin/bash
# GrowthOS Remotion Discovery — run from project root
set -e

# 1. Find GrowthOS root
GROWTHOS_ROOT="$(find . -maxdepth 4 -name 'brand-voice.yaml' -exec dirname {} \; 2>/dev/null | head -1)"
if [ -z "$GROWTHOS_ROOT" ]; then
  echo "ERROR: brand-voice.yaml not found. Run /grow setup first."
  exit 1
fi

# 2. Find Remotion project
REMOTION_PROJECT="${GROWTHOS_ROOT}/remotion"
if [ ! -d "$REMOTION_PROJECT" ]; then
  echo "ERROR: Remotion project not found at ${REMOTION_PROJECT}"
  exit 1
fi

# 3. Determine entry point
if [ -f "${REMOTION_PROJECT}/src/compositions/index.ts" ]; then
  ENTRY_POINT="src/index.ts"
  echo "Entry: full (6 compositions)"
else
  ENTRY_POINT="index.ts"
  echo "Entry: simple (ReelTips only)"
fi

# 4. Ensure dependencies
if [ ! -d "${REMOTION_PROJECT}/node_modules/remotion" ]; then
  echo "Installing dependencies..."
  cd "$REMOTION_PROJECT" && npm install
fi

# 5. Verify
cd "$REMOTION_PROJECT" && npx remotion compositions "$ENTRY_POINT"

echo ""
echo "Remotion ready!"
echo "  Project: ${REMOTION_PROJECT}"
echo "  Entry:   ${ENTRY_POINT}"
echo "  Render:  cd ${REMOTION_PROJECT} && npx remotion render ${ENTRY_POINT} <CompositionId> out/video.mp4"
echo "  Studio:  cd ${REMOTION_PROJECT} && npx remotion studio ${ENTRY_POINT}"

Frequently asked questions

What does the Remotion Video AI skill do?

Remotion video composition knowledge — 6 template specs, storyboard-to-composition mapping, frame calculations, animation catalog, transition types, platform rules, retention triggers, and anti-patterns for video production

Why use Remotion Video on TypingMind?

Because you install it once and use it with any model. Remotion Video is plain Markdown rather than provider-specific code, so the same skill runs on GPT-5, Claude, Gemini, Grok, or a local model — and you can switch model mid-chat without it breaking. TypingMind runs on your own API keys, so you pay providers directly instead of a per-seat subscription, and your skills and chats stay in your own storage.

How do I install Remotion Video in TypingMind?

Open Plugins → Skills → Install from GitHub in TypingMind and paste https://github.com/melgarafael/growthOS/tree/main/skills/remotion-video. TypingMind reads its SKILL.md and installs it as a skill you can enable per chat.

Which AI models can use Remotion Video?

Any model you connect in TypingMind. AI skills are plain Markdown instructions rather than provider-specific code, so GPT, Claude, Gemini, Grok, and local models can all load this skill when a request matches it.

How many AI models can I use with Remotion Video?

As many as you like. As long as a model supports skills, you can use Remotion Video with it — GPT, Claude, Gemini, Grok, DeepSeek, Mistral, Llama and more — all on TypingMind with your own API keys.

Is the Remotion Video AI skill free?

Yes. It is published on GitHub by melgarafael under the MIT license. You only pay your own AI provider for the tokens you use.

What are AI skills?

An AI skill is a reusable instruction bundle that teaches an AI model how to do one specific task. It follows the open Agent Skills format: a SKILL.md file with a name and description, plus any scripts, templates or reference files the model may need. The model reads the instructions only when your request matches the skill, so an installed skill costs nothing until it is used.

How are AI skills different from plugins or MCP servers?

A plugin or MCP server gives a model new tools to call — code that runs somewhere and returns a result. An AI skill gives the model knowledge and process instead: how to approach a task, which steps to follow, what good output looks like. Skills are plain Markdown, so they need no server, no API key and no runtime, and they work with any model.

View all

Set up your own AI workspace now

Get notified about new features and future giveaways by subscribing to our newsletter 👇