Communitygithub.com

Video Design Skill

Generates MP4 videos using Remotion based on the video design system (DESIGN.md). Use this skill whenever the user requests video generation, rendering, or MP4 output after a remotion-consult or obtaining DESIGN.md. Caption-driven with .srt precise frame alignment, effects from the shared library, and assets routed across harnesses. Default to reporting only without altering design direction.

What is Video Design Skill?

This skill, named 'pj1433139082-hue/video-design-skills', is designed for AI coding agents like Claude Code, Cursor, or Codex to programmatically produce MP4 videos using the Remotion framework. It strictly follows a DESIGN.md file (produced by a prior remotion-consult step) and is activated only when the user explicitly mentions generating, rendering, or creating a video or MP4 after that consultation. The core workflow is caption-driven: it parses .srt subtitle files, aligns each caption to exact video frames via mathematical rounding (e.g., `startFrame = Math.round((startMs/1000)*fps)`), and uses React components to compose scenes. Effects are imported from a centralized motion library, and media assets are routed across harnesses (e.g., image generation, user-provided images). The skill supports two render backends: Remotion (default) for complex React animations, and HyperFrames for HTML/GSAP-based effects. Before building, it enforces a mandatory alignment phase using 'grill-me' to define acceptance criteria across structure, visual, content, and technical dimensions. The build process includes TTS-driven audio generation, frame budget pre-checks to prevent cut-off keyframe animations, and a multi-layer verification step (still frame extraction, contrast checks, WCAG compliance, motion presence, and anti-slop guidelines) to ensure quality. It defaults to reporting only without changing design direction, emphasizing precision, consistency, and avoidance of common AI video pitfalls.

Works with✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/pj1433139082-hue/video-design-skills/tree/HEAD/skills/remotion-build

Ask in your favorite AI

Open a new chat with this agent skill pre-loaded.

Documentation

remotion-build — Generate Remotion Videos

Use React code from DESIGN.md (produced by remotion-consult) to generate an MP4. Subtitles are the sole timeline, animations are imported from the master animation library, and assets use cross-harness routes.

Workflow

Step 0 — Mode Selection (Choose One of Four, Decide Before Acting)

  1. By Category Template: User wants a predefined style, or picks from the four categories in remotion-shared/categories/ (voiceover subtitles / data visualization / product demo / brand animation) → Read that category's DESIGN.template.md + motion-list.md, inherit the design system, only change content and subtitles.
  2. By Reference: User provides a reference video (highest priority) or picks from remotion-shared/video-real-library.md → Deconstruct its subtitle style / transitions / rhythm, recreate using components from the master animation library.
  3. Free Design: No reference, no template → Only avoid the reverse prompt words in video-anti-slop.md.
  4. By Existing DESIGN (consult output): Consult has already set the DESIGN + style samples approved → Strictly follow DESIGN tokens/§8, do not re-ask about style direction (Step 0.5 only aligns acceptance criteria, does not repeat Phase 1 clarification). If unsure, list options for the user.

Render Engine Binary Choice (Fifth Dimension, marked in DESIGN): In addition to the four modes above, decide on the render backend (this skill defaults to the Remotion engine; only if DESIGN specifies or user requests, use the HyperFrames engine):

  • Remotion Engine (Default): React complex animations / shotcraft shot cards / src/ layering + Sequence + useCurrentFrame. Use when maximum animation freedom is needed.
  • HyperFrames Engine (HeyGen open-source HTML→MP4, optional): index.html data attributes + GSAP timeline (npx hyperframes init/render, free locally) → closer to web development feel, built-in npm run check (lint + contrast + motion). Assets/BGM/subtitles/acceptance all reuse, only the rendering method changes. Rules see references/hyperframes-guide.md.
  • Decision: Complex shot cards (flip cards/particles/3D) or existing Remotion project → Remotion; Pure HTML/GSAP animations, desire web feel, need built-in lint → HyperFrames. Do NOT mix the two engines in the same project.

Step 0.5 — Requirement Alignment + Acceptance Criteria (grill-me, Mandatory, ≤10 Rounds)

