Rank
70
AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents
Traction
No public download signal
Freshness
Updated 2d ago
Crawler Summary
This skill should be used when the user asks to "animate elements", "add animations", "create transitions", "use anime.js", "implement motion", "add scroll animations", "create timeline animations", "stagger animations", "animate SVG", "add draggable elements", or needs guidance on anime.js v4 patterns, easing, performance, or React/Next.js animation integration. --- name: anime.js Best Practices description: This skill should be used when the user asks to "animate elements", "add animations", "create transitions", "use anime.js", "implement motion", "add scroll animations", "create timeline animations", "stagger animations", "animate SVG", "add draggable elements", or needs guidance on anime.js v4 patterns, easing, performance, or React/Next.js animation integration. version Published capability contract available. No trust telemetry is available yet. 2 GitHub stars reported by the source. Last updated 3/1/2026.
Freshness
Last checked 3/1/2026
Best For
Contract is available with explicit auth and schema references.
Not Ideal For
anime.js Best Practices is not ideal for teams that need stronger public trust telemetry, lower setup complexity, or more explicit contract coverage before production rollout.
Evidence Sources Checked
editorial-content, capability-contract, runtime-metrics, public facts pack
This skill should be used when the user asks to "animate elements", "add animations", "create transitions", "use anime.js", "implement motion", "add scroll animations", "create timeline animations", "stagger animations", "animate SVG", "add draggable elements", or needs guidance on anime.js v4 patterns, easing, performance, or React/Next.js animation integration. --- name: anime.js Best Practices description: This skill should be used when the user asks to "animate elements", "add animations", "create transitions", "use anime.js", "implement motion", "add scroll animations", "create timeline animations", "stagger animations", "animate SVG", "add draggable elements", or needs guidance on anime.js v4 patterns, easing, performance, or React/Next.js animation integration. version
Public facts
7
Change events
1
Artifacts
0
Freshness
Mar 1, 2026
Published capability contract available. No trust telemetry is available yet. 2 GitHub stars reported by the source. Last updated 3/1/2026.
Trust score
Unknown
Compatibility
OpenClaw
Freshness
Mar 1, 2026
Vendor
Davidosemwegie
Artifacts
0
Benchmarks
0
Last release
Unpublished
Key links, install path, and a quick operational read before the deeper crawl record.
Summary
Published capability contract available. No trust telemetry is available yet. 2 GitHub stars reported by the source. Last updated 3/1/2026.
Setup snapshot
git clone https://github.com/davidosemwegie/animejs-best-practices.gitSetup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.
Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data.
Everything public we have scraped or crawled about this agent, grouped by evidence type with provenance.
Vendor
Davidosemwegie
Protocol compatibility
OpenClaw
Auth modes
api_key
Machine-readable schemas
OpenAPI or schema references published
Adoption signal
2 GitHub stars
Handshake status
UNKNOWN
Crawlable docs
6 indexed pages on the official domain
Merged public release, docs, artifact, benchmark, pricing, and trust refresh events.
Extracted files, examples, snippets, parameters, dependencies, permissions, and artifact metadata.
Extracted files
0
Examples
6
Snippets
0
Languages
typescript
Parameters
javascript
// Recommended: from main module
import { waapi, stagger, splitText } from 'animejs';
// Or standalone (smallest bundle)
import { waapi } from 'animejs/waapi';javascript
// WAAPI - hardware accelerated, lightweight
waapi.animate('.element', {
translateX: 200,
rotate: 180,
opacity: [0, 1],
duration: 800,
ease: 'outExpo'
});javascript
import { animate } from 'animejs';
// Use animate() for: 500+ targets, JS objects, complex timelines, SVG morphing
animate(myJsObject, {
value: 100,
onUpdate: () => renderCanvas(myJsObject) // Extensive callbacks
});javascript
// Native WAAPI (no anime.js needed)
element.animate([
{ opacity: 0, transform: 'translateY(20px)' },
{ opacity: 1, transform: 'translateY(0)' }
], {
duration: 500, // ALWAYS milliseconds
easing: 'ease-out', // default is 'linear', not 'ease'!
fill: 'forwards'
});text
Animation: "Bouncing Text"
Target: "hello world" (11 characters)
Timeline visualization:
t=0ms h e l l o w o r l d [all at baseline]
t=100ms H e l l o w o r l d [h bounces up]
t=180ms h E l l o w o r l d [e bounces up]
t=260ms h e L l o w o r l d [l bounces up]
...continues with 80ms stagger...
Movement pattern per character:
↑ (-20px)
│
────┼──── baseline
│
↓ (return)
Duration: 300ms up + 300ms down = 600ms per bounce
Loop: continuous
Total animation time: 3000ms requestedtext
Engine Decision: - Target count: 11 characters (< 500) ✅ WAAPI OK - Animation type: CSS transforms (translateY) ✅ WAAPI OK - Callbacks needed: None ✅ WAAPI OK - Bundle size: Want smallest ✅ WAAPI preferred → Decision: Use waapi.animate()
Full documentation captured from public sources, including the complete README when available.
Docs source
GITHUB OPENCLEW
Editorial quality
ready
This skill should be used when the user asks to "animate elements", "add animations", "create transitions", "use anime.js", "implement motion", "add scroll animations", "create timeline animations", "stagger animations", "animate SVG", "add draggable elements", or needs guidance on anime.js v4 patterns, easing, performance, or React/Next.js animation integration. --- name: anime.js Best Practices description: This skill should be used when the user asks to "animate elements", "add animations", "create transitions", "use anime.js", "implement motion", "add scroll animations", "create timeline animations", "stagger animations", "animate SVG", "add draggable elements", or needs guidance on anime.js v4 patterns, easing, performance, or React/Next.js animation integration. version
A comprehensive guide for implementing animations with anime.js v4 - the lightweight JavaScript animation engine.
anime.js v4 provides a powerful API for animating CSS properties, SVG attributes, DOM elements, and JavaScript objects. This skill covers best practices, common patterns, and performance optimization for both vanilla JavaScript and React/Next.js applications.
Always prefer waapi.animate() over animate() unless you need JS engine features.
| Use waapi.animate() when: | Use animate() when: |
|----------------------------|----------------------|
| ✅ Simple CSS transforms/opacity | ❌ Animating 500+ targets |
| ✅ Bundle size matters (3KB vs 10KB) | ❌ Animating JS objects, Canvas, WebGL |
| ✅ CPU/network load is high | ❌ Complex timeline orchestration |
| ✅ Need hardware acceleration | ❌ Need extensive callbacks (onRender, etc.) |
| ✅ CSS color functions | ❌ SVG path morphing |
// Recommended: from main module
import { waapi, stagger, splitText } from 'animejs';
// Or standalone (smallest bundle)
import { waapi } from 'animejs/waapi';
// WAAPI - hardware accelerated, lightweight
waapi.animate('.element', {
translateX: 200,
rotate: 180,
opacity: [0, 1],
duration: 800,
ease: 'outExpo'
});
| Property | CSS | WAAPI/anime.js |
|----------|-----|----------------|
| Duration | 2s | 2000 (milliseconds!) |
| Infinite | infinite | Infinity (JS constant) |
| Default easing | ease | linear |
| Iterations | animation-iteration-count | iterations |
Common bug: Animation not visible because duration is 2 (2ms) instead of 2000 (2s).
import { animate } from 'animejs';
// Use animate() for: 500+ targets, JS objects, complex timelines, SVG morphing
animate(myJsObject, {
value: 100,
onUpdate: () => renderCanvas(myJsObject) // Extensive callbacks
});
anime.js waapi.animate() wraps the browser's native Element.animate(). Use native when:
commitStyles(), persist(), getAnimations()// Native WAAPI (no anime.js needed)
element.animate([
{ opacity: 0, transform: 'translateY(20px)' },
{ opacity: 1, transform: 'translateY(0)' }
], {
duration: 500, // ALWAYS milliseconds
easing: 'ease-out', // default is 'linear', not 'ease'!
fill: 'forwards'
});
See references/native-waapi.md for complete native WAAPI documentation.
Before writing any animation code, ALWAYS follow this planning workflow:
Present an ASCII/text visualization of the animation to the user:
Animation: "Bouncing Text"
Target: "hello world" (11 characters)
Timeline visualization:
t=0ms h e l l o w o r l d [all at baseline]
t=100ms H e l l o w o r l d [h bounces up]
t=180ms h E l l o w o r l d [e bounces up]
t=260ms h e L l o w o r l d [l bounces up]
...continues with 80ms stagger...
Movement pattern per character:
↑ (-20px)
│
────┼──── baseline
│
↓ (return)
Duration: 300ms up + 300ms down = 600ms per bounce
Loop: continuous
Total animation time: 3000ms requested
Decide which animation engine to use:
Engine Decision:
- Target count: 11 characters (< 500) ✅ WAAPI OK
- Animation type: CSS transforms (translateY) ✅ WAAPI OK
- Callbacks needed: None ✅ WAAPI OK
- Bundle size: Want smallest ✅ WAAPI preferred
→ Decision: Use waapi.animate()
List the specific anime.js functions required:
APIs needed:
- splitText() - to split "hello world" into individual character elements
- waapi.animate() - hardware-accelerated animation (WAAPI-first!)
- stagger() - to offset each character's animation start time
Why splitText() over manual splitting:
- Handles accessibility (aria-label)
- Provides proper data attributes (data-char, data-word, data-line)
- Handles whitespace correctly
- Returns animatable element arrays directly
Show the math for timing. Remember: WAAPI uses milliseconds, not seconds!
Timing calculation (all values in MILLISECONDS):
- User requested: 3 seconds = 3000ms
- Bounce cycle: 300ms up + 300ms down = 600ms
- Characters: 11
- Stagger delay: 80ms between each
- Last char starts at: 10 × 80ms = 800ms
- Full sequence: 800ms + 600ms = 1400ms
- For 3000ms total: loop: true (repeats ~2x)
⚠️ VERIFY: duration: 600 (not 0.6!)
⚠️ VERIFY: delay: 80 (not 0.08!)
Verify accessibility is handled:
Accessibility:
- [ ] Will respect prefers-reduced-motion? YES - will add check
- [ ] Duration reasonable? YES - 600ms (not too fast/slow)
- [ ] Essential content visible without animation? YES
Always ask: "Does this animation plan look correct? Should I proceed with implementation?"
Only after confirmation, write the code using the exact APIs specified.
npm install animejs
Use named imports from the main module (recommended for bundlers with tree-shaking):
import { animate, createTimeline, stagger, utils } from 'animejs';
For projects without bundlers or when tree-shaking is ineffective, use subpath imports:
import { animate } from 'animejs/animation';
import { createTimeline } from 'animejs/timeline';
import { stagger, random } from 'animejs/utils';
import { splitText } from 'animejs/text';
import { svg } from 'animejs/svg';
import { waapi } from 'animejs';
// Use WAAPI for CSS transforms - hardware accelerated!
waapi.animate('.element', {
translateX: 250,
rotate: '1turn',
opacity: 0.5,
duration: 1000,
ease: 'outExpo'
});
Both waapi.animate() and animate() accept multiple target formats:
import { waapi } from 'animejs';
// CSS selector
waapi.animate('.my-class', { opacity: 0 });
// DOM element
waapi.animate(document.querySelector('#element'), { scale: 1.5 });
// Array of elements
waapi.animate([el1, el2, el3], { translateY: 100 });
import { animate } from 'animejs';
// Use animate() for JavaScript objects (WAAPI can't do this)
const obj = { value: 0 };
animate(obj, {
value: 100,
duration: 1000,
onUpdate: () => console.log(obj.value)
});
translateX, translateY, translateZ, rotate, rotateX, rotateY, rotateZ, scale, scaleX, scaleY, skew, skewX, skewYopacity, width, height, margin, padding, borderRadius, backgroundColor, color'--custom-property'cx, cy, r, fill, stroke, strokeDashoffset, points, danimate('.element', {
// Absolute values
translateX: 250,
// With units
width: '100%',
// Relative values
translateY: '+=50', // Add 50 to current
rotate: '-=45deg', // Subtract 45deg
// From-to array
opacity: [0, 1], // Animate from 0 to 1
// Function-based (per target)
scale: (el, i) => 1 + i * 0.1,
// Keyframes
translateX: [
{ value: 100, duration: 500 },
{ value: 0, duration: 500 }
]
});
Note: Complex timelines require the JS engine (createTimeline), not WAAPI.
Orchestrate multiple animations with precise control:
import { createTimeline } from 'animejs';
const tl = createTimeline({
defaults: { duration: 800, ease: 'outExpo' }
});
tl.add('.box-1', { translateX: 250 })
.add('.box-2', { translateY: 100 }, '-=400') // Start 400ms before previous ends
.add('.box-3', { scale: 1.5 }, '+=200'); // Start 200ms after previous ends
const tl = createTimeline();
tl.add('.intro', { opacity: [0, 1] })
.label('afterIntro')
.add('.content', { translateY: [50, 0] }, 'afterIntro')
.add('.sidebar', { translateX: [-100, 0] }, 'afterIntro+=200');
const tl = createTimeline({ autoplay: false });
// Add animations...
tl.play();
tl.pause();
tl.reverse();
tl.seek(500); // Jump to 500ms
tl.restart();
tl.complete(); // Jump to end
Create sequential animations across multiple elements (works with both WAAPI and JS engine):
import { waapi, stagger } from 'animejs';
// Time staggering (WAAPI)
waapi.animate('.item', {
translateY: [50, 0],
opacity: [0, 1],
delay: stagger(100) // 100ms between each
});
// Grid staggering (WAAPI)
waapi.animate('.grid-item', {
scale: [0, 1],
delay: stagger(50, {
grid: [10, 10],
from: 'center',
axis: 'y'
})
});
// Stagger with easing (WAAPI)
waapi.animate('.item', {
translateX: 200,
delay: stagger(100, { ease: 'outQuad' })
});
import { animate, stagger } from 'animejs';
// Value staggering requires JS engine
animate('.bar', {
height: stagger([100, 200, 150, 250]) // Specific values per element
});
ALWAYS use splitText() for character/word/line animations - never manually split text.
import { waapi, splitText, stagger } from 'animejs';
// Split text into characters, words, and lines
const { chars, words, lines } = splitText('.text-element', {
chars: true,
words: true,
lines: true
});
// Animate characters with WAAPI (hardware accelerated)
waapi.animate(chars, {
translateY: [-20, 0],
opacity: [0, 1],
delay: stagger(50),
duration: 600,
ease: 'outExpo'
});
const split = splitText('.text', {
// What to split into
chars: true, // Split into characters
words: true, // Split into words
lines: true, // Split into lines
// Wrap elements for clipping effects
chars: { wrap: 'span', class: 'char' },
words: { wrap: 'clip' }, // 'clip' adds overflow:hidden for reveal effects
lines: { wrap: 'div' },
// Accessibility
accessible: true, // Adds aria-label to preserve screen reader text
// Include space characters as elements
includeSpaces: true
});
// Access results
split.chars // Array of character span elements
split.words // Array of word elements
split.lines // Array of line elements
import { waapi, splitText, stagger } from 'animejs';
// Split the text
const { chars } = splitText('.bouncing-text', { chars: true });
// Bouncing animation with WAAPI
waapi.animate(chars, {
translateY: [-20, 0], // Simple keyframes for WAAPI
delay: stagger(80),
duration: 600, // Full bounce cycle
loop: true,
alternate: true, // Bounce back down
ease: 'inOutQuad'
});
import { waapi, splitText, stagger } from 'animejs';
const { chars } = splitText('.wave-text', { chars: true });
waapi.animate(chars, {
translateY: -15,
delay: stagger(40, { from: 'center' }),
duration: 400,
loop: true,
alternate: true,
ease: 'inOutSine'
});
import { waapi, splitText, stagger } from 'animejs';
const { words } = splitText('.reveal-text', {
words: { wrap: 'clip' } // Clip overflow for reveal effect
});
waapi.animate(words, {
translateY: ['100%', '0%'],
delay: stagger(100),
duration: 800,
ease: 'outExpo'
});
'use client';
import { useEffect, useRef } from 'react';
import { waapi, splitText, stagger } from 'animejs';
export function AnimatedText({ children, className }) {
const textRef = useRef(null);
useEffect(() => {
if (!textRef.current) return;
const { chars } = splitText(textRef.current, {
chars: true,
accessible: true
});
// Use WAAPI for hardware-accelerated text animation
const anim = waapi.animate(chars, {
translateY: [20, 0],
opacity: [0, 1],
delay: stagger(30),
duration: 600,
ease: 'outExpo'
});
return () => anim.cancel();
}, [children]);
return <span ref={textRef} className={className}>{children}</span>;
}
Pattern: {in|out|inOut}{Quad|Cubic|Quart|Quint|Sine|Expo|Circ|Back|Elastic|Bounce}
animate('.element', {
translateX: 200,
ease: 'outExpo' // Common choice for UI
});
animate('.element', {
translateX: 200,
ease: 'inOutQuad' // Smooth acceleration/deceleration
});
import { cubicBezier } from 'animejs';
animate('.element', {
translateX: 200,
ease: cubicBezier(0.7, 0.1, 0.5, 0.9)
});
import { spring } from 'animejs';
animate('.element', {
translateX: 200,
ease: spring({ bounce: 0.25, duration: 800 })
});
// Stiffness/damping control
animate('.element', {
scale: 1.2,
ease: spring({ stiffness: 90, damping: 14 })
});
animate('.element', {
translateX: 200,
ease: 'steps(5)' // 5 discrete steps
});
animate('.element', {
translateX: 200,
onBegin: (anim) => console.log('Started'),
onUpdate: (anim) => console.log(anim.progress),
onComplete: (anim) => console.log('Done'),
onLoop: (anim) => console.log('Loop iteration')
});
await animate('.step-1', { opacity: [0, 1] }).then();
await animate('.step-2', { translateY: [50, 0] }).then();
await animate('.step-3', { scale: [0.8, 1] }).then();
const anim = animate('.element', {
translateX: 200,
autoplay: false
});
anim.play();
anim.pause();
anim.reverse();
anim.restart();
anim.seek(500); // Jump to 500ms
anim.stretch(2000); // Change duration to 2000ms
anim.playbackRate = 2; // Double speed
import { useRef, useEffect } from 'react';
import { waapi } from 'animejs';
function AnimatedComponent() {
const elementRef = useRef(null);
useEffect(() => {
if (elementRef.current) {
// WAAPI for hardware-accelerated animations
waapi.animate(elementRef.current, {
translateY: [20, 0],
opacity: [0, 1],
duration: 600,
ease: 'outExpo'
});
}
}, []);
return <div ref={elementRef}>Animated content</div>;
}
useEffect(() => {
const anim = waapi.animate(elementRef.current, {
translateX: [0, 200],
loop: true
});
return () => anim.cancel(); // Cancel on unmount
}, []);
import { useRef, useEffect, useCallback } from 'react';
import { waapi } from 'animejs';
function useAnimation(config) {
const elementRef = useRef(null);
const animationRef = useRef(null);
const play = useCallback(() => {
if (elementRef.current) {
animationRef.current = waapi.animate(elementRef.current, config);
}
}, [config]);
useEffect(() => {
return () => animationRef.current?.cancel();
}, []);
return { ref: elementRef, play };
}
Animation code must run client-side. Mark components with 'use client':
'use client';
import { useEffect, useRef } from 'react';
import { waapi } from 'animejs';
export function AnimatedCard({ children }) {
const ref = useRef(null);
useEffect(() => {
// WAAPI is ideal for simple entrance animations
waapi.animate(ref.current, {
opacity: [0, 1],
translateY: [20, 0],
duration: 600,
ease: 'outExpo'
});
}, []);
return <div ref={ref}>{children}</div>;
}
ALWAYS respect user preferences for reduced motion.
const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
if (prefersReducedMotion) {
// No animation - instant state change
element.style.opacity = '1';
} else {
waapi.animate(element, { opacity: [0, 1], duration: 600 });
}
See references/accessibility-and-testing.md for React hook and full patterns.
translateX/Y, scale, rotate instead of width, height, top, leftwill-change sparingly: Add only when needed, remove after animationcancel() when components unmountrequestAnimationFrame rate: Default frameRate is optimal for most casesComprehensive API documentation fetched from animejs.com:
| Category | File | Content |
|----------|------|---------|
| Core | docs/getting-started/README.md | Installation, imports, basic usage |
| Core | docs/timer/README.md | createTimer API, playback, callbacks |
| Animation | docs/animation/targets-and-properties.md | CSS selectors, DOM elements, JS objects |
| Animation | docs/animation/tween-values-and-parameters.md | Value types, tween params |
| Animation | docs/animation/keyframes-playback-methods.md | Keyframes, playback controls |
| Timeline | docs/timeline/README.md | Timeline creation, time positioning |
| Animatable | docs/animatable/README.md | Reactive animatable objects |
| Draggable | docs/draggable/README.md | Draggable API, physics settings |
| Layout | docs/layout/README.md | FLIP animations, enter/exit states |
| Scope | docs/scope/README.md | Scoped animations, media queries |
| Events | docs/events/onscroll/README.md | ScrollObserver, thresholds, sync |
| SVG | docs/svg/README.md | morphTo, createDrawable, createMotionPath |
| Text | docs/text/splittext/README.md | Text splitting, lines/words/chars |
| Utilities | docs/utilities/stagger/README.md | Stagger function, grid staggering |
| Utilities | docs/utilities/helpers.md | $(), get(), set(), random, math |
| Easings | docs/easings/README.md | Built-in eases, spring physics |
| WAAPI | docs/web-animation-api/README.md | Hardware acceleration, API differences |
| Engine | docs/engine/README.md | Engine config, time units, FPS |
Native browser Web Animations API documentation from MDN:
| Category | File | Content |
|----------|------|---------|
| Guides | docs/web-animations-api/guides/README.md | Overview, concepts, keyframe formats, tips |
| Interfaces | docs/web-animations-api/interfaces/animation.md | Animation, AnimationEffect, KeyframeEffect |
| Interfaces | docs/web-animations-api/interfaces/timelines.md | AnimationTimeline, DocumentTimeline, ScrollTimeline, ViewTimeline |
| Methods | docs/web-animations-api/methods/README.md | Element.animate(), getAnimations(), events |
For patterns and techniques beyond the API docs:
references/accessibility-and-testing.md - prefers-reduced-motion, TypeScript, testing, common mistakesreferences/native-waapi.md - Native Web Animations API (Element.animate) - timing, keyframes, playback controlsreferences/scroll-animations.md - ScrollObserver patterns and scroll-triggered animationsreferences/svg-animations.md - SVG morphing, path drawing, and motion pathsreferences/advanced-patterns.md - Text animations, draggable elements, layout animationsWorking examples in examples/:
basic-animation.js - Core animation patternstimeline-sequence.js - Timeline orchestrationreact-integration.jsx - React hooks and patternsscroll-reveal.js - Scroll-triggered animationsMachine endpoints, protocol fit, contract coverage, invocation examples, and guardrails for agent-to-agent use.
Contract coverage
Status
ready
Auth
api_key
Streaming
No
Data region
global
Protocol support
Requires: openclew, lang:typescript
Forbidden: none
Guardrails
Operational confidence: medium
curl -s "https://xpersona.co/api/v1/agents/davidosemwegie-animejs-best-practices/snapshot"
curl -s "https://xpersona.co/api/v1/agents/davidosemwegie-animejs-best-practices/contract"
curl -s "https://xpersona.co/api/v1/agents/davidosemwegie-animejs-best-practices/trust"
Trust and runtime signals, benchmark suites, failure patterns, and practical risk constraints.
Trust signals
Handshake
UNKNOWN
Confidence
unknown
Attempts 30d
unknown
Fallback rate
unknown
Runtime metrics
Observed P50
unknown
Observed P95
unknown
Rate limit
unknown
Estimated cost
unknown
Every public screenshot, visual asset, demo link, and owner-provided destination tied to this agent.
Neighboring agents from the same protocol and source ecosystem for comparison and shortlist building.
Rank
70
AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents
Traction
No public download signal
Freshness
Updated 2d ago
Rank
70
AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs
Traction
No public download signal
Freshness
Updated 6d ago
Rank
70
Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!
Traction
No public download signal
Freshness
Updated 7d ago
Rank
70
The Frontend for Agents & Generative UI. React + Angular
Traction
No public download signal
Freshness
Updated 23d ago
Contract JSON
{
"contractStatus": "ready",
"authModes": [
"api_key"
],
"requires": [
"openclew",
"lang:typescript"
],
"forbidden": [],
"supportsMcp": false,
"supportsA2a": false,
"supportsStreaming": false,
"inputSchemaRef": "https://github.com/davidosemwegie/animejs-best-practices#input",
"outputSchemaRef": "https://github.com/davidosemwegie/animejs-best-practices#output",
"dataRegion": "global",
"contractUpdatedAt": "2026-02-24T19:45:33.344Z",
"sourceUpdatedAt": "2026-02-24T19:45:33.344Z",
"freshnessSeconds": 4444500
}Invocation Guide
{
"preferredApi": {
"snapshotUrl": "https://xpersona.co/api/v1/agents/davidosemwegie-animejs-best-practices/snapshot",
"contractUrl": "https://xpersona.co/api/v1/agents/davidosemwegie-animejs-best-practices/contract",
"trustUrl": "https://xpersona.co/api/v1/agents/davidosemwegie-animejs-best-practices/trust"
},
"curlExamples": [
"curl -s \"https://xpersona.co/api/v1/agents/davidosemwegie-animejs-best-practices/snapshot\"",
"curl -s \"https://xpersona.co/api/v1/agents/davidosemwegie-animejs-best-practices/contract\"",
"curl -s \"https://xpersona.co/api/v1/agents/davidosemwegie-animejs-best-practices/trust\""
],
"jsonRequestTemplate": {
"query": "summarize this repo",
"constraints": {
"maxLatencyMs": 2000,
"protocolPreference": [
"OPENCLEW"
]
}
},
"jsonResponseTemplate": {
"ok": true,
"result": {
"summary": "...",
"confidence": 0.9
},
"meta": {
"source": "GITHUB_OPENCLEW",
"generatedAt": "2026-04-17T06:20:33.494Z"
}
},
"retryPolicy": {
"maxAttempts": 3,
"backoffMs": [
500,
1500,
3500
],
"retryableConditions": [
"HTTP_429",
"HTTP_503",
"NETWORK_TIMEOUT"
]
}
}Trust JSON
{
"status": "unavailable",
"handshakeStatus": "UNKNOWN",
"verificationFreshnessHours": null,
"reputationScore": null,
"p95LatencyMs": null,
"successRate30d": null,
"fallbackRate": null,
"attempts30d": null,
"trustUpdatedAt": null,
"trustConfidence": "unknown",
"sourceUpdatedAt": null,
"freshnessSeconds": null
}Capability Matrix
{
"rows": [
{
"key": "OPENCLEW",
"type": "protocol",
"support": "unknown",
"confidenceSource": "profile",
"notes": "Listed on profile"
}
],
"flattenedTokens": "protocol:OPENCLEW|unknown|profile"
}Facts JSON
[
{
"factKey": "docs_crawl",
"category": "integration",
"label": "Crawlable docs",
"value": "6 indexed pages on the official domain",
"href": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
"sourceUrl": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
"sourceType": "search_document",
"confidence": "medium",
"observedAt": "2026-04-15T05:03:46.393Z",
"isPublic": true
},
{
"factKey": "vendor",
"category": "vendor",
"label": "Vendor",
"value": "Davidosemwegie",
"href": "https://github.com/davidosemwegie/animejs-best-practices",
"sourceUrl": "https://github.com/davidosemwegie/animejs-best-practices",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-03-01T06:05:22.941Z",
"isPublic": true
},
{
"factKey": "traction",
"category": "adoption",
"label": "Adoption signal",
"value": "2 GitHub stars",
"href": "https://github.com/davidosemwegie/animejs-best-practices",
"sourceUrl": "https://github.com/davidosemwegie/animejs-best-practices",
"sourceType": "profile",
"confidence": "medium",
"observedAt": "2026-03-01T06:05:22.941Z",
"isPublic": true
},
{
"factKey": "protocols",
"category": "compatibility",
"label": "Protocol compatibility",
"value": "OpenClaw",
"href": "https://xpersona.co/api/v1/agents/davidosemwegie-animejs-best-practices/contract",
"sourceUrl": "https://xpersona.co/api/v1/agents/davidosemwegie-animejs-best-practices/contract",
"sourceType": "contract",
"confidence": "medium",
"observedAt": "2026-02-24T19:45:33.344Z",
"isPublic": true
},
{
"factKey": "auth_modes",
"category": "compatibility",
"label": "Auth modes",
"value": "api_key",
"href": "https://xpersona.co/api/v1/agents/davidosemwegie-animejs-best-practices/contract",
"sourceUrl": "https://xpersona.co/api/v1/agents/davidosemwegie-animejs-best-practices/contract",
"sourceType": "contract",
"confidence": "high",
"observedAt": "2026-02-24T19:45:33.344Z",
"isPublic": true
},
{
"factKey": "schema_refs",
"category": "artifact",
"label": "Machine-readable schemas",
"value": "OpenAPI or schema references published",
"href": "https://github.com/davidosemwegie/animejs-best-practices#input",
"sourceUrl": "https://xpersona.co/api/v1/agents/davidosemwegie-animejs-best-practices/contract",
"sourceType": "contract",
"confidence": "high",
"observedAt": "2026-02-24T19:45:33.344Z",
"isPublic": true
},
{
"factKey": "handshake_status",
"category": "security",
"label": "Handshake status",
"value": "UNKNOWN",
"href": "https://xpersona.co/api/v1/agents/davidosemwegie-animejs-best-practices/trust",
"sourceUrl": "https://xpersona.co/api/v1/agents/davidosemwegie-animejs-best-practices/trust",
"sourceType": "trust",
"confidence": "medium",
"observedAt": null,
"isPublic": true
}
]Change Events JSON
[
{
"eventType": "docs_update",
"title": "Docs refreshed: Sign in to GitHub · GitHub",
"description": "Fresh crawlable documentation was indexed for the official domain.",
"href": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
"sourceUrl": "https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar",
"sourceType": "search_document",
"confidence": "medium",
"observedAt": "2026-04-15T05:03:46.393Z",
"isPublic": true
}
]Sponsored
Ads related to anime.js Best Practices and adjacent AI workflows.