# Remotion Promotional Videos Implementation Plan > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** Build three promotional videos for SnapOtter (X launch, product demo, promo teaser) using Remotion in the existing `apps/videos/` workspace. **Architecture:** Extends the existing `apps/videos/` workspace with new shared components and three multi-scene compositions. Each scene is a self-contained React component receiving relative frames (0 to durationInFrames) via Remotion's `Series`. Background layers (grain, gradient mesh) live at the composition level. **Tech Stack:** Remotion v4, React 18, TypeScript, Tailwind CSS v3 (Webpack compat), `@remotion/motion-blur`, `@remotion/paths` **Spec:** `docs/superpowers/specs/2026-05-08-remotion-promo-videos-design.md` **Existing codebase patterns (follow these exactly):** - Path alias: `@/*` maps to `./src/*` - All styling is inline `style` objects (not Tailwind classes) - Design system imports: `@/lib/colors` (COLOR), `@/lib/fonts` (FONT, TEXT), `@/lib/motion` (EASE, SPRING, TIMING) - Components use `useCurrentFrame()` + `interpolate()` from `remotion` - `AbsoluteFill` for full-frame positioning - `staticFile()` for `public/` assets - `Img` from `remotion` for images - Logo asset: `staticFile("logo.png")` (PNG, not SVG) - Tool data: `@/lib/tools` (TOOLS array, getToolsByCategory) **Verification approach:** Remotion is visual -- there are no unit tests. Every task ends with "Open Remotion Studio (`pnpm --filter @snapotter/videos dev`), select the composition, scrub the timeline, verify the animation looks correct." This IS the test. --- ### Task 1: Audio Infrastructure **Files:** - Modify: `apps/videos/package.json` - Create: `apps/videos/src/lib/audio.tsx` The Audio component in Remotion v4 is imported from `@remotion/media`. We need to add this dependency and create a reusable BackgroundMusic component. - [ ] **Step 1: Add @remotion/media dependency** ```bash cd apps/videos && pnpm add @remotion/media ``` - [ ] **Step 2: Create the BackgroundMusic component** Create `apps/videos/src/lib/audio.tsx`: ```tsx import type React from "react"; import { Audio } from "@remotion/media"; import { interpolate, staticFile, useCurrentFrame } from "remotion"; export const BackgroundMusic: React.FC<{ src?: string; volume?: number; fadeInFrames?: number; fadeOutFrames?: number; totalFrames: number; }> = ({ src, volume = 0.4, fadeInFrames = 30, fadeOutFrames = 60, totalFrames, }) => { const frame = useCurrentFrame(); if (!src) return null; const vol = interpolate( frame, [0, fadeInFrames, totalFrames - fadeOutFrames, totalFrames], [0, volume, volume, 0], { extrapolateLeft: "clamp", extrapolateRight: "clamp" }, ); return