Lottie animator
Skill rvanbaalen/skills/plugins/lottie-animator/skills/lottie-animator
Public Claude Code skills marketplace
npx -y skills add rvanbaalen/skills --skill lottie-animatorAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
- 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Generates professional Lottie animations from static SVGs. Replaces After Effects for motion graphics. Use when the user asks to: animate logo, create lottie, svg animation, motion graphics, wiggle animation, bounce effect, rotate animation, pulse effect, entrance animation, loading animation, loop animation, icon animation, character animation, morphing, path drawing, trim path, walking animation, run cycle, walk cycle, frame-by-frame animation, sprite animation. Supports advanced bezier curves, shape modifiers, parenting, mattes, morphing, character rigs, and professional frame-by-frame animation techniques.
SKILL.md
14.0 KB, ~4.5k tokens by cl100k_base, as published. Nobody here has run it
Lottie Animator - SVG to Motion Graphics
Professional skill to create advanced Lottie animations from SVGs, eliminating the need for After Effects.
When to Activate
Activate this skill when the user requests:
- Animate a logo, icon, or SVG graphic
- Create motion graphics or animations
- Generate Lottie JSON files
- Effects: wiggle, bounce, rotate, pulse, fade, scale, morph
- Entrance, loop, loading animations, or transitions
- Path drawing/reveal animations (Trim Path)
- Character animation, walking cycles
- Shape morphing (icon transitions)
- Replace After Effects workflow
Critical: SVG Understanding
Before animating ANY SVG, you MUST understand its path structure.
See: references/svg-path-mastery.md
SVG Path Command Quick Reference
| Command | Description | Lottie Conversion |
|---|---|---|
| M x,y | Move to | Starting vertex |
| L x,y | Line to | Vertex with zero tangents |
| C cp1 cp2 end | Cubic bezier | Native support |
| Q ctrl end | Quadratic bezier | Convert to cubic |
| A rx ry ... | Arc | Split into cubic segments |
| Z | Close path | Set c: true |
Path to Lottie Vertex Formula
For C x1,y1 x2,y2 x,y from point (px, py):
- Previous vertex outTangent: [x1-px, y1-py]
- Current vertex: [x, y]
- Current vertex inTangent: [x2-x, y2-y]
Main Workflow
Phase 1: Motion Philosophy (30 seconds)
MANDATORY before any code. Define:
- Brand Personality: Professional, playful, elegant, energetic
- Emotional Response: Trust, excitement, calm, urgency
- Motion Metaphor: Fluid like water, solid like rock, light like air
Example: "Fintech Logo → professional + trust → precise and controlled movement"
Example: "Music App → creative + energy → organic with rhythmic pulses"
Example: "Healthcare → calm + reliable → smooth, slow easings"
Phase 2: SVG Deep Analysis
Before animating, thoroughly analyze:
- Structure: Elements, groups, paths, viewBox dimensions
- Path Complexity: Vertex count, curve types (C, Q, A commands)
- Hierarchy: Primary elements vs. secondary details
- Animation Opportunities: Independent parts, stroke-based vs fill-based
# Analyze SVG structure
cat icon.svg | grep -E '<(path|g|rect|circle|ellipse|line|polyline)' | head -30
Key Questions:
- Is it stroke-based? → Consider Trim Path animation
- Multiple paths? → Consider staggered entrance
- Complex shape? → Consider scale/rotate instead of morph
- Icon library (Phosphor/Lucide)? → Usually clean, minimal vertices
Phase 3: Animation Strategy Selection
| Strategy | Best For | Technique |
|---|---|---|
| Draw On | Stroke icons, signatures | Trim Path |
| Pop In | Logos, buttons | Scale + Opacity |
| Morph | Icon transitions (hamburger→X) | Path keyframes |
| Stagger | Multiple elements | Delayed start times |
| Character | People, mascots | Parenting + bone hierarchy |
| Loader | Progress, spinners | Rotation + Trim Path |
| Frame-by-Frame | Walk/run cycles, complex characters | ip/op layer switching |
Pro Tip: For complex character animations (walk cycles, run cycles), use Frame-by-Frame technique instead of continuous animation. See references/professional-techniques.md
Phase 4: Create Lottie JSON
See: references/lottie-structure.md
Base Structure:
{
"v": "5.12.1",
"fr": 60,
"ip": 0,
"op": 120,
"w": 512,
"h": 512,
"nm": "Animation Name",
"ddd": 0,
"assets": [],
"layers": []
}
Phase 5: Apply Professional Easing
See: references/bezier-easing.md
| Use Case | Out Tangent | In Tangent |
|---|---|---|
| Entrance | [0.33, 0] | [0.67, 1] |
| Exit | [0.55, 0.055] | [0.675, 0.19] |
| Loop | [0.645, 0.045] | [0.355, 1] |
| Bounce | [0.34, 1.56] | [0.64, 1] |
| Spring | [0.5, 1.5] | [0.5, 0.9] |
Phase 6: Validate and Export
# Validate JSON structure
python3 -c "import json; json.load(open('animation.json'))"
# Preview
echo "Open in: https://lottiefiles.com/preview"
Shape Modifiers
See: references/shape-modifiers.md
Trim Path (Icon Drawing Animation)
{
"ty": "tm",
"s": {"a": 0, "k": 0},
"e": {
"a": 1,
"k": [
{"t": 0, "s": [0], "o": {"x": [0.33], "y": [0]}, "i": {"x": [0.67], "y": [1]}},
{"t": 45, "s": [100]}
]
},
"o": {"a": 0, "k": 0},
"m": 1
}
Repeater (Radial/Linear Patterns)
{
"ty": "rp",
"c": {"a": 0, "k": 8},
"tr": {
"r": {"a": 0, "k": 45},
"so": {"a": 0, "k": 100},
"eo": {"a": 0, "k": 30}
}
}
Offset Path (Glow/Outline Effects)
{
"ty": "op",
"a": {"a": 1, "k": [{"t": 0, "s": [0]}, {"t": 30, "s": [8]}]},
"lj": 2
}
Advanced Techniques
See: references/advanced-animation.md and references/professional-techniques.md
Frame-by-Frame Animation (Professional Technique)
The most professional technique for complex character animations. Instead of continuous animation, create multiple "poses" that appear/disappear in sequence using ip (in point) and op (out point).
{
"layers": [
{"nm": "Pose 1", "ip": 0, "op": 6, "shapes": [/* pose 1 */]},
{"nm": "Pose 2", "ip": 6, "op": 12, "shapes": [/* pose 2 */]},
{"nm": "Pose 3", "ip": 12, "op": 18, "shapes": [/* pose 3 */]}
]
}
Timing Formula: Total Frames = Poses × Frames_per_Pose → Duration = Total Frames / FPS
When to Use:
- Walk/run cycles (each pose is a different leg position)
- Complex character animations with drastic shape changes
- When morphing produces ugly results
- Professional sprite-sheet style animations
Layer Parenting (Bone Hierarchy)
Use parent property to create hierarchies where moving one layer moves all children.
{
"layers": [
{"ind": 14, "nm": "Shadow", "ks": {"p": {"a": 0, "k": [340, 195, 0]}}},
{"ind": 1, "nm": "Head", "parent": 14, "ks": {"p": {"a": 0, "k": [88, -84, 0]}}},
{"ind": 2, "nm": "Body", "parent": 14, "ks": {"p": {"a": 0, "k": [0, -50, 0]}}}
]
}
Key Insight: Child positions are RELATIVE to parent. Moving Shadow moves all children with it.
Professional Parent Strategies:
- Shadow as Parent: Move shadow → entire character moves (for walk cycles)
- Body as Parent: Limbs and head follow body rotation
- Joint as Parent: Upper arm controls forearm and hand rotation
Parent Chain Example:
Shadow (Parent for entire character)
├── Head (child)
├── Body (child)
├── Ear Inner (child)
├── Eye (child)
└── ... 13 total children
Path Morphing (Same Vertex Count Required)
{
"ty": "sh",
"ks": {
"a": 1,
"k": [
{"t": 0, "s": [{"c": true, "v": [[0,0], [100,0], [100,100], [0,100]], "i": [...], "o": [...]}]},
{"t": 30, "s": [{"c": true, "v": [[50,-20], [120,50], [50,120], [-20,50]], "i": [...], "o": [...]}]}
]
}
}
Critical Rule: Both shapes MUST have identical vertex count for smooth morphing.
Track Mattes (Masking)
// Matte layer (defines visible area)
{"ind": 1, "nm": "Matte", "td": 1, "ty": 4, ...}
// Content layer (uses the matte)
{"ind": 2, "nm": "Content", "tt": 1, "ty": 4, ...}
| tt Value | Mode |
|---|---|
| 1 | Alpha Matte |
| 2 | Alpha Inverted |
| 3 | Luma Matte |
| 4 | Luma Inverted |
Animation Principles Applied
1. Anticipation
"s": {"a": 1, "k": [
{"t": 0, "s": [100, 100]},
{"t": 8, "s": [95, 105]}, // Slight crouch
{"t": 25, "s": [115, 90]}, // Main action
{"t": 40, "s": [100, 100]}
]}
2. Squash & Stretch (Volume Preservation)
// X * Y should stay roughly constant
{"t": 0, "s": [100, 100]}, // 10000
{"t": 10, "s": [120, 83]}, // 9960 ≈ preserved
{"t": 20, "s": [85, 118]} // 10030 ≈ preserved
3. Staggered Timing
{"ind": 1, "st": 0, "ip": 0},
{"ind": 2, "st": 3, "ip": 3}, // 3 frame delay
{"ind": 3, "st": 6, "ip": 6}, // 6 frame delay
{"ind": 4, "st": 9, "ip": 9} // 9 frame delay
4. Follow-Through with Overshoot
"r": {"a": 1, "k": [
{"t": 0, "s": [0]},
{"t": 15, "s": [95]}, // Overshoot target
{"t": 25, "s": [88]}, // Settle back
{"t": 35, "s": [90]} // Final position
]}
Common Animation Recipes
Loading Spinner
{
"shapes": [
{"ty": "el", "s": {"a": 0, "k": [60, 60]}},
{"ty": "st", "w": {"a": 0, "k": 4}, "c": {"a": 0, "k": [0.2, 0.5, 1, 1]}, "lc": 2},
{"ty": "tm", "s": {"a": 0, "k": 0}, "e": {"a": 0, "k": 75},
"o": {"a": 1, "k": [{"t": 0, "s": [0]}, {"t": 60, "s": [360]}]}}
],
"ks": {"r": {"a": 1, "k": [{"t": 0, "s": [0]}, {"t": 120, "s": [360]}]}}
}
Checkmark Draw
{
"shapes": [
{"ty": "sh", "ks": {"a": 0, "k": {"c": false, "v": [[20,50], [40,70], [80,30]], "i": [[0,0], [0,0], [0,0]], "o": [[0,0], [0,0], [0,0]]}}},
{"ty": "st", "w": {"a": 0, "k": 6}, "c": {"a": 0, "k": [0.2, 0.8, 0.4, 1]}, "lc": 2, "lj": 2},
{"ty": "tm", "e": {"a": 1, "k": [{"t": 0, "s": [0]}, {"t": 30, "s": [100]}]}}
]
}
Heart Beat (Organic)
"s": {"a": 1, "k": [
{"t": 0, "s": [100, 100]},
{"t": 8, "s": [115, 115]}, // Systole (Lub)
{"t": 12, "s": [90, 90]}, // Diastole start (Dub)
{"t": 18, "s": [105, 105]}, // Refill
{"t": 45, "s": [100, 100]} // Rest
]}
Icon Pop-In with Bounce
{
"ks": {
"s": {"a": 1, "k": [
{"t": 0, "s": [0, 0], "o": {"x": [0.34], "y": [1.56]}, "i": {"x": [0.64], "y": [1]}},
{"t": 18, "s": [110, 110], "o": {"x": [0.33], "y": [0]}, "i": {"x": [0.67], "y": [1]}},
{"t": 30, "s": [100, 100]}
]},
"o": {"a": 1, "k": [
{"t": 0, "s": [0]},
{"t": 12, "s": [100]}
]}
}
}
Icon Library Optimization
Phosphor/Lucide Icons
- ViewBox: Usually 256x256 (Phosphor) or 24x24 (Lucide)
- Structure: Clean paths, minimal vertices
- Strokes:
stroke-linecap="round"for Trim Path compatibility - Scale: Match your canvas to viewBox for 1:1
Recommended Animation Approach
- Simple icons → Scale + Opacity entrance
- Stroke icons → Trim Path drawing
- Multi-part icons → Staggered entrance
- Toggle icons → Path morphing (if vertex counts match)
Stroke + Fill Combination (Outline Style)
For professional character animations, combine stroke (contour) + fill (color) in each shape:
{
"ty": "gr",
"it": [
{"ty": "sh", "ks": {...}},
{"ty": "st", "c": {"a": 0, "k": [0.259, 0.153, 0.141, 1]}, "w": {"a": 0, "k": 1}, "lc": 2, "lj": 2},
{"ty": "fl", "c": {"a": 0, "k": [0.302, 0.604, 0.816, 1]}},
{"ty": "tr", ...}
]
}
Stroke Properties:
| Property | Value | Description |
|---|---|---|
lc (lineCap) | 1=Butt, 2=Round, 3=Square | Line end style |
lj (lineJoin) | 1=Miter, 2=Round, 3=Bevel | Corner style |
Professional Color Palette Example (from Running Cat):
{
"body_fill": [0.302, 0.604, 0.816, 1],
"outline": [0.259, 0.153, 0.141, 1],
"eye_white": [0.902, 0.976, 1.0, 1],
"shadow": [0.608, 0.706, 0.878, 1]
}
Common Errors
| Error | Cause | Solution |
|---|---|---|
| Non-looping | Last keyframe ≠ first value | Match start/end keyframe values |
| Stiff movement | No easing curves | Add bezier i/o tangents |
| Jerky animation | Keyframes too sparse | Add intermediate keyframes |
| Morph glitches | Different vertex counts | Add/remove vertices to match |
| Wrong rotation pivot | Incorrect anchor point | Set a to rotation center |
| Path draws wrong direction | Path not reversed | Use "d": 3 to reverse |
| Ugly character animation | Trying to morph complex shapes | Use frame-by-frame instead |
Performance Guidelines
- Layers: <15 for complex animations
- Vertices: <20 per shape for smooth morphing
- Frame Rate: 30fps often sufficient, 60fps for ultra-smooth
- Modifiers: Avoid nested repeaters
- Effects: Minimize blur/shadow usage
- File Size: Target <50KB for icons, <200KB for complex
References
- SVG Path Mastery - START HERE for SVG understanding
- Professional Techniques - Frame-by-frame, parenting, outline style
- Lottie JSON Structure
- Bezier Curves and Easing
- Shape Modifiers
- Advanced Animation
- SVG to Lottie Conversion
- Animation Examples
- Official Lottie Documentation
Final Checklist
- Motion philosophy defined
- SVG structure analyzed (path commands understood)
- Animation strategy selected (consider frame-by-frame for characters)
- Vertex counts verified (for morphing)
- Anchor points set correctly (for rotation)
- Parent hierarchy established (for characters)
- Keyframes with professional easing
- Animation principles applied (anticipation, follow-through)
- Stroke + fill style applied (for outline look)
- Seamless loop verified (if applicable)
- JSON validated
- Preview tested at https://lottiefiles.com/preview
Gives 0 of the 12 instructions most css styling skills give in ~4.5k tokens
Counted across 586 of the 596 authors here whose files we hold, read 2026-08-06
- avoid excessive centered layoutsin 55 of 586, across 12 files
- bundle code into single HTML filein 54 of 586, across 14 files
- Respect prefers-reduced-motion user settingsin 52 of 586, across 35 files
- avoid purple gradientsin 51 of 586, across 11 files
- avoid uniform rounded cornersin 51 of 586, across 11 files
- avoid Inter fontin 51 of 586, across 11 files
- edit generated files to develop artifactin 50 of 586, across 10 files
- animate only transform and opacity propertiesin 43 of 586
- Make touch targets at least 44x44 pixelsin 41 of 586, across 15 files
- Ensure minimum color contrast of 4.5:1in 39 of 586, across 10 files
- use tailwind cssin 39 of 586, across 24 files
- Use SVG icons instead of emojisin 38 of 586, across 11 files
Said here and by no other author read
- Define motion philosophy before animating
- Analyze SVG structure and hierarchy thoroughly
- Use frame-by-frame technique for complex characters
- Match vertex counts exactly when morphing paths
- Preserve volume when applying squash and stretch
- Match first and last keyframe values for loops
Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.