# remotion-ads > Instagram Reels & Carousel ad creation with Remotion. Use when creating vertical videos (9:16) for Instagram Reels/Stories or carousel posts (4:5). Includes safe zones, typography specs, voiceover integration, animations, and export settings. - Author: maartenvo - Repository: Maartenlouis/remotion-ads - Version: 20260127175511 - Stars: 7 - Forks: 0 - Last Updated: 2026-02-06 - Source: https://github.com/Maartenlouis/remotion-ads - Web: https://mule.run/skillshub/@@Maartenlouis/remotion-ads~remotion-ads:20260127175511 --- --- name: remotion-ads description: Instagram Reels & Carousel ad creation with Remotion. Use when creating vertical videos (9:16) for Instagram Reels/Stories or carousel posts (4:5). Includes safe zones, typography specs, voiceover integration, animations, and export settings. --- # Remotion Ads - Instagram Video & Carousel Creation Complete toolkit for creating professional Instagram Reels and Carousel ads with Remotion. ## Quick Setup **Before creating any videos, configure your brand:** 1. Copy `rules/design-system-template.md` to `rules/design-system.md` 2. Fill in your brand colors, fonts, and asset paths 3. Generate backgrounds: `node scripts/generate-backgrounds.js` 4. Scan assets: `node scripts/scan-instagram-assets.js` See [rules/setup.md](rules/setup.md) for complete project setup. --- ## Rule Files ### Core Documentation | File | Description | |------|-------------| | [rules/setup.md](rules/setup.md) | Initial project setup, dependencies, folder structure | | [rules/design-system-template.md](rules/design-system-template.md) | Template for your brand colors, fonts, and assets | | [rules/formats.md](rules/formats.md) | Instagram display formats (9:16, 4:5, 1:1) and crop zones | ### Video Creation | File | Description | |------|-------------| | [rules/voiceover.md](rules/voiceover.md) | ElevenLabs integration, scene JSON, timing sync | | [rules/captions.md](rules/captions.md) | Animated captions with word-level timing and highlighting | | [rules/animations.md](rules/animations.md) | Spring configs, transitions, animation components | | [rules/components.md](rules/components.md) | Reusable template components for scenes | ### Assets & Carousels | File | Description | |------|-------------| | [rules/local-assets.md](rules/local-assets.md) | Backgrounds, icons, illustrations management | | [rules/carousels.md](rules/carousels.md) | Instagram carousel design specs, batch rendering | --- ## Core Dimensions ### Instagram Reels (9:16) | Property | Value | |----------|-------| | Canvas | 1080×1920px (9:16 aspect ratio) | | Resolution | Minimum 720p, optimal 1080p | | Format | MP4 (H.264 codec) with AAC audio | | Frame Rate | 30 FPS | | Duration | 15-60 seconds (15s recommended for ads) | ### Instagram Carousels (4:5) | Property | Value | |----------|-------| | Canvas | 1080×1350px (4:5 aspect ratio) | | Slides | 2-10 images per carousel | | Format | PNG or JPEG | --- ## Safe Zones (Critical) ### Reels Safe Zone Map (1080×1920) ``` ┌─────────────────────────────────────┐ 0px │ TOP DANGER ZONE │ │ (username, "Reels" branding, UI) │ │ 250px buffer │ ├─────────────────────────────────────┤ ~285px │ ┌─────────────────────────────┐ │ │ │ │ │ │ │ OPTIMAL CONTENT │ │ │ │ ZONE │ │ │ │ │ │ │ │ 880×1350px centered │ │ │ │ (middle 60% of screen) │ │ │ │ │ │ │ │ Place logos, key text, │ │ │ │ faces, CTAs here │ │ │ │ │ │ │ └─────────────────────────────┘ │ │ ←80px 120px→ │ ├─────────────────────────────────────┤ ~1520px │ BOTTOM DANGER ZONE │ │ (captions, buttons, audio, CTA) │ │ 400px buffer │ │ ⚠️ MOST CRITICAL ZONE ⚠️ │ └─────────────────────────────────────┘ 1920px ``` ### Safe Zone Constants ```tsx export const INSTAGRAM_REELS = { width: 1080, height: 1920, aspectRatio: "9:16", fps: 30, buffer: { top: 250, bottom: 400, left: 80, right: 120, }, safeArea: { x: 80, y: 285, width: 880, height: 1235, }, // Feed preview (4:5) crops feedPreview: { cropTop: 285, cropBottom: 285, }, // Grid preview (1:1) crops gridPreview: { cropTop: 420, cropBottom: 420, }, }; ``` See [rules/formats.md](rules/formats.md) for detailed format specifications. --- ## Brand Configuration ### Design System Template Create `rules/design-system.md` from the template: ```tsx // TODO: Replace with your brand values const COLORS = { primary: "#YOUR_PRIMARY_COLOR", secondary: "#YOUR_SECONDARY_COLOR", background: "#YOUR_BG_COLOR", foreground: "#YOUR_TEXT_COLOR", dark: "#YOUR_DARK_COLOR", accent: "#YOUR_ACCENT_COLOR", }; // TODO: Import your brand fonts import { loadFont } from "@remotion/google-fonts/YourHeadingFont"; import { loadFont as loadBodyFont } from "@remotion/google-fonts/YourBodyFont"; const { fontFamily: headingFont } = loadFont(); const { fontFamily: bodyFont } = loadBodyFont(); // TODO: Set your logo path const LOGO_PATH = "your-logo.png"; // In public/ folder ``` See [rules/design-system-template.md](rules/design-system-template.md) for complete configuration. --- ## Ad Structure (4 Scenes) ### Recommended Scene Flow | Scene | Purpose | Duration | Character | |-------|---------|----------|-----------| | **Scene 1: Hook** | Grab attention | 2-4s | `dramatic` | | **Scene 2: Problem** | Establish pain point | 3-5s | `narrator` | | **Scene 3: Solution** | Present answer | 3-5s | `expert` | | **Scene 4: CTA** | Call to action | 2-4s | `calm` | ### Scene 1: Hook - Large attention-grabbing icon (160-240px) - Bold headline with keyword highlighted - Empathetic subtitle - Dark gradient background ### Scene 2: Problem - Problem list with icons (55-75px) - Staggered fade-in animation - Optional section title - Serious tone gradient ### Scene 3: Solution - Large solution icon (140-180px) - Solution highlight with accent color - Reassuring subtitle - Positive brand gradient ### Scene 4: CTA - Brand logo prominently displayed - Trust signals (ratings, badges) - CTA button with arrow - "Link in Bio" text - Light background --- ## Voiceover Integration ### Quick Start ```bash # Generate voiceover with timestamps node .claude/skills/elevenlabs/generate.js \ --scenes remotion/instagram-ads/scenes/ad-example-scenes.json \ --with-timestamps \ --output-dir public/audio/instagram-ads/ad-example/ ``` ### Scene JSON Format ```json { "name": "ad-example", "voice": "YourVoiceName", "character": "narrator", "scenes": [ { "id": "scene1", "text": "Hook text here.", "duration": 3.5, "character": "dramatic" }, { "id": "scene2", "text": "Problem description.", "duration": 4.5 }, { "id": "scene3", "text": "Solution presentation.", "duration": 4.0, "character": "expert" }, { "id": "scene4", "text": "Call to action. Brand Name.", "duration": 3.0, "character": "calm" } ] } ``` ### Character Presets | Character | Style | Best For | |-----------|-------|----------| | `dramatic` | Intense, emotional | Hooks, problem statements | | `narrator` | Professional, smooth | General content | | `expert` | Authoritative | Solutions, legal content | | `calm` | Soothing, reassuring | CTAs, trust-building | | `salesperson` | Enthusiastic | Marketing, ads | See [rules/voiceover.md](rules/voiceover.md) for complete integration guide. --- ## Captions ### TikTok-Style Captions Generate word-level timestamps for animated captions: ```bash node .claude/skills/elevenlabs/generate.js \ --scenes scenes.json \ --with-timestamps \ --output-dir public/audio/ad-example/ ``` Key features: - Word-by-word highlighting - Page grouping (1-6 words per page) - Entrance animations - Text replacement (phonetic → display) See [rules/captions.md](rules/captions.md) for implementation. --- ## Typography Specifications ### Font Sizes (1080×1920) | Element | Size | Weight | |---------|------|--------| | Hero headline | 64-80px | 700 | | Section headline | 52-64px | 600 | | Body/subtitle | 44-52px | 500 | | Bullet points | 40-48px | 500 | | Captions | 48-56px | 400 | | CTA button | 36-48px | 600 | | Fine print | 24-28px | 400 | ### Text Formatting ```tsx // High-contrast text (readable on any background) const contrastTextStyle = { color: "#ffffff", textShadow: "0 2px 8px rgba(0,0,0,0.8), 0 0 20px rgba(0,0,0,0.5)", }; // Highlighted word keyword ``` --- ## Animation Presets ### Spring Configurations ```tsx // Smooth - professional, no bounce const SPRING_SMOOTH = { damping: 200 }; // Quick - snappy transitions const SPRING_QUICK = { damping: 15, stiffness: 100 }; // Bouncy - attention-grabbing const SPRING_BOUNCY = { damping: 8, stiffness: 200 }; ``` ### Common Animations | Animation | Use For | |-----------|---------| | Fade in + slide up | Text reveals | | Scale pop | Icons, logos | | Staggered list | Bullet points | | Crossfade | Scene transitions | See [rules/animations.md](rules/animations.md) for all animation patterns. --- ## Asset Structure ``` public/ ├── images/ │ └── instagram-ads/ │ ├── backgrounds/ # 1080×1920 or 1080×1350 │ ├── icons/ # 64-256px elements │ ├── illustrations/ # 256-800px graphics │ │ └── ad-example/ │ │ └── final/ # Processed with transparency │ └── overlays/ # Transparent overlays ├── audio/ │ └── instagram-ads/ │ └── ad-example/ # Per-ad voiceover files │ ├── ad-example-combined.mp3 │ ├── ad-example-info.json │ └── ad-example-captions.json └── your-logo.png ``` See [rules/local-assets.md](rules/local-assets.md) for asset management. --- ## Export Settings ### Reels Export ```bash npx remotion render AdExample out/reel.mp4 \ --codec=h264 \ --crf=18 \ --audio-codec=aac \ --audio-bitrate=192k ``` ### Carousel Export ```bash # Batch render all slides for i in 1 2 3 4 5; do npx remotion still remotion/index.ts "Carousel-Slide$i" \ "public/images/carousels/example/slide$i.png" --overwrite done ``` --- ## Complete Template ```tsx import React from "react"; import { AbsoluteFill, Audio, Series, staticFile, useVideoConfig, } from "remotion"; // TODO: Import from your design-system.md const COLORS = { primary: "#YOUR_PRIMARY", secondary: "#YOUR_SECONDARY", background: "#YOUR_BG", dark: "#YOUR_DARK", accent: "#YOUR_ACCENT", }; export const AdTemplate: React.FC = () => { const { fps } = useVideoConfig(); // Durations from voiceover info.json (actualDuration values) const SCENE_DURATIONS = { scene1: 3.5, scene2: 4.5, scene3: 4.0, scene4: 3.0, }; const paddingFrames = 5; const scene1Frames = Math.round(SCENE_DURATIONS.scene1 * fps) + paddingFrames; const scene2Frames = Math.round(SCENE_DURATIONS.scene2 * fps) + paddingFrames; const scene3Frames = Math.round(SCENE_DURATIONS.scene3 * fps) + paddingFrames; const totalTargetFrames = Math.round(15 * fps); const scene4Frames = totalTargetFrames - scene1Frames - scene2Frames - scene3Frames; return ( ); }; ``` See [rules/components.md](rules/components.md) for scene template components. --- ## Pre-Upload Checklist ### Reels - [ ] Resolution is 1080×1920 (9:16) - [ ] All text within safe zones (80px+ from edges) - [ ] No critical content in top 285px - [ ] No critical content in bottom 400px - [ ] Text minimum 40px font size - [ ] Logo visible in center 1080×1080 (grid thumbnail) - [ ] Tested 4:5 feed preview (y = 285-1635) - [ ] Tested 1:1 grid preview (y = 420-1500) - [ ] Voiceover synced with visuals - [ ] Captions readable and properly timed - [ ] Total duration ~15 seconds - [ ] Tested on actual mobile device ### Carousels - [ ] Resolution is 1080×1350 (4:5) - [ ] All text within 80px padding - [ ] First slide is attention-grabbing - [ ] CTA with button on final slide - [ ] Brand logo visible - [ ] 5-10 slides total - [ ] Swipe indicators on slides 1-4 --- ## Workflow Summary ```bash # 1. Setup (one time) cp rules/design-system-template.md rules/design-system.md # Edit design-system.md with your brand values node scripts/generate-backgrounds.js node scripts/scan-instagram-assets.js # 2. Create scenes JSON vim remotion/instagram-ads/scenes/ad-new-scenes.json # 3. Generate voiceover node .claude/skills/elevenlabs/generate.js \ --scenes remotion/instagram-ads/scenes/ad-new-scenes.json \ --with-timestamps \ --output-dir public/audio/instagram-ads/ad-new/ # 4. Create composition # Use actualDuration values from ad-new-info.json # 5. Preview npx remotion studio # 6. Render npx remotion render AdNew out/ad-new.mp4 --codec=h264 --crf=18 # 7. Test on mobile before uploading ```