Rendiv Video Skills
Use these skills whenever you are working with rendiv code — writing compositions,
animating elements, embedding media, or rendering output.
Core Mental Model
Rendiv treats video as a pure function of a frame number. Every visual property
(position, opacity, color, scale) is derived from the current frame via useFrame().
There is no timeline state machine, no imperative keyframe API. You write a React
component that accepts a frame and returns JSX — rendiv handles the rest.
import { useFrame, interpolate } from '@rendiv/core';
export const FadeIn: React.FC = () => {
const frame = useFrame();
const opacity = interpolate(frame, [0, 30], [0, 1], { extrapolateRight: 'clamp' });
return <div style={{ opacity }}>Hello rendiv</div>;
};
Key principles
- Every animation MUST be driven by
useFrame(). CSS animations and transitions are
forbidden — they run on wall-clock time and will desync during frame-by-frame rendering.
- Use
interpolate() for linear mappings and spring() for physics-based motion.
- Use
<Img>, <Video>, <Audio>, and <AnimatedImage> from @rendiv/core instead
of native HTML elements — they integrate with the render lifecycle via holdRender.
- Compositions are registered declaratively via
<Composition> and <Still> — they
render null and only provide metadata to the framework.
Quick Start
A minimal rendiv project entry point:
// FadeIn.tsx — composition component
import { useFrame, interpolate, CanvasElement } from '@rendiv/core';
export const FadeIn: React.FC = () => {
const frame = useFrame();
const opacity = interpolate(frame, [0, 30], [0, 1], { extrapolateRight: 'clamp' });
return (
<CanvasElement id="FadeIn">
<div style={{ opacity }}>Hello rendiv</div>
</CanvasElement>
);
};
// index.tsx — entry point
import { setRootComponent, Composition } from '@rendiv/core';
import { FadeIn } from './FadeIn';
const Root: React.FC = () => (
<>
<Composition
id="FadeIn"
component={FadeIn}
durationInFrames={90}
fps={30}
width={1920}
height={1080}
/>
</>
);
setRootComponent(Root);
Render to MP4: rendiv render src/index.tsx FadeIn out/fade-in.mp4
Topic Guide
Load the relevant rule file based on the task at hand:
| Task |
Rule file |
Animate with interpolate, spring, Easing, blendColors |
animation.md |
| Set up compositions, stills, folders, entry point |
composition-setup.md |
Time-shift with Sequence, Series, Loop, Freeze |
sequencing-and-timing.md |
| Control z-ordering and timeline overrides |
timeline-overrides.md |
| Embed images, video, audio, GIFs, iframes |
media-components.md |
| Render animated GIFs with playback control |
gif.md |
| Add subtitles, SRT parsing, word highlighting |
captions.md |
Understand holdRender, environment modes, rendering pipeline |
render-lifecycle.md |
Animate between scenes with TransitionSeries |
transitions.md |
| Generate SVG shapes or manipulate paths |
shapes-and-paths.md |
| Add noise-driven motion or motion blur |
procedural-effects.md |
| Animate text per character, word, or line |
text-animation.md |
| Apply visual effects and CSS filters |
visual-effects.md |
| Load Google Fonts or local font files |
typography.md |
| Embed Lottie animations |
lottie.md |
| Add 3D scenes with Three.js / R3F |
three.md |
| Use the CLI, Studio, or Player |
cli-and-studio.md |
Critical Constraints
- No CSS animations or transitions. Everything MUST be frame-driven via
useFrame().
- Use rendiv media components (
<Img>, <Video>, <Audio>, <AnimatedImage>)
instead of native HTML elements. They manage holdRender automatically.
- Always wrap composition content with
<CanvasElement id="...">. This makes
the composition self-contained so its timeline overrides work correctly when nested
inside other compositions. The id must match the <Composition> id.
<Composition> renders null. It only registers metadata. The actual component
is rendered by the Player, Studio, or Renderer — not by <Composition> itself.
setRootComponent can only be called once. It registers the root that defines
all compositions.
inputRange must be monotonically non-decreasing in interpolate() and
blendColors(). Both ranges must have equal length with at least 2 elements.
<Series.Sequence> must be a direct child of <Series>. It throws if rendered
outside a <Series> parent.
morphPath requires matching segments. Both paths must have the same number of
segments with matching command types.
Packages
| Package |
Purpose |
@rendiv/core |
Hooks, components, animation, contexts |
@rendiv/player |
Browser <Player> component |
@rendiv/renderer |
Playwright + FFmpeg rendering |
@rendiv/bundler |
Vite-based project bundler |
@rendiv/cli |
CLI: render, still, compositions, studio |
@rendiv/studio |
Studio dev server with render queue |
@rendiv/transitions |
TransitionSeries with fade, slide, wipe, flip, clockWipe |
@rendiv/shapes |
SVG shape generators (circle, rect, star, polygon, etc.) |
@rendiv/paths |
SVG path parsing, measurement, morphing, stroke reveal |
@rendiv/noise |
Simplex noise (2D, 3D, 4D) |
@rendiv/fonts |
Local font loading with holdRender |
@rendiv/google-fonts |
Google Fonts loading with holdRender |
@rendiv/motion-blur |
MotionTrail and ShutterBlur components |
@rendiv/gif |
Animated GIF playback with speed control and fit modes |
@rendiv/captions |
SRT/Whisper parsing, word-by-word highlighting, caption overlay |
@rendiv/text |
Animated text: per-character/word/line split, stagger, presets |
@rendiv/effects |
Visual effects: composable CSS filters, glow, glitch, vignette |
@rendiv/lottie |
Frame-accurate Lottie animations via lottie-web |
@rendiv/three |
3D scenes via React Three Fiber with context bridging |
Example Assets
- Animated bar chart — Spring-animated bars with staggered entrances
- Text reveal — Character-by-character text animation
Source: thecodacus/rendiv — distributed by TomeVault.
1---2name: thecodacus-rendiv-rendiv3description: Rendiv Video Skills4---56# Rendiv Video Skills78Use these skills whenever you are working with rendiv code — writing compositions,9animating elements, embedding media, or rendering output.1011## Core Mental Model1213Rendiv treats video as a **pure function of a frame number**. Every visual property14(position, opacity, color, scale) is derived from the current frame via `useFrame()`.15There is no timeline state machine, no imperative keyframe API. You write a React16component that accepts a frame and returns JSX — rendiv handles the rest.1718```tsx19import { useFrame, interpolate } from '@rendiv/core';2021export const FadeIn: React.FC = () => {22 const frame = useFrame();23 const opacity = interpolate(frame, [0, 30], [0, 1], { extrapolateRight: 'clamp' });24 return <div style={{ opacity }}>Hello rendiv</div>;25};26```2728### Key principles2930- Every animation MUST be driven by `useFrame()`. CSS animations and transitions are31 forbidden — they run on wall-clock time and will desync during frame-by-frame rendering.32- Use `interpolate()` for linear mappings and `spring()` for physics-based motion.33- Use `<Img>`, `<Video>`, `<Audio>`, and `<AnimatedImage>` from `@rendiv/core` instead34 of native HTML elements — they integrate with the render lifecycle via `holdRender`.35- Compositions are registered declaratively via `<Composition>` and `<Still>` — they36 render `null` and only provide metadata to the framework.3738## Quick Start3940A minimal rendiv project entry point:4142```tsx43// FadeIn.tsx — composition component44import { useFrame, interpolate, CanvasElement } from '@rendiv/core';4546export const FadeIn: React.FC = () => {47 const frame = useFrame();48 const opacity = interpolate(frame, [0, 30], [0, 1], { extrapolateRight: 'clamp' });49 return (50 <CanvasElement id="FadeIn">51 <div style={{ opacity }}>Hello rendiv</div>52 </CanvasElement>53 );54};55```5657```tsx58// index.tsx — entry point59import { setRootComponent, Composition } from '@rendiv/core';60import { FadeIn } from './FadeIn';6162const Root: React.FC = () => (63 <>64 <Composition65 id="FadeIn"66 component={FadeIn}67 durationInFrames={90}68 fps={30}69 width={1920}70 height={1080}71 />72 </>73);7475setRootComponent(Root);76```7778Render to MP4: `rendiv render src/index.tsx FadeIn out/fade-in.mp4`7980## Topic Guide8182Load the relevant rule file based on the task at hand:8384| Task | Rule file |85|---|---|86| Animate with `interpolate`, `spring`, `Easing`, `blendColors` | [animation.md](rules/animation.md) |87| Set up compositions, stills, folders, entry point | [composition-setup.md](rules/composition-setup.md) |88| Time-shift with `Sequence`, `Series`, `Loop`, `Freeze` | [sequencing-and-timing.md](rules/sequencing-and-timing.md) |89| Control z-ordering and timeline overrides | [timeline-overrides.md](rules/timeline-overrides.md) |90| Embed images, video, audio, GIFs, iframes | [media-components.md](rules/media-components.md) |91| Render animated GIFs with playback control | [gif.md](rules/gif.md) |92| Add subtitles, SRT parsing, word highlighting | [captions.md](rules/captions.md) |93| Understand `holdRender`, environment modes, rendering pipeline | [render-lifecycle.md](rules/render-lifecycle.md) |94| Animate between scenes with `TransitionSeries` | [transitions.md](rules/transitions.md) |95| Generate SVG shapes or manipulate paths | [shapes-and-paths.md](rules/shapes-and-paths.md) |96| Add noise-driven motion or motion blur | [procedural-effects.md](rules/procedural-effects.md) |97| Animate text per character, word, or line | [text-animation.md](rules/text-animation.md) |98| Apply visual effects and CSS filters | [visual-effects.md](rules/visual-effects.md) |99| Load Google Fonts or local font files | [typography.md](rules/typography.md) |100| Embed Lottie animations | [lottie.md](rules/lottie.md) |101| Add 3D scenes with Three.js / R3F | [three.md](rules/three.md) |102| Use the CLI, Studio, or Player | [cli-and-studio.md](rules/cli-and-studio.md) |103104## Critical Constraints1051061. **No CSS animations or transitions.** Everything MUST be frame-driven via `useFrame()`.1072. **Use rendiv media components** (`<Img>`, `<Video>`, `<Audio>`, `<AnimatedImage>`)108 instead of native HTML elements. They manage `holdRender` automatically.1093. **Always wrap composition content with `<CanvasElement id="...">`.** This makes110 the composition self-contained so its timeline overrides work correctly when nested111 inside other compositions. The `id` must match the `<Composition>` id.1124. **`<Composition>` renders null.** It only registers metadata. The actual component113 is rendered by the Player, Studio, or Renderer — not by `<Composition>` itself.1145. **`setRootComponent` can only be called once.** It registers the root that defines115 all compositions.1166. **`inputRange` must be monotonically non-decreasing** in `interpolate()` and117 `blendColors()`. Both ranges must have equal length with at least 2 elements.1187. **`<Series.Sequence>` must be a direct child of `<Series>`.** It throws if rendered119 outside a `<Series>` parent.1208. **`morphPath` requires matching segments.** Both paths must have the same number of121 segments with matching command types.122123## Packages124125| Package | Purpose |126|---|---|127| `@rendiv/core` | Hooks, components, animation, contexts |128| `@rendiv/player` | Browser `<Player>` component |129| `@rendiv/renderer` | Playwright + FFmpeg rendering |130| `@rendiv/bundler` | Vite-based project bundler |131| `@rendiv/cli` | CLI: render, still, compositions, studio |132| `@rendiv/studio` | Studio dev server with render queue |133| `@rendiv/transitions` | TransitionSeries with fade, slide, wipe, flip, clockWipe |134| `@rendiv/shapes` | SVG shape generators (circle, rect, star, polygon, etc.) |135| `@rendiv/paths` | SVG path parsing, measurement, morphing, stroke reveal |136| `@rendiv/noise` | Simplex noise (2D, 3D, 4D) |137| `@rendiv/fonts` | Local font loading with holdRender |138| `@rendiv/google-fonts` | Google Fonts loading with holdRender |139| `@rendiv/motion-blur` | MotionTrail and ShutterBlur components |140| `@rendiv/gif` | Animated GIF playback with speed control and fit modes |141| `@rendiv/captions` | SRT/Whisper parsing, word-by-word highlighting, caption overlay |142| `@rendiv/text` | Animated text: per-character/word/line split, stagger, presets |143| `@rendiv/effects` | Visual effects: composable CSS filters, glow, glitch, vignette |144| `@rendiv/lottie` | Frame-accurate Lottie animations via lottie-web |145| `@rendiv/three` | 3D scenes via React Three Fiber with context bridging |146147## Example Assets148149- [Animated bar chart](assets/animated-bar-chart.tsx) — Spring-animated bars with staggered entrances150- [Text reveal](assets/text-reveal.tsx) — Character-by-character text animation151152---153> Source: [thecodacus/rendiv](https://github.com/thecodacus/rendiv) — distributed by [TomeVault](https://tomevault.io).154<!-- tomevault:4.0:skill_md:2026-06-29 -->