mcpField
R
remotion-ads

remotion-ads

github.com/maartenlouisMarketing & growth64328 installsUpdated 25w ago
Repository

About remotion-ads

Remotion Ads is a skill for producing video ads, explainers, and carousels with Remotion, voiceover, and animated captions. It provides format-specific workflows, brand configuration, and tools for building scenes from a URL or script.

Key features

  1. 01Reels, explainer, and carousel formats
  2. 02Brand configuration and safe zones
  3. 03Scene JSON and voiceover generation
  4. 04Animated captions and reusable components
  5. 05Web page content to video scenes

Use cases

  1. 01Create short Instagram Reels ads
  2. 02Produce narrated website explainers
  3. 03Turn a web page into video scenes
  4. 04Design multi-slide advertising carousels

Install

Copy the command and run it in a terminal.

$npx skills add https://github.com/maartenlouis/remotion-ads --skill remotion-ads

After installing, type/remotion-adsin Claude Code to confirm it loaded.

Bundled files

References and scripts installed along with SKILL.md.

package-lock.json
README.md
.gitignore
package.json
LICENSE
assets/dictionaries/
example.pls
template.pls
references/
ad-copywriting.md
animations.md
brand-config-template.md
captions.md
carousels.md
formats.md
html-in-canvas.md
local-assets.md
gemini-tts.md
natural-transitions.md
copy-frameworks.md
paid-ads.md
components.md
ohneis-style.md
social-content.md
music.md
setup.md
url-to-video.md
website-videos.md
sound-effects.md
scripts/
gemini-tts.mjs
suno-direct.ts
url-to-scenes.js

Details

From the project README

Remotion Ads

Create professional video ads and explainer videos with Remotion, ElevenLabs voiceover, and animated captions.

Setup

  1. Copy references/brand-config-template.md → references/brand-config.md
  2. Fill in brand colors, fonts, voice, caption styling, and content rules
  3. Create pronunciation dictionary from assets/dictionaries/template.pls

See references/setup.md for dependencies and folder structure.


Supported Formats

FormatAspectResolutionDurationScenes
Instagram Reels9:161080×192015-60s4 (Hook→Problem→Solution→CTA)
Instagram Reels (Ohneis)9:161080×192015-45sBeat-driven (word-level)
Website Explainers16:91920×108060-160s6 (Hook→Problem→Context→Solution→Process→CTA)
Carousels4:51080×1350Static5-10 slides

See references/formats.md for safe zones and crop specs. See references/ohneis-style.md for beat-driven cinematic reel template. See references/website-videos.md for 16:9 long-form format.


Workflow

From scratch
# 1. Write scene JSON
# 2. Generate voiceover with word timestamps
node scripts/generate.js \
  --scenes scenes.json \
  --with-timestamps \
  --dictionary your-brand \
  --output-dir public/audio/ad-example/

# 3. Create Remotion composition using actualDuration from info.json
# 4. Render
npx remotion render AdExample out/ad-example.mp4 --codec=h264 --crf=18
From a URL (page → video)
# 1. Extract page data into scene JSON
node scripts/url-to-scenes.js --url https://example.com/page --format reels --output scenes.json
# 2. Review/edit the generated scenes.json
# 3. Continue with voiceover + composition as above

See references/url-to-video.md for the full URL-to-video workflow.


Safe Zones (Critical)

Reels (1080×1920)
┌──────────────────────────┐ 0px
│     TOP DANGER (285px)   │
├──────────────────────────┤
│ ←80px  SAFE AREA  120px→ │
│      880×1235px          │
├──────────────────────────┤
│   BOTTOM DANGER (400px)  │
└──────────────────────────┘ 1920px
const SAFE = { top: 285, bottom: 400, left: 80, right: 120 };
Website Videos (1920×1080)
const SAFE = { top: 60, bottom: 60, left: 80, right: 80 };

Scene JSON Format