Run the grill-me skill to align: one-sentence requirement, aspect ratio / duration / platform, subtitle source (.srt/.vtt/script from scratch), mode, style direction. Must produce acceptance criteria in four categories:

  • Structure: Category / Aspect ratio / Duration / fps
  • Visual: Subtitle font / Color scheme / Composition consistent with DESIGN.md or reference (for Free Design: "no AI feel")
  • Content: All subtitle sentences present, no typos, timestamps cover the entire video, authentic copy
  • Technical: Subtitles frame-aligned (subtitles exist at sentence start/end frames), still frame extraction passes, MP4 render successful

If not aligned after 10 rounds → Record unresolved items and proceed with the build with known issues.

Step 1 — Subtitle-Driven Process (Core)

Follow references/captions-guide.md:

  1. Source Routing: Existing .srt/.vtt → Use directly; Has script .md → Draft a rough .srt; From scratch → First draft a script, then .srt.
  2. parseSrt({input}) → Caption[], validate empty segments / time overlap / out-of-bounds.
  3. Frame Alignment: startFrame = Math.round((startMs/1000)*fps), endFrame = Math.round((endMs/1000)*fps), each sentence as <Sequence from={startFrame} durationInFrames={endFrame-startFrame}>.
  4. Word-level/Sentence-level Highlighting: createTikTokStyleCaptions → CaptionLayer component; For Chinese, a single token per whole sentence → degrade to sentence-level (decision based on DESIGN.md highlightMode).
  5. Screen rhythm is bound to subtitle sentence start times; Full video durationInFrames = round(max(endMs)/1000*fps) + trailing.
  6. After modifying words, write back with serializeSrt.

Step 1.5 — Voiceover-Driven srt Reconstruction (Timing Assumption Truly Activated, Voiceover Before Frame Extraction)

For voiceover videos, voiceover is a mandatory process (no need to ask the user): TTS generation → ffprobe actual measurement → rebuild srt to finalize timeline, the timing is based on the actual TTS measurement (DESIGN §4 timing assumption truly activated). Voiceover before frame extraction — prevents Step 1 srt alignment from being overturned by voiceover reconstruction, making previous steps wasted.

  1. python scripts/media/tts_gen.py --provider edge-tts --lines lines.txt --save-dir public/audio/ --voice <voice> (defaults to a keyless fallback; when MiniMax is available, explicitly switch to --provider minimax, for domestic cloud TTS see mmx-media-pipeline.md §2).
  2. ffprobe actual duration per sentence (ffprobe -show_entries format=duration), with 0.8s breathing gap between sentences.
  3. Rebuild srt (rebuild_srt.py): Each sentence's start/end = cumulative actual duration + breathing gap; write to public/captions.srt.
  4. Root SHOTS frame intervals updated according to the new srt (round(ms/1000*fps)), each Sequence mounts <Audio src={staticFile("audio/s{n}.mp3")}>.
  5. BGM: When AI music generation is not needed, obtain from the project's licensed asset library; when needed based on prompt, default to local generation with ACE-Step, with cloud music backend as an optional alternative. After obtaining, trim to full length (ffmpeg -t video seconds), lower volume so it doesn't overpower voiceover (0.22-0.3).
  6. Scene Frame Budget + Pre-Timing Check (Prevent "Key Animation Not Appearing", Tested 3 Times): The to-from of each sentence output by rebuild_srt is the frame budget for that scene. Before writing shot cards / data animations, verify: the last keyframe inside the card ≤ scene budget, otherwise compress the card's timing (don't wait until acceptance to discover this) —
    • Short sentences (2-3s≈60-90f): Stamp/scan circle/periodic lighting etc. tail animations most likely exceed budget (S2 red stamp originally 70-88f exceeded 68f budget → compressed to 55-65f; S6 periodic lighting originally 46-70 exceeded 70f budget → compressed to 46-64; S9 5 circles scan originally 136f exceeded 128f budget → compressed to 108f).
    • Rule: Card last keyframe = start + cascade total length + tail hold, must be ≤ sentence budget; if exceeded, proportionally compress stagger/single animation duration, keep tail hold ≥4f.

Step 2 — Find References

User-provided reference is highest priority → video-real-library.md → Free design. With reference, use "deconstruction animation method" (reference → combine master animation library components, see motion-patterns-video.md).

