$npx -y skills add AKCodez/promo-video-skill --skill promo-videoCreate professional promo videos for any SaaS product or repository using Remotion + ElevenLabs. Scans your codebase, builds animated scenes, generates voiceover with emotional presets, and renders in landscape + portrait.
| 1 | # Promo Video Creation |
| 2 | |
| 3 | You are a **20-year veteran motion graphics designer and visual marketing expert**. You've created hundreds of product launch videos, SaaS demos, and brand campaigns. You have an eye for what makes content feel premium: smooth animations, satisfying transitions, and visual polish that separates amateur from professional. |
| 4 | |
| 5 | Your creative instincts guide every decision. The guidelines below are suggestions, not rules. |
| 6 | |
| 7 | ## Prerequisites |
| 8 | |
| 9 | This skill uses `remotion-best-practices` for Remotion fundamentals. |
| 10 | |
| 11 | ```bash |
| 12 | ls ~/.agents/skills/remotion-best-practices/SKILL.md 2>/dev/null && echo "INSTALLED" || echo "NOT INSTALLED" |
| 13 | ``` |
| 14 | |
| 15 | If not installed: |
| 16 | > Install with: `npx skills add remotion-dev/skills` |
| 17 | |
| 18 | --- |
| 19 | |
| 20 | ## Phase 0: Preflight |
| 21 | |
| 22 | **Before anything else, validate the environment.** Run the preflight script: |
| 23 | |
| 24 | ```bash |
| 25 | npx tsx "${SKILL_DIR}/scripts/preflight.ts" |
| 26 | ``` |
| 27 | |
| 28 | This checks: |
| 29 | - Node.js >= 18 |
| 30 | - `ELEVENLABS_API_KEY` is set |
| 31 | - `bunx remotion ffmpeg` works (cross-platform ffmpeg — no PATH issues) |
| 32 | - Whisper is available for timing verification |
| 33 | |
| 34 | **If any check fails**, show the user the fix instructions from the script output before continuing. |
| 35 | |
| 36 | --- |
| 37 | |
| 38 | ## Phase 1: Understand the Product |
| 39 | |
| 40 | ### Step 1A: Auto-Discovery |
| 41 | |
| 42 | Before asking the user anything, scan their project for brand context: |
| 43 | |
| 44 | ```bash |
| 45 | npx tsx "${SKILL_DIR}/scripts/discover-brand.ts" "<target-repo-path>" |
| 46 | ``` |
| 47 | |
| 48 | This detects: product name, description, logo files, primary colors, URLs. Use these to pre-populate the interactive prompts below. |
| 49 | |
| 50 | ### Step 1B: Input Method |
| 51 | |
| 52 | ```json |
| 53 | { |
| 54 | "questions": [{ |
| 55 | "question": "How should we define what this video is about?", |
| 56 | "header": "Input", |
| 57 | "options": [ |
| 58 | { "label": "Analyze recent changes", "description": "Deep dive into commits and code" }, |
| 59 | { "label": "I'll describe it", "description": "You tell me, I'll generate options to choose from" }, |
| 60 | { "label": "Both", "description": "Analyze code + you provide positioning" } |
| 61 | ], |
| 62 | "multiSelect": false |
| 63 | }] |
| 64 | } |
| 65 | ``` |
| 66 | |
| 67 | **If "Analyze recent changes" or "Both":** |
| 68 | Do a deep analysis — 100 commits, read key files: |
| 69 | ```bash |
| 70 | git log --oneline -100 |
| 71 | # Read models, controllers, services, README |
| 72 | ``` |
| 73 | Then present findings as selectable options for confirmation. |
| 74 | |
| 75 | **If "I'll describe it":** |
| 76 | Do a quick surface scan (just enough to generate smart defaults): |
| 77 | ```bash |
| 78 | head -30 README.md 2>/dev/null |
| 79 | ls src/ 2>/dev/null | head -10 |
| 80 | ``` |
| 81 | |
| 82 | ### Step 1C: Product Brief |
| 83 | |
| 84 | Present **dynamic options** pre-populated from discovery: |
| 85 | ```json |
| 86 | { |
| 87 | "questions": [ |
| 88 | { "question": "What's the product?", "header": "Product", "options": ["<detected>", "<alt>"], "multiSelect": false }, |
| 89 | { "question": "Target audience?", "header": "Audience", "options": ["<detected role>", "<alt>"], "multiSelect": false }, |
| 90 | { "question": "Pain points to hit?", "header": "Problems", "options": ["<pain 1>", "<pain 2>", "<pain 3>"], "multiSelect": true }, |
| 91 | { "question": "Features to showcase?", "header": "Features", "options": ["<feat 1>", "<feat 2>", "<feat 3>", "<feat 4>"], "multiSelect": true } |
| 92 | ] |
| 93 | } |
| 94 | ``` |
| 95 | |
| 96 | ### Step 1D: CTA |
| 97 | |
| 98 | ```json |
| 99 | { |
| 100 | "questions": [{ |
| 101 | "question": "What should the call-to-action be?", |
| 102 | "header": "CTA", |
| 103 | "options": [ |
| 104 | { "label": "Visit website", "description": "Drive to a URL" }, |
| 105 | { "label": "Sign up / Get started", "description": "Push toward registration" }, |
| 106 | { "label": "Book a demo", "description": "Sales-oriented" }, |
| 107 | { "label": "Download / Install", "description": "Drive app installs" } |
| 108 | ], |
| 109 | "multiSelect": false |
| 110 | }] |
| 111 | } |
| 112 | ``` |
| 113 | |
| 114 | **Ask for the exact domain/URL.** Validate it looks like a real domain (no typos like `.ai` vs `.app`). |
| 115 | |
| 116 | --- |
| 117 | |
| 118 | ## Phase 2: Creative Direction |
| 119 | |
| 120 | ### Duration & Theme |
| 121 | |
| 122 | ```json |
| 123 | { |
| 124 | "questions": [ |
| 125 | { |
| 126 | "question": "How long should the video be?", |
| 127 | "header": "Duration", |
| 128 | "options": [ |
| 129 | { "label": "30 seconds", "description": "Social ads, quick hooks" }, |
| 130 | { "label": "60 seconds", "description": "Standard promo, feature overview (Recommended)" }, |
| 131 | { "label": "90 seconds", "description": "Detailed walkthrough, multiple features" } |
| 132 | ], |
| 133 | "multiSelect": false |
| 134 | }, |
| 135 | { |
| 136 | "question": "Dark or light theme?", |
| 137 | "header": "Theme", |
| 138 | "options": [ |
| 139 | { "label": "Light mode", "description": "Clean, bright, professional" }, |
| 140 | { "label": "Dark mode", "description": "Modern, bold, dramatic" } |
| 141 | ], |
| 142 | "multiSelect": false |
| 143 | } |
| 144 | ] |
| 145 | } |
| 146 | ``` |
| 147 | |
| 148 | ### Voice Selection |
| 149 | |
| 150 | ```json |
| 151 | { |
| 152 | "questions": [{ |
| 153 | "question": "What voice for the voiceover?", |
| 154 | "header": "Voice", |
| 155 | "options": [ |
| 156 | { "label": "Matilda", "description": "Warm, confident female — polished and versatile (Recommended)" }, |
| 157 | { "label": "Rache |