{
  "name": "ad-example",
  "voice": "VoiceName",
  "character": "narrator",
  "dictionary": "your-brand",
  "scenes": [
    { "id": "scene1", "text": "Hook text.", "duration": 3.5, "character": "dramatic" },
    { "id": "scene2", "text": "Problem.", "duration": 4.5 },
    { "id": "scene3", "text": "Solution.", "duration": 4.0, "character": "expert" },
    { "id": "scene4", "text": "CTA.", "duration": 3.0, "character": "calm" }
  ]
}
Voice Character Presets
CharacterStyleStabilitySimilarityStyle Param
dramaticIntense, emotional0.30.80.7
narratorProfessional, smooth0.50.750.4
expertAuthoritative0.60.850.3
calmSoothing, reassuring0.70.80.2
conversationalCasual, friendly0.450.70.5

Composition Template

import { AbsoluteFill, Audio, Series, staticFile } from "remotion";

// Import from your brand-config.md values
const COLORS = { primary: "#000", accent: "#888", dark: "#111", background: "#fff" };

export const AdTemplate: React.FC = () => {
  const { fps } = useVideoConfig();
  // Use actualDuration from info.json, not estimated
  const DURATIONS = { scene1: 3.42, scene2: 4.35, scene3: 4.12, scene4: 3.31 };
  const pad = 5;

  return (
    <AbsoluteFill>
      <Audio src={staticFile("audio/ad-example/ad-example-combined.mp3")} />
      <Series>
        <Series.Sequence durationInFrames={Math.round(DURATIONS.scene1 * fps) + pad}>
          <Scene1Hook />
        </Series.Sequence>
        {/* ... remaining scenes */}
      </Series>
    </AbsoluteFill>
  );
};

See references/components.md for reusable scene components. See references/voiceover.md for TransitionSeries audio sync.


Reference Files

Load these on demand based on the task:

Core (read first)
FileWhen to read
setup.mdProject initialization
brand-config-template.mdConfiguring brand: colors, fonts, voice, captions, compliance
formats.mdDimension specs, safe zones, crop previews
Video Creation
FileWhen to read
ohneis-style.mdBeat-driven cinematic reel template: mixed-font typography, hard cuts, moody photos
voiceover.mdElevenLabs TTS, models, scene JSON, timing sync, dictionaries
captions.mdAnimated captions: TikTok-style, word-by-word, karaoke
animations.mdSpring configs, transitions, animation components
components.mdReusable scene template components
html-in-canvas.mdRender live DOM into a canvas with 2D filters or WebGL2 shaders (vintage, progressive blur, page-tour mockup)
website-videos.md16:9 long-form format, 6-scene structure
url-to-video.mdCreate videos from existing web pages
Audio
FileWhen to read
sound-effects.mdElevenLabs SFX generation
music.mdBackground music via ElevenLabs or Suno
Assets & Static
FileWhen to read
local-assets.mdBackground images, icons, illustrations
carousels.md4:5 carousel design and batch rendering
Copywriting
FileWhen to read
ad-copywriting.mdScript frameworks, hook formulas, CTA patterns
copy-frameworks.mdHeadline templates, section formulas
natural-transitions.mdHuman-sounding transitions, AI-tell avoidance
Distribution
FileWhen to read
paid-ads.mdMeta campaign strategy, targeting, budgets
social-content.mdContent calendar, repurposing framework

Scripts

ScriptPurpose
scripts/generate.jsElevenLabs voiceover with dictionaries, request stitching (note: --with-timestamps flag is currently a no-op)
scripts/gemini-tts.mjsGemini TTS — single-request generate + silence split with text-proportion boundary picker
scripts/suno-direct.tsSuno background music generation
scripts/url-to-scenes.jsExtract page content into scene JSON

Pre-Upload Checklist

Reels
  • 1080×1920, H.264, 30fps
  • All text within safe zones
  • No content in top 285px or bottom 400px
  • Font sizes ≥ 48px
  • Voiceover synced, captions timed
  • ~15s total duration
Website Videos
  • 1920×1080, H.264, 30fps
  • Font sizes ≥ 36px
  • 60-160s duration
  • 6-scene structure with appropriate voice characters
Carousels
  • 1080×1350, PNG
  • 80px padding from edges
  • 5-10 slides with swipe indicators

Comments

Markdown supported