skills/highlight-reel/SKILL.md
Creates a compact highlight reel video from multiple demo/screen recording videos using Remotion. Composites clips with section title cards, typewriter prompt captions, insight labels, transitions, music, and a branded poster frame. Use when user asks to create a "highlight reel", "demo video", "sizzle reel", "recap video", or "product video" from screen recordings.
npx skillsauth add paolomoz/skills highlight-reelInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Creates a polished, compact highlight reel from multiple screen recording videos using Remotion (React-based video framework). The output is a branded MP4 with section titles, typewriter prompt captions, insight labels, smooth transitions, background music, and an embedded thumbnail for Slack/social sharing.
Source videos + timestamps + prompts
→ Remotion project setup (if needed)
→ Composition config (clips, speeds, labels, prompts)
→ Component scaffold (poster, titles, captions, transitions)
→ Preview in Remotion Studio
→ Render to MP4 with embedded thumbnail
/highlight-reel
/highlight-reel path/to/video1.mov path/to/video2.mov
Gather the following from the user before building:
ffprobe on each to get resolution, duration, and FPSFor each video, ask the user for:
For each video, the user provides 2-6 key moments:
0:00-0:17)For clips where the user types a prompt/command, ask for the exact prompt text. This will be displayed as a typewriter caption overlay. If possible, ask the user for screenshots of the prompts.
music.mp3 is available in video/public/Each clip needs:
| Field | Type | Description |
|-------|------|-------------|
| startSec | number | Start time in source video (seconds) |
| endSec | number | End time in source video (seconds) |
| speed | number | Playback rate (1.0 = normal, 2.0 = 2x fast) |
| label | string? | Insight text for result clips (white text, pill badge) |
| prompt | string? | User prompt text for typewriter caption (replaces label) |
Speed guidelines:
1.0-1.5x — slower so viewers can read2.0-2.5x — fast to show speed1.5-2.0x — moderate pacePrompt text guidelines:
video/
├── public/
│ ├── uc1.mov, uc2.mov, ... # Source videos
│ └── music.mp3 # Background music
├── src/
│ ├── Root.tsx # Registers all compositions
│ ├── HighlightReel.tsx # Main composition (config-driven)
│ ├── components/
│ │ ├── Poster.tsx # Static frame 0 (thumbnail/social)
│ │ ├── SectionTitle.tsx # Animated section title card
│ │ ├── SectionBadge.tsx # Persistent top-left section indicator
│ │ ├── InsightLabel.tsx # Result caption (bold white pill)
│ │ ├── PromptCaption.tsx # Typewriter prompt overlay
│ │ ├── VideoFrame.tsx # Rounded corners + glow (no browser chrome)
│ │ ├── ClipCrossfade.tsx # Dark dip between non-contiguous clips
│ │ └── SceneTransition.tsx # Gradient wipe between sections
│ └── scenes/
│ ├── LogoReveal.tsx # Animated intro
│ └── CTAFinale.tsx # Closing CTA
├── package.json
└── tsconfig.json
No BrowserFrame wrapper — Screen recordings already contain browser chrome. Wrapping in a fake browser creates a distracting browser-inside-browser effect. Use VideoFrame (rounded corners + gradient glow) instead.
Poster component at frame 0 — The first frame MUST be visually rich (logo, title, particles). Frame 0 is used as the thumbnail by Slack, QuickTime, and social platforms. A black/empty first frame looks terrible when shared.
Typewriter prompt captions — When the user types a prompt in the recording, overlay a PromptCaption component that types out the text in sync. This ensures readability even at sped-up playback. Include a "PROMPT" label with sparkle icon and blinking cursor.
Prompt hold time — After a prompt finishes typing, hold the video for ~1.3 seconds (40 frames at 30fps) so viewers can read the full text. The video freezes on the last frame during this hold.
Bold insight labels — Use white text (not gradient) on a high-contrast dark backdrop with glow. Font size 28px, weight 700. Gradient text looks subtle at video scale and is hard to read.
Persistent section badge — A small badge in the top-left (e.g., "01 Prompt to Website") stays visible across all clips in a section, providing context when jumping between non-contiguous clips.
Crossfade between clips — When jumping between non-contiguous timestamps within the same video, add a brief (0.4s) dark dip crossfade. This signals a time skip without being jarring.
Section title cards — Show for ~1.9 seconds (56 frames). Shorter is too fast to read; longer wastes time in a compact reel.
Source video FPS matters — Screen recordings are often 60fps. The startFrom prop on <OffthreadVideo> uses the source video's frame rate, so convert seconds to frames using SOURCE_FPS, not the composition's FPS.
Embedded thumbnail — After rendering, use ffmpeg to embed the first frame as an MP4 thumbnail for maximum compatibility:
ffmpeg -y -i output.mp4 -vframes 1 -q:v 2 /tmp/thumb.jpg
ffmpeg -y -i output.mp4 -i /tmp/thumb.jpg -map 0 -map 1 -c copy -c:v:1 mjpeg -disposition:v:1 attached_pic output-final.mp4
[Poster+LogoReveal 2.8s]
→ [Section 1 Title 1.9s] → [Clips...] → [Transition 0.8s]
→ [Section 2 Title 1.9s] → [Clips...] → [Transition 0.8s]
→ ...
→ [Section N Title 1.9s] → [Clips...]
→ [Transition 0.8s] → [CTA Finale 5s]
Timing budget for 60-70s target:
If total exceeds target, increase playback speeds on non-prompt clips.
COLORS = {
dark: "#0A0A12",
darkBlue: "#0D0F2B",
cyan: "#8AD5FF",
indigo: "#7A6AFD",
fuchsia: "#EC69FF",
white: "#FFFFFF",
}
GRADIENT = "linear-gradient(135deg, #8AD5FF 0%, #7A6AFD 50%, #EC69FF 100%)"
FONT = "SF Pro Display, -apple-system, sans-serif"
Adjust brand tokens to match the product being demoed.
| Constant | Value | Description |
|----------|-------|-------------|
| FPS | 30 | Composition frame rate |
| SOURCE_FPS | 60 | Source video frame rate (check with ffprobe) |
| TITLE_DURATION | 56 frames | Section title card duration (~1.9s) |
| TRANSITION_DURATION | 24 frames | Wipe transition duration (~0.8s) |
| TRANSITION_OVERLAP | 20 frames | Overlap for seamless transitions |
| CROSSFADE_DURATION | 12 frames | Dark dip between clips (~0.4s) |
| PROMPT_HOLD_FRAMES | 40 frames | Extra hold after prompt typing (~1.3s) |
ffprobe on each to get dimensions, duration, FPSIf no existing Remotion project:
mkdir -p video/public video/src/components video/src/scenes video/out
cd video && npm init -y
npm install remotion @remotion/cli @remotion/player react react-dom
npm install -D @types/react typescript
If existing project, reuse it.
cp /path/to/video1.mov video/public/uc1.mov
cp /path/to/video2.mov video/public/uc2.mov
# etc.
Create all components from references/components.md template, adapting brand tokens as needed:
Poster.tsx — static poster for frame 0SectionTitle.tsx — animated section title cardSectionBadge.tsx — persistent section indicatorInsightLabel.tsx — bold result captionPromptCaption.tsx — typewriter prompt overlayVideoFrame.tsx — rounded video frame with glowClipCrossfade.tsx — dark dip transitionSceneTransition.tsx — gradient wipeLogoReveal.tsx — animated introCTAFinale.tsx — closing screenCreate the main composition file with:
SECTIONS config array with all clips, prompts, labels, speedsRegister in Root.tsx and add render script to package.json.
cd video && npx remotion studio
Common adjustments:
PROMPT_HOLD_FRAMEScd video && npx remotion render CompositionId out/highlight-reel.mp4 --codec h264
Extract frame 0 and embed as MP4 thumbnail for Slack/social:
ffmpeg -y -i out/highlight-reel.mp4 -vframes 1 -q:v 2 /tmp/thumb.jpg
ffmpeg -y -i out/highlight-reel.mp4 -i /tmp/thumb.jpg \
-map 0 -map 1 -c copy -c:v:1 mjpeg \
-disposition:v:1 attached_pic out/highlight-reel-final.mp4
mv out/highlight-reel-final.mp4 out/highlight-reel.mp4
open -a "QuickTime Player" out/highlight-reel.mp4
Verify: thumbnail shows in QuickTime/Finder, video plays smoothly, captions are readable.
| Tool | Purpose | Install |
|------|---------|---------|
| remotion | React-based video framework | npm install remotion @remotion/cli |
| ffmpeg | Thumbnail embedding, video probing | brew install ffmpeg |
| ffprobe | Source video analysis | Included with ffmpeg |
references/components.md — Full source code for all Remotion componentsdevelopment
Generate artistic infographics from any topic. Runs the Sumi pipeline (analyze → structure → craft prompt → generate image) entirely within Claude Code. Use when "generate infographic", "create infographic", "sumi", "make an infographic about", or "visualize topic".
tools
Implement Server-Sent Events streaming from Cloudflare Workers to browser clients with reconnection, state persistence, and progress tracking. Use when building "SSE streaming", "real-time updates", "server push", or "event streaming".
development
Audit websites by cross-referencing query indexes, sitemaps, and navigation to identify content gaps, stale pages, missing metadata, and quality issues. Use when "auditing a website", "finding content gaps", "site quality audit", or "content inventory analysis".
data-ai
Track user session context across multi-turn interactions using browser sessionStorage and server-side KV caching with TTL. Use when implementing "session tracking", "conversation context", "multi-turn sessions", or "user journey tracking".