skills/animator/SKILL.md
Create short video animations from HTML/CSS/JS. Frame-by-frame capture at 30fps using Playwright + ffmpeg. Write CSS animations normally - the recorder pauses and steps them. Use for product demos, social clips, ad creative, feature announcements.
npx skillsauth add changeflowhq/skills animatorInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Create short mp4 videos from HTML/CSS/JS animations. Frame-by-frame capture using Playwright + ffmpeg. Deterministic, smooth, pixel-perfect 30fps output.
Read ~/.claude/skills/animator/LEARNED.md at the start of every task. If it doesn't exist, create it with a # Learned header.
Capture learnings when you detect:
Before appending, check:
Format: One line, actionable. Write the rule, not the story.
Don't ask permission. Append and move on.
node ~/.claude/skills/animator/scripts/record.js animation.html output.mp4
Options: --fps 30 --width 1280 --height 720
Start from the template: ~/.claude/skills/animator/templates/boilerplate.html
width x height (default 1280x720) with overflow: hiddenwindow.ANIMATION = { fps: 30, totalFrames: N }currentTime per frame. Easing, delays, fill-mode all work.window.renderFrame = function(frame, totalFrames) {} for anything CSS can't do (dynamic text, data-driven, conditional logic)animation-fill-mode: forwards to hold final stateanimation-delay to sequence elements (stagger entrances)cubic-bezier() renders perfectly frame-by-frameclip-path, filter, backdrop-filter, transforms all workframe is 0-indexed, totalFrames is the total countprogress = frame / totalFrames gives 0 to 1Staggered entrance:
.item:nth-child(1) { animation: fadeIn 0.5s 0.0s forwards; }
.item:nth-child(2) { animation: fadeIn 0.5s 0.2s forwards; }
.item:nth-child(3) { animation: fadeIn 0.5s 0.4s forwards; }
Typewriter (JS):
window.renderFrame = function(frame, total) {
const text = "Hello, world";
const chars = Math.floor((frame / total) * text.length);
document.getElementById('typed').textContent = text.slice(0, chars);
};
Scene transitions:
.scene-1 { animation: fadeOut 0.3s 2s forwards; }
.scene-2 { animation: fadeIn 0.3s 2.3s forwards; opacity: 0; }
requestAnimationFrame loops - use renderFrame() insteadsetInterval/setTimeout for animation - they won't sync with frame capturetools
Invisible Chrome automation for web scraping via CDP. Use when WebFetch fails or gets blocked (403, 429, Cloudflare, bot protection, JS-rendered pages). Launches your real Chrome install completely hidden, sends commands via Chrome DevTools Protocol. Sites see a normal browser with real extensions - no detectable automation. Learns which domains block and skips straight to stealth on future requests. Also handles form filling, clicking, screenshots, and scraping dynamic content.
development
Local semantic search engine for markdown knowledge bases using qmd (tobi/qmd). Indexes markdown files with BM25 keyword search, vector embeddings for semantic search, and hybrid reranked queries. Auto-indexes on file edits via Claude Code hooks and refreshes embeddings overnight via launchd. Use when searching project docs, knowledge bases, meeting notes, or any indexed markdown collection.
development
Create, restructure, and validate Claude Code skills following best practices. Handles directory structure, YAML frontmatter, progressive disclosure, credential management, self-learning with consolidation, and script organization. Use when creating new skills, restructuring existing skills, reviewing skills for quality, or asking about skill structure, patterns, or best practices.
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.