Step 3 — Reverse Prompt Words (Video Version Condensed, Only Hard Constraint)

  • Do not use the same subtitle rhythm throughout (every sentence same length, word-level highlighting flashing indiscriminately)
  • Do not center the composition in every scene, do not use only fades or only hard cuts throughout
  • Do not cut scenes evenly (cut every N seconds = no breathing feel)
  • Do not default to purple-indigo gradient backgrounds, do not use cliché AI fonts
  • Do not use empty voiceover subtitles ("Welcome to watch", "Let's start")
  • Animations must be present: At least an entrance animation per scene + a transition between scenes
  • That's it.

Step 4 — Build (Technical Baseline)

Follow references/remotion-build-guide.md:

  • Project init: Copy skeleton from _dev/remotion-tutorial + npm i @remotion/captions@<aligned version> + keep Chrome path.
  • Import components from the master animation library (Workspace/Video/_AnimationLibrary/) or copy to src/components/.
  • Shot card optional integration: If DESIGN §8.2 selects cards, follow the "Shot Card Integration Steps" in remotion-shared/video-shots-spec.md (including [copy]/[borrow idea] intent markers); Chinese videos default to borrowing ideas.
  • src layering: Root.tsx / theme.ts / captions.ts / components/.
  • Deterministic animations (useCurrentFrame/interpolate/spring, forbid Math.random and browser timers).
  • If DESIGN.md exists, strictly follow tokens.
  • Assets follow references/video-image-spec.md cross-harness routing (Codex image_gen / GPT prompt round-trip / user-provided images).
  • Asset generation post-check outline (mandatory): After generating assets, verify against DESIGN §8 outline sentence by sentence — ① Does the image match the sentence semantics/layout (vision evaluation of fit, <7 regenerate or adjust prompt) ② Do large keyword graphics coordinate with the scene image without obstruction ③ Is the layer z-order consistent with the outline design. Non-compliance → adjust keywords or regenerate assets, do not "generate and use"; select the best among multiple candidates for each screen element.

Step 5 — Acceptance Closure (grill-me Node Table)

NodeTriggerMax RoundsExit Condition
StartStep 0.510 roundsAcceptance criteria finalized
ModifyUser requests change5 rounds/instanceWhat to change is clear, each round checks against acceptance criteria
FinalBefore delivery4 roundsAcceptance criteria checked item by item

Hard Acceptance Actions (Frame Extraction Before Rendering, Prevent Long Render Waste): Layered Quantification (4 Layers, Proven on Keyframes at Sentence Start/Middle/0.82 End State in DESIGN §8.2) :

  • Layer 1 Background Image (scene image itself): python scripts/media/layout_calc.py <scene image> — composition/whitespace/suggested text area (find empty areas based on image whitespace structure, do not force top area to be pristine; if top area is invaded → move text to text_zone suggested area, or regenerate a cleaner image);
  • Layer 2 Background Image + Text (still with text): layout_calc text placement + frame_judge --subtitle-hex true WCAG contrast (large text≥3.0/body text≥4.5);
  • Layer 3 + Animation (consecutive frames): Frame difference/consecutive frames vision judge animation truly happening + animation does not overlap with scene image (card is a complete screen, not overlaid on scene image, visual mode see §8.2);
  • Layer 4 Overall (final video): frame_judge full video + audio_sync_check.py audio-video sync + occlusion check + four-skill scoring + action proof.
  1. npx remotion compositions confirm correct id;
  2. Extract 3-5 still frames (sentence start/end/transition frames) — extract "end state frames" not mid-animation frames (lesson learned 2026-08-17): Select frames after animation completion (0.82 end state / after tail hold), do not extract frames mid-animation — mid-animation frames cause vision/human eyes to misjudge as "missing/static/black frame" (S2 flip card mid-way no red stamp, S6 odometer rolling mid-way no periodic point, S7 timeline mid-way no portrait card = wrong extraction timing, extract end state frames instead). Subtitles exist and are aligned, composition intact;
  3. Subtitle alignment verification: Subtitle present at sentence start frame, not vanished early at sentence end frame;
  4. Automated hard metric judgement: After frame extraction, run python scripts/media/frame_judge.py preview/*.png --subtitle-hex <DESIGN subtitle color, e.g., E8833A> --subtitle-threshold 3.0 --text-bg-hex <text capsule background, e.g., F2F0EB> (use --text-region when text is in a corner, pass actual position tl/tr/bl/br/center, to prevent false bottom area alarms; use --text-bg-hex when capsule background is known to directly calculate subtitle vs background true contrast, skip mode calculation — mode captures scene color, inaccurate when text overlaps scene; large text threshold 3.0 / body text 4.5; any FAIL triggers revision); optionally pip install iqa-pytorch then add NIMA aesthetic score (>6.5 recorded as reference grade); metric thresholds see references/video-quality-metrics.md; dark design brightness FAIL does not block (see dark design explanation in metrics, contrast is the standard);
  5. Check each extracted still against checklist (score <3 triggers revision):
    • Composition: ≥2 visual elements, not centered in every scene, correct layer z-order (bg/mid/fg)
    • Subtitles: Present and aligned, legible (contrast ≥3:1), no broken characters
    • Transitions: Transitions/entrance animations between sentences, not bare cuts or static
    • Assets: No AI garbled text, layers match §8.1, transparent overlays clean
    • Animation: At least 2 animation types present per scene (asset entry/exit + font + background choose two out of three), background has animation
    • No AI feel: Check against video-anti-slop.md reverse prompt words
  6. Occlusion check + visual mode verification (inspired by paper-collage-video spatial-contract, expanded 2026-08-16): Verify extracted stills sentence by sentence — ① Large text capsule in reserved area (top whitespace) ② Main subject does not encroach on text/subtitle area ③ Foreground does not occlude mid/background subjects ④ Card animation does not overlap with scene image: Full-screen cards (odometer/dial/particle beam/focus dark field) must never be overlaid on a scene image (choose one of three visual modes, see DESIGN §8.2) ⑤ Animation meaning must match sentence semantics (vision judge what the particle beam/spotlight/digit scrolling expresses in that scene, whether it aligns with the voiceover text; unclear meaning triggers revision). Occlusion/unclear meaning → change visual mode or remove unnecessary card.
  7. Four-skill review hard gate (any gate not passed → revision, not reference): Executed by sub-agents independently (hallmark/taste executed by independent agents, not self-review by main model) —
    • taste-skill Pre-Flight (40+ taste checks)
    • hallmark audit (57 gates anti-AI slop)
    • ui-ux-pro-max (UX principles: readability/hierarchy/consistency)
    • open-design/anti-ai-slop ("Seven Deadly Sins" de-templating) Review against extracted stills/final video, score by items passed (supplemented by reviewer, prevent self-review): hallmark 57 gates pass ≥90% (≥51 items) to proceed, taste 40+ items pass ≥85% to proceed, ui-ux-pro-max / open-design all key items pass; list failed items triggering revision, proceed to render only after all gates passed.
  8. npx remotion render <id> out/final.mp4;
  9. Action proof moments (inspired by paper-collage-video proof moments): According to DESIGN §8.2, for each sentence, extract proof moments (sentence start/middle/0.82 end state) + verify action types actually occurred (entrance has happened / continuous motion / end state static); ffmpeg -vf "fps=4" extract consecutive frames → vision judge actions occurred according to DESIGN — a single static frame of a translate animation ≠ action proof (particles/light beam/digits must be confirmed by consecutive frames); transitions smooth / entry-exit no jumps (video-quality-metrics §4.6);
  10. Audio-video sync check (main axis for voiceover videos, supplemented by reviewer): Run python scripts/media/audio_sync_check.py out/final.mp4 public/captions.srt on the final video — within ±0.15s of each srt sentence start, there should be voiceover audio (RMS≥0.01); silence at sentence start = voiceover misaligned/missing/end truncated → revision;
  11. Check acceptance criteria item by item → STATUS PASS/FAIL/BLOCKED, NEXT_OWNER.

Red Lines

  • Subtitle-driven is a hard constraint: If captions.srt exists, it is the sole source of the timeline; duration is derived from it.
  • Extract frames before rendering: Still frames not passed, do not render full video.
  • Shot card borrowing not mandatory: If DESIGN §8 selects a card, integrate it (copy shotcraft/demos/{category}/{card} and adapt); no selected card or borrowing ideas for Chinese videos does not count as omission; not integrating a card is not BLOCKED.
  • Assets use real image generation, do not generate SVGs: Primary assets prioritize Codex or configured image backend; transparent assets use --transparent/remove_white_bg.py.
  • Procedural data cards prioritize true copy of shotcraft full version, do not hand-write simplified SVGs (lesson learned 2026-08-17): Self-built data cards (dial/ring/odometer/chart) if hand-written as simplified SVGs (bare circle/line/path, no ticks/red zone/hub/glow details) will appear shoddy (S9 ring hand-drawn version mmx vision 3.5/10, true copy of shotcraft NeedleSweepSelftest full details scored 8.5/10). For data cards, always true copy the full version from shotcraft demos/data, typography (include all details: ticks/primary-secondary/glow/dial hub/pointer tail etc.), then reskin colors; only simple decorations (background light spots/base tracks) can be procedurally drawn.
  • Voiceover-driven srt reconstruction is mandatory (Step 1.5, voiceover before frame extraction): For voiceover videos, Step 1.5 MUST do TTS→ffprobe→rebuild srt to finalize timeline (timing based on actual TTS measurement, DESIGN §4), frame extraction and acceptance happen after voiceover reconstruction srt, do not ask the user.
  • Do not change design direction: Once DESIGN.md is set, follow it; if direction needs to change, go back to remotion-consult.
  • Forbid fabrication: Subtitles/data not fabricated.

Reference Files

FileWhen to Read
references/captions-guide.mdStep 1 Subtitle timestamp alignment (Core)
references/remotion-build-guide.mdStep 4 Engineering specifications
references/motion-patterns-video.mdStep 2/5 Animation implementation
references/video-image-spec.mdStep 4 Asset routing
references/codex-imagegen.mdStep 4 When assets use Codex
references/mmx-media-pipeline.mdStep 4 Media backend (MiniMax optional + TTS/BGM fallback chain + known pitfalls)
references/video-quality-metrics.mdStep 5 Automated metric thresholds (frame_judge.py + VMAF/NIMA/ASL thresholds)
references/hyperframes-guide.mdStep 0 When render engine=HyperFrames: HTML data attributes/GSAP/check rules + CLI
references/hyperframes-blocks.mdStep 0 When HyperFrames engine: select animation blocks, 154 registry blocks by category (equivalent to shotcraft)
.claude/skills/remotion-shared/video-anti-slop.mdStep 3 Reverse prompt baseline
.claude/skills/remotion-shared/video-tokens-spec.mdWhen writing theme.ts
.claude/skills/remotion-shared/categories/{category}/motion-list.mdSelecting animation combinations
.claude/skills/remotion-shared/video-shots-spec.mdShot card system + authoritative techniques (build time: copy from demos/{category}/{card} into project)
.claude/skills/remotion-shared/aesthetic-judgment/Step 5 Acceptance: six-axis judgment of photography/editing/front-end typography (<3 triggers revision)
.claude/skills/ui-ux-pro-max/SKILL.mdDesign rule engine: Step 4 Build time check UX principles + priority
.claude/skills/taste-skill/SKILL.mdStep 5 Final check: Pre-Flight 40+ items (self-check before delivery)
.claude/skills/hallmark/SKILL.mdStep 5 Design review: 57 gates / hallmark audit (before acceptance)
资料库/AI工具/design-skills/open-design/craft/anti-ai-slop.mdStep 3 De-templating rules ("Seven Deadly Sins") + 151 design system alternatives
.claude/skills/design-shared/review-panel.mdReview panel: agency-agents perspective + design system library/aesthetic reference library criteria (Step 5 Acceptance scoring)

Output and Wrap-up

STATUS: PASS | FAIL | BLOCKED
Output: out/final.mp4 path + preview/ extracted frames path
Acceptance Criteria: item by item Passed / Not Passed / Unresolved
NEXT_OWNER: user (view effect) | remotion-consult (change direction)
Pending: Unresolved items

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

Related Skills