video/SKILL.md
Remotion video create, render, preview. Triggers: video, Remotion, animation, mp4, render video, slides to video.
npx skillsauth add lidge-jun/cli-jaw-skills videoInstall 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.
JSON-driven timeline rendering with Remotion. Create, render, preview, and review videos. Triggers: "video", "Remotion", "animation", "mp4", "render video", "slides to video". Covers: JSON-driven timeline, theme system, resolution presets, TTS narration, render pipeline, FFmpeg processing, final polish.
| Task | Command |
| -------------- | ------------------------------------------------------------------------------------ |
| Render | node scripts/pipeline.mjs --timeline <path> [--preset Landscape-1080p] |
| Render+TTS | node scripts/pipeline.mjs --timeline timeline.draft.json (auto-detects narration) |
| Skip TTS | node scripts/pipeline.mjs --timeline timeline.draft.json --skip-tts |
| TTS only | node scripts/tts.mjs --batch timeline.draft.json [--provider supertone] |
| TTS single | node scripts/tts.mjs --text "Hello" --output /tmp/tts-out.m4a [--provider gemini] |
| TTS voices | node scripts/tts.mjs --list-voices [--provider supertone] |
| Async | node scripts/pipeline.mjs --timeline <path> --async |
| Status | node scripts/pipeline.mjs --status /tmp/remotion-render/render-result.json |
| Preview | cd remotion-project && pnpm exec remotion studio |
| Validate | node scripts/validate-artifact.mjs /tmp/remotion-render/TimelineVideo.mp4 --preset Landscape-1080p |
Output goes to /tmp/remotion-render by default. Keep render output outside skills_ref/video/ — that directory is source code, not workspace.
# Sync (default) — blocks until render complete
node skills_ref/video/scripts/pipeline.mjs \
--timeline timeline.json \
--output /tmp/remotion-render
# With preset override (timeline.meta.preset is the source of truth)
node skills_ref/video/scripts/pipeline.mjs \
--timeline timeline.json \
--preset Portrait-1080p
# Async — returns immediately, renders in background
node skills_ref/video/scripts/pipeline.mjs \
--timeline timeline.json \
--async
# Check async status
node skills_ref/video/scripts/pipeline.mjs \
--status /tmp/remotion-render/render-result.json
timeline.meta.preset is the source of truth for resolution. CLI --preset overrides it with a warning.
Refer to the project's timeline schema TypeScript interface for the full type definition.
{
"meta": {
"title": "My Video",
"preset": "Landscape-1080p",
"fps": 30,
"totalDurationSec": 15
},
"elements": [
{
"type": "title",
"startSec": 0,
"durationSec": 5,
"props": { "title": "Hello World", "subtitle": "A demo" },
"transition": { "type": "fade" }
},
{
"type": "content",
"startSec": 5,
"durationSec": 5,
"props": { "header": "Key Points", "bulletPoints": ["Fast", "Safe", "Beautiful"] },
"transition": { "type": "slide", "direction": "from-right" }
},
{
"type": "code",
"startSec": 10,
"durationSec": 5,
"props": { "code": "const x = 42;", "language": "typescript", "title": "Example" },
"transition": { "type": "fade" }
}
],
"audio": []
}
meta.theme)Each video should define a unique aesthetic. Uses @remotion/google-fonts for cross-platform rendering.
Default: Chakra Petch (display) + Outfit (body) + JetBrains Mono (code), dark blue + cyan accent.
{
"meta": {
"theme": {
"aesthetic": "brutalist tech",
"font": { "display": "Chakra Petch", "body": "Outfit" },
"color": { "accent": "#FF6B35", "bg": "#0A0A0A" },
"gradient": { "hero": "radial-gradient(circle at 20% 30%, rgba(255,107,53,0.2) 0%, transparent 60%)" }
}
}
}
Do:
Avoid:
The canvas is large (1920×1080 or 1080×1920). Sparse content creates dead space. Add more content blocks — not bigger fonts or more padding.
content + bulletPoints together; 4-5 bullets portrait, 3-4 landscapeDetailed anti-slop rules, per-slide-type layout guidelines, motion principles, and typography specs → reference/visual-quality.md
content + bulletPoints together on every content slideThree providers available. Default: Gemini.
| Provider | ID | Default Voice | Strengths | Env Key |
| ---------------- | ------------ | ------------- | -------------------------------------- | ------------------- |
| Gemini | gemini | Kore | 30 voices, tone via prompt | GEMINI_API_KEY |
| Supertone | supertone | Andrew | 6 emotion styles, Korean-best | SUPERTONE_API_KEY |
| Supertonic | supertonic | M1 | 0.22s gen, free, offline | none |
timeline.draft.json with narration + optional voiceControl per elementtimeline.final.json with audio[] entries + corrected durationSec{
"elements": [
{
"id": "intro",
"type": "title",
"durationSec": 11,
"narration": "Welcome to the analysis report.",
"voiceControl": { "tonePrompt": "Calm, professional news anchor tone" },
"props": { "title": "Tech Trends", "subtitle": "2026 Edition" }
}
]
}
Math.ceil(narration.length / 6.5) + 0.5durationSec auto-corrected by ffprobe measurementFull TTS details (auth paths, priority chain, voiceControl fields, caching, audio path contract) → reference/tts-integration.md
| Component | Props | Use For |
| ----------------- | ------------------------------------------------------- | -------------------- |
| TitleSlide | title, subtitle, animation? | Opening/closing |
| ContentSlide | header, content, bulletPoints, animation? | Body content |
| CodeSlide | code, language, title, animation? | Code demos |
| DiagramSlide | src, title, caption, fit, animation? | Images/diagrams |
| StatSlide | title, stats[] (value/suffix/label/trend/decimals) | KPI / count-up |
| QuoteSlide | quote, author?, source? | Quotes |
| ComparisonSlide | title, left{label,items,accent}, right{…} | Side-by-side compare |
| VideoSlide | src, title?, startFrom?, playbackRate?, loop? | Inline video |
| GifSlide | src, title?, fit? | Animated GIF |
| LottieSlide | src, title? | Lottie animation |
| ChartSlide | chartType, title, data{labels,datasets} | Bar/pie/line chart |
| Caption | text, position, designTheme? | Timed subtitles |
meta.theme.cardanimation: { enter: "scale-in", exit: "fade-out" } per element. Enter: scale-in, fade-in, slide-up, none. Exit: scale-out, slide-down, fade-out, nonetiming: "spring". Slide/wipe accept directionNotoSansKR, Outfit, sans-seriffadeInSec/fadeOutSec, loop, trimStartSecFull component details → reference/components.md
| Preset | Width | Height | Aspect | Use For |
| ----------------- | ----- | ------ | ------ | ------------------- |
| Landscape-720p | 1280 | 720 | 16:9 | Draft/preview |
| Landscape-1080p | 1920 | 1080 | 16:9 | Standard delivery |
| Portrait-1080p | 1080 | 1920 | 9:16 | TikTok/Reels/Shorts |
| Square-1080p | 1080 | 1080 | 1:1 | Instagram/LinkedIn |
Default: Landscape-1080p. Agent picks based on user keywords (reels/shorts → Portrait).
FFmpeg handles deterministic cuts, batch processing, and preprocessing outside of Remotion.
ffmpeg -i raw.mp4 -ss 00:12:30 -to 00:15:45 -c copy segment_01.mp4
#!/bin/bash
# cuts.txt format: start,end,label
while IFS=, read -r start end label; do
ffmpeg -i raw.mp4 -ss "$start" -to "$end" -c copy "segments/${label}.mp4"
done < cuts.txt
for f in segments/*.mp4; do echo "file '$f'"; done > concat.txt
ffmpeg -f concat -safe 0 -i concat.txt -c copy assembled.mp4
ffmpeg -i raw.mp4 -vf "scale=960:-2" -c:v libx264 -preset ultrafast -crf 28 proxy.mp4
ffmpeg -i raw.mp4 -vn -acodec pcm_s16le -ar 16000 audio.wav
ffmpeg -i segment.mp4 -af loudnorm=I=-16:TP=-1.5:LRA=11 -c:v copy normalized.mp4
# Detect scene changes (threshold 0.3 = moderate sensitivity)
ffmpeg -i input.mp4 -vf "select='gt(scene,0.3)',showinfo" -vsync vfr -f null - 2>&1 | grep showinfo
ffmpeg -i input.mp4 -af silencedetect=noise=-30dB:d=2 -f null - 2>&1 | grep silence
# 16:9 → 9:16 (center crop for TikTok/Reels)
ffmpeg -i input.mp4 -vf "crop=ih*9/16:ih,scale=1080:1920" vertical.mp4
# 16:9 → 1:1 (center crop for Instagram)
ffmpeg -i input.mp4 -vf "crop=ih:ih,scale=1080:1080" square.mp4
For professional voiceover outside the Remotion TTS pipeline, ElevenLabs is available via direct API:
import os, requests
resp = requests.post(
f"https://api.elevenlabs.io/v1/text-to-speech/<voice_id>",
headers={
"xi-api-key": os.environ["ELEVENLABS_API_KEY"],
"Content-Type": "application/json"
},
json={
"text": "Your narration text here",
"model_id": "eleven_turbo_v2_5",
"voice_settings": {"stability": 0.5, "similarity_boost": 0.75}
}
)
with open("voiceover.mp3", "wb") as f:
f.write(resp.content)
Use when: high-fidelity English narration, voice cloning, or emotion control beyond what Gemini/Supertone provide. Requires ELEVENLABS_API_KEY.
For tasks that code-driven rendering handles poorly — use a traditional editor as the last mile:
AI clears repetitive work. Final creative taste lives in this layer.
All 3 gates pass for a render to be considered successful.
| Gate | Checks | Role |
| :----------- | :-------------------------------------- | :-------------- |
| 1. Policy | No forbidden engine in logs | Supplementary |
| 2. Execution | remotion render exit 0 | Primary |
| 3. Artifact | ffprobe duration/codec/resolution valid | Final truth |
node scripts/validate-artifact.mjs /tmp/remotion-render/TimelineVideo.mp4 --preset Landscape-1080p
~/.remotion/node_modules/. Run setup-remotion.sh onceremotion browser ensure (via ensure-remotion.mjs)GEMINI_API_KEY for Gemini; SUPERTONE_API_KEY for Supertone; none for Supertonicnode scripts/ensure-remotion.mjs before first rendergcloud auth application-default login or set GOOGLE_APPLICATION_CREDENTIALSskills_ref/video/
├── SKILL.md
├── reference/ ← visual-quality.md, tts-integration.md, components.md
├── scripts/
│ ├── pipeline.mjs ← CLI entrypoint (sync/async/TTS)
│ ├── tts.mjs ← TTS orchestrator (multi-provider)
│ ├── tts-providers/ ← gemini.mjs, supertone.mjs, supertonic.mjs
│ ├── ensure-remotion.mjs ← runtime bootstrap
│ ├── validate-artifact.mjs ← Gate 3: ffprobe validation
│ └── presets.mjs ← resolution presets (ESM)
└── remotion-project/
├── public/example-timeline.json
└── src/
├── components/ ← 11 slide components + barrel
└── timeline/ ← JSON→React engine
development
Goal execution guidelines with PABCD integration, verification tiers, documentation workflow, and AI-driven planning
tools
A CLI tool for making authenticated requests to the X (Twitter) API. Use this skill when you need to post tweets, reply, quote, search, read posts, manage followers, send DMs, upload media, or interact with any X API v2 endpoint.
development
Use this skill any time a spreadsheet file is the primary input or output (.xlsx, .xlsm, .csv, .tsv). This includes: creating, reading, editing, analyzing, or formatting spreadsheets; cleaning messy tabular data; converting between formats; and data visualization with charts. Also use for pandas-based data analysis when the deliverable is a spreadsheet. Do NOT trigger when the primary deliverable is a Word document, HTML report, standalone Python script, database pipeline, or Google Sheets API integration.
tools
Use this skill when the user wants to build a financial model, 3-statement model, DCF valuation, cap table, scenario analysis, or financial projections in Excel. Trigger on: 'financial model', '3-statement model', 'DCF', 'cap table', 'pro forma', 'projections', 'sensitivity analysis', 'waterfall', 'debt schedule', 'break-even', 'discounted cash flow', 'capitalization table', 'fundraising model', 'WACC calculation', 'scenario analysis model'. Input is a text prompt with assumptions. Output is a single .xlsx file with formula-driven, interconnected statement sheets.