| name | plugin-guide |
| description | GSAP plugin compatibility and usage patterns within Remotion |
| metadata | {"tags":"gsap, plugins, remotion, SplitText, MorphSVG, DrawSVG, MotionPath, CustomEase"} |
Plugin Compatibility Matrix
All GSAP plugins are 100% free since Webflow's 2024 acquisition.
Fully Compatible (Remotion-safe)
| Plugin | Purpose | Video Use Case |
|---|
| SplitText | Split text into chars/words/lines | Title reveals, kinetic typography |
| MorphSVG | Shape-to-shape morphing | Icon transitions, abstract art |
| DrawSVG | SVG stroke drawing/erasing | Logo reveals, signatures, line art |
| MotionPath | Animate along SVG/custom paths | Orbital motion, path-following |
| ScrambleText | Character scramble decode | Tech intros, decode effects (use --concurrency=1) |
| CustomEase | Arbitrary easing from SVG paths | Brand-specific motion feel |
| CustomBounce | Custom bounce physics | Impact/landing effects |
| CustomWiggle | Custom wiggle/shake | Vibration, attention effects |
| EasePack | RoughEase, SlowMo, ExpoScale | Organic feel, cinematic speed ramps |
| Physics2D | 2D velocity/gravity/friction | Particle bursts (use fixed params) |
| Flip | FLIP layout transitions | Scene rearrangements (careful setup) |
Not Recommended (Remotion native is better)
| Plugin | Reason | Alternative |
|---|
| TextPlugin | Typewriter effect is trivial with interpolate() + .slice() | text.slice(0, interpolate(frame, ...)) |
Not Compatible (Interactive / Scroll-based)
| Plugin | Reason |
|---|
| ScrollTrigger | No scrolling in video |
| ScrollSmoother | No scrolling in video |
| ScrollTo | No scrolling in video |
| Draggable | Requires mouse/touch interaction |
| Inertia | Requires velocity tracking |
| Observer | Event-based gestures |
Determinism Warnings
| Plugin | Issue | Mitigation |
|---|
| ScrambleText | Internal random char selection | Acceptable visually; use --concurrency=1 for exact reproducibility |
| RoughEase | Internal randomness in jitter | Use fixed taper and points; acceptable for most use cases |
| stagger: "random" | GSAP's unseed random | Use function-based stagger with seededRandom() |
Plugin Usage Patterns
SplitText
const split = SplitText.create(element, {
type: 'chars,words,lines',
mask: 'lines',
autoSplit: false,
});
split.chars
split.words
split.lines
| Config | Purpose |
|---|
type: "chars" | Split into individual characters |
type: "words" | Split into words |
type: "lines" | Split into lines (based on line wrapping) |
type: "chars,words,lines" | Split into all levels |
mask: "lines" | Add overflow:hidden wrapper per line (for y-reveal) |
mask: "words" | Add overflow:hidden wrapper per word |
mask: "chars" | Add overflow:hidden wrapper per char |
MorphSVG
tl.to('#path', { morphSVG: '#target-path', duration: 1.5 });
tl.to('#path', {
morphSVG: {
shape: '#target-path',
type: 'rotational',
map: 'size',
shapeIndex: 5,
origin: '50% 50%',
},
duration: 1.5, ease: 'power2.inOut',
});
MorphSVGPlugin.convertToPath('circle, rect, ellipse, polygon');
DrawSVG
tl.from('.path', { drawSVG: 0, duration: 2 });
tl.from('.path', { drawSVG: '50% 50%', duration: 2 });
tl.to('.path', { drawSVG: '20% 80%', duration: 1 });
tl.to('.path', { drawSVG: '100% 100%', duration: 1 });
MotionPath
tl.to('.element', {
motionPath: {
path: '#svg-path',
align: '#svg-path',
alignOrigin: [0.5, 0.5],
autoRotate: true,
start: 0,
end: 1,
},
duration: 3, ease: 'power1.inOut',
});
tl.to('.element', {
motionPath: [
{ x: 100, y: 0 },
{ x: 200, y: -100 },
{ x: 300, y: 0 },
],
duration: 2,
});
CustomEase
CustomEase.create('myEase', 'M0,0 C0.1,0.5 0.2,1 0.4,1 0.6,1 0.8,0.8 1,1');
tl.to(el, { y: -200, ease: 'myEase' });
CustomBounce.create('myBounce', {
strength: 0.6,
squash: 3,
squashID: 'myBounce-squash',
});
CustomWiggle.create('myWiggle', {
wiggles: 8,
type: 'easeOut',
});
ScrambleText
tl.to('.element', {
duration: 2,
scrambleText: {
text: 'FINAL TEXT',
chars: '01',
revealDelay: 0.5,
speed: 0.3,
newClass: 'revealed',
oldClass: 'scrambled',
},
});
Physics2D (Particle Systems)
particles.forEach((p, i) => {
const angle = (360 / count) * i;
const velocity = 200 + (i % 5) * 40;
tl.to(p, {
physics2D: { velocity, angle, gravity: 300 },
opacity: 0, duration: 2,
}, 0);
});
Plugin Tiers
Tier 1 -- Essential:
gsap.timeline() (core orchestration)
SplitText (primary differentiator vs Remotion native)
CustomEase / EasePack (motion feel beyond Remotion's Easing)
Tier 2 -- Highly Useful:
DrawSVG (logo/line reveals -- impossible without GSAP)
MorphSVG (shape morphing -- impossible without GSAP)
MotionPath (path-following)
ScrambleText (decode effects -- use --concurrency=1)
Tier 3 -- Specialized:
Physics2D / PhysicsProps (particle systems)
CustomBounce / CustomWiggle (bouncing/shaking)
Flip (layout transitions)
Note: 3D CSS Transforms
3D transforms (rotateY, rotateX, perspective, preserve-3d, backfaceVisibility) are core GSAP features, not plugins. No additional imports needed -- just use them in any tl.to() / tl.from() call.