Separates creative grammar (renderer_family) from technical engine (render_runtime) so HyperFrames can stand alongside Remotion as a first-class runtime instead of masquerading as a Remotion sub-case. Locks runtime choice at proposal stage and enforces it end-to-end: the schemas require it, video_compose routes by it, the reviewer fails closed on silent swaps, and a parametrized contract test walks every pipeline manifest to ensure each planning-stage skill explains the conversation to the user. Adds hyperframes_compose (scaffold/lint/ validate/render/doctor/add_block), a playbook -> CSS style bridge, and vendored HyperFrames Layer 3 skills from commit d291358, pinned via PROVENANCE.md for future re-sync. Final_review now records render_runtime_used and runtime_swap_detected so compose lies are catchable after the fact.
6.6 KiB
Animation & Motion Graphics Pipeline
Sources: School of Motion curriculum, After Effects documentation, Remotion documentation, HyperFrames documentation, Disney's 12 Principles of Animation (Frank Thomas & Ollie Johnston), Motion Design School, The Animator's Survival Kit (Richard Williams)
Runtime Choice — Remotion vs HyperFrames
Animation work in OpenMontage runs on one of two composition runtimes. Both are first-class; the choice is creative, not a fallback:
- Remotion (React-based) — when the scene is a React component, uses the
existing chart/text-card/comparison/kpi stack, or needs pixel-accurate
frame-level interpolation through
useCurrentFrame()+interpolate(). Default for data-heavy explainers. - HyperFrames (HTML/GSAP) — when the motion is expressed naturally as
CSS + GSAP timelines: kinetic typography, product promos, launch reels,
website/UI-driven compositions, registry-block-driven scenes. Default
when the brief is motion-graphics-led and the scene library in
remotion-composer/doesn't already cover the look.
See skills/core/hyperframes.md and skills/meta/animation-runtime-selector.md
for the full decision matrix. Whichever runtime is chosen at proposal must
be locked in edit_decisions.render_runtime and preserved through compose.
Quick Reference Card
FRAME RATE: 30fps for web video | 24fps for cinematic feel | 60fps for UI/smooth motion
EASE DEFAULT: easeInOutCubic (0.65, 0, 0.35, 1) — never use linear
TRANSITION: 0.5-1.0s between scenes
ANTICIPATION: 2-3 frames before main action
OVERSHOOT: 10-15% past target, settle back in 3-5 frames
HOLD FRAMES: 6-12 frames (0.2-0.4s) on key poses
COLOR: Max 5 colors from playbook palette
EXPORT: H.264 CRF 18-20 for web, ProRes 422 for editing
Frame Rate Selection
| Style | FPS | When to Use |
|---|---|---|
| Cinematic animation | 24 | Film-like feel, character animation, organic motion |
| Web/explainer standard | 30 | Default for YouTube/web video. OpenMontage default. |
| Smooth UI animation | 60 | Software demos, UI transitions, scrolling |
| Stylized/limited | 12-15 on 2s/3s | Deliberately choppy, artistic choice |
OpenMontage default: 30fps. Render Manim at 60fps and transcode to 30fps for smoother motion at delivery frame rate.
Timing Principles (Applied to Motion Graphics)
The 4 Most Important Principles
| Principle | Application | Timing |
|---|---|---|
| Ease In/Out | Every movement starts slow, ends slow | Use cubic or quart easing, never linear |
| Anticipation | Brief movement opposite to the main action | 2-3 frames (66-100ms at 30fps) |
| Overshoot | Object passes target, bounces back | 10-15% past target, settle in 3-5 frames |
| Staging | Only one thing moves at a time | Stagger animations by 3-6 frames |
Easing Curves
| Curve | Cubic Bezier | Use For |
|---|---|---|
| easeOutCubic | (0.33, 1, 0.68, 1) |
Objects entering the scene |
| easeInCubic | (0.32, 0, 0.67, 0) |
Objects leaving the scene |
| easeInOutCubic | (0.65, 0, 0.35, 1) |
Position changes within scene |
| easeOutBack | (0.34, 1.56, 0.64, 1) |
Bouncy pop-in (playful) |
| easeOutElastic | spring simulation | Attention-grabbing reveals |
| linear | (0, 0, 1, 1) |
NEVER for motion — only for opacity or color |
Hold Frames
After a movement completes, hold the pose before the next animation:
| Context | Hold Duration |
|---|---|
| Key information on screen | 1.0-2.0s (narration dependent) |
| Between animation beats | 0.3-0.5s (8-15 frames at 30fps) |
| After a reveal | 1.5-3.0s (let it register) |
| Quick transition | 0.1-0.2s (3-6 frames) |
Scene Transitions
| Transition | Duration | When to Use |
|---|---|---|
| Hard cut | Instant | Same topic, different angle/zoom |
| Crossfade | 0.5-1.0s | Topic change, gentle shift |
| Wipe/slide | 0.5-0.8s | Sequential steps, progression |
| Zoom in | 0.8-1.2s | Diving deeper into detail |
| Zoom out | 0.8-1.2s | Revealing bigger picture |
| Match cut | Instant | Same shape/position, different content |
| Morph/transform | 1.0-2.0s | Concept evolution, before/after |
Transition Rules
- Consistent transitions — pick 2-3 types and stick with them throughout the video
- Transition = meaning — a wipe means "next step," a zoom means "deeper detail"
- Don't over-transition — a hard cut is the most invisible and most professional transition
- Audio leads visual — start transition sound 10-20ms before the visual change
Composition for Motion Graphics
Layout
- Rule of thirds — place focal elements on intersection points
- Visual hierarchy — largest/brightest element = most important
- White space — minimum 10% margin on all sides (within title-safe)
- Direction of motion — left-to-right = forward/progress, right-to-left = reverse/back
Color
- Max 5 colors from the style playbook palette
- 1 accent color for emphasis — used sparingly
- Background should be the least saturated color
- Contrast between foreground elements and background: minimum 3:1
Stagger and Choreography
When multiple elements enter:
- Stagger entry by 3-6 frames (100-200ms) between elements
- Enter from the same direction for grouped elements
- Use
LaggedStart(Manim) or staggereddelay(Remotion) withlag_ratio=0.1-0.2
Export Settings
| Target | Codec | Settings |
|---|---|---|
| YouTube/web final | H.264 | CRF 18-20, -pix_fmt yuv420p, -movflags +faststart |
| Editing intermediate | ProRes 422 | For further editing/compositing |
| Transparent overlay | ProRes 4444 | When compositing over other footage |
| GIF preview | GIF | 480px wide, 15fps, 256 colors |
Applying to OpenMontage
When building animation/motion graphics content:
- Render at 30fps (OpenMontage default) — Manim at 60fps, transcode down
- Never use linear easing — default to
easeInOutCubicfor all motion - Stagger multi-element entrances by 100-200ms — don't reveal everything at once
- Hold key frames for 1.0-2.0s after reveals (synced to narration)
- Use 2-3 transition types consistently — hard cut + crossfade covers most needs
- Audio leads visual — SFX starts 10-20ms before transition (see sound-design.md)
- Max 5 palette colors — enforce from the style playbook
- Anticipation + overshoot on important movements for polish
- Export H.264 CRF 18-20 for final output via
video_compose