Painted Animation
tuzhechen2005/opus-video-skills
Make hand-painted watercolour-and-ink cartoon videos (MP4) with code — p5.js + p5.brush rendered frame by frame in headless Chrome, encoded with ffmpeg — starring Clawd or any character.
Make a short procedural animation in any style — an explainer, a history, a little story — as a single-file canvas video with a synthesized score, rendered to MP4.
$ npx skills add cth9191/animate --skill animate -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install cth9191/animate animate --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/cth9191/animate.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/animate/skills/animate .claude/skills/animate && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "animate" agent skill from https://github.com/cth9191/animate/tree/main/plugins/animate/skills/animate into .claude/skills/animate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "animate", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/cth9191/animate/tree/main/plugins/animate/skills/animateType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add cth9191/animate --skill animate -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install cth9191/animate animate --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cth9191/animate.git skills-src && mkdir -p .agents/skills && cp -r skills-src/plugins/animate/skills/animate .agents/skills/animate && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "animate" agent skill from https://github.com/cth9191/animate/tree/main/plugins/animate/skills/animate into .agents/skills/animate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "animate", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add cth9191/animate --skill animate -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install cth9191/animate animate --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cth9191/animate.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/plugins/animate/skills/animate .cursor/skills/animate && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "animate" agent skill from https://github.com/cth9191/animate/tree/main/plugins/animate/skills/animate into .cursor/skills/animate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "animate", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/cth9191/animate.git --path plugins/animate/skills/animate--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add cth9191/animate --skill animate -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install cth9191/animate animate --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cth9191/animate.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/plugins/animate/skills/animate .gemini/skills/animate && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "animate" agent skill from https://github.com/cth9191/animate/tree/main/plugins/animate/skills/animate into .gemini/skills/animate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "animate", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install cth9191/animate animateInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add cth9191/animate --skill animate -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/cth9191/animate.git skills-src && mkdir -p .github/skills && cp -r skills-src/plugins/animate/skills/animate .github/skills/animate && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "animate" agent skill from https://github.com/cth9191/animate/tree/main/plugins/animate/skills/animate into .github/skills/animate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "animate", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add cth9191/animate --skill animate -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install cth9191/animate animate --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/cth9191/animate.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/plugins/animate/skills/animate .opencode/skills/animate && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "animate" agent skill from https://github.com/cth9191/animate/tree/main/plugins/animate/skills/animate into .opencode/skills/animate/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "animate", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
animateMake a short procedural animation in any style — an explainer, a history, a little story — as a single-file canvas video with a synthesized score, rendered to MP4.
Animate is an agent skill from cth9191/animate. Make a short procedural animation in any style — an explainer, a history, a little story — as a single-file canvas video with a synthesized score, rendered to MP4. Ships with styles (cut paper, crosshatch ink, riso print, sketchbook, manim-style math, pixel art, isometric line art) and makes new ones from the user's references. Walks the user through intake, then three check-ins (story, look, storyboard) before animating, and proves the result with measured review checks. Use when the user asks for an animated…
Its SKILL.md is about 4.5k tokens, which your agent loads only when the skill is triggered. The skill folder holds 142 other files (for example `craft.md`, `examples/history-of-ai/brief.md` and `examples/history-of-ai/piece.json`).
It sits in Media & Creative, covering Comics and storyboards, Motion graphics and Sprites and pixel art. It works with Manim and Playwright. The repository describes itself as: Procedural animation in any style for Claude Code: short single-file canvas videos with story, look and storyboard check-ins. 7 built-in styles or one matched from your… The licence is MIT.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 7e5eb56. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships script files (JavaScript, from the files we listed), which the agent can run.
Shell commands in SKILL.md call:
nodenpmnpxpipFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm, npx and pip, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Animate loads about 4.5k tokens when it runs. Until then it costs about 153 tokens; SKILL.md has 2,598 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from cth9191/animate at commit 7e5eb56, republished under its MIT licence (© cth9191). 2,598 words, ~4,540 tokens.
.claude/skills/animate/SKILL.md (or your agent's skills folder). This skill also uses 137 other files; get the full folder from GitHub.You make short animated videos in code: one <canvas>, drawn and scored procedurally, deterministic frame by frame, rendered with a headless browser and ffmpeg. The story follows a grammar studied from strong short-form animation; the look is a style — a plug-in kit chosen from styles/ or made from the user's references with new-style.md.
Requirements: Node 18+, Playwright with Chromium (npm i -g playwright && npx playwright install chromium), ffmpeg on PATH. Check them first; if one is missing, tell the user the install command and stop. For a voice-over, Python with faster-whisper (pip install faster-whisper) times every word; without it the word times are estimated.
All paths below are relative to this skill's base directory. Pieces live in the user's project at pieces/<name>/ (create pieces/ if needed); styles the user makes live in <project>/styles/<name>/.
sample.png and demo. Then check every key frame against grammar/FRAME.md and the style's own checklist in its STYLE.md.index.html; everything is drawn and synthesized in code — no image/audio/video files, no data: URIs, no URLs, no web fonts in the code. tools/build.mjs enforces it. Two opt-in exceptions, both the user's own: assets (screenshots and logos in <piece>/assets/, embedded by the build) and a music track (joined at export). See Assets and Music below.RNG(...)), the boil index B for per-step variation. Never Math.random() or wall-clock time.tools/review.mjs passes and you have looked at the contact sheets. Report the numbers, not "looks good".Ask the questions in intake.md — only the ones you can't infer. For the look, build the gallery (node tools/gallery.mjs <out.png> [<project>/styles], ~3s), show it and ask: which of these, or show me a reference? Then study the references yourself against FRAME.md and the style's checklist.
Pick the format from grammar/FORMATS.md — the plot engine decides it (a history is a chronology joined by morphs; a mission cuts on the beat; a list is a catalogue). Read grammar/STORY.md. Web-check the facts. Then show the user:
Ask: approve / change beats / different angle. Revise until approved. This is where "I meant X, not Y" gets caught cheaply.
Start the piece at pieces/<name>/: copy piece.json and src/ from the style's demo (styles/<name>/demo/) — it already speaks the style's kit and joins eras with a morph — or from templates/beat-cut/ for a piece that cuts hard on the beat (8ths, a 16th-note rush on odd frames, one era per shot, framings from cameras), or templates/piece/ for the plainest cut-paper morph. Set "style" in piece.json, then write brief.md and LOG.md fresh (the template's are placeholders).
STYLE.md and demo and draw with its kit.tools/measure/refs.mjs); the piece's own style frames are the matched frames, so this is one check-in: the compare sheets and the frames together. Save the style folder after the piece is approved (the piece becomes its "proven on").Draw 2–4 of the most different beats as full-size frames. Each must pass FRAME.md and the style's checklist. Render them side by side with node tools/still.mjs pieces/<name> 2.25,9.75,16.5 look.png --scale 0.5 (or tools/storyboard.mjs with TIMELINE.board set to those beats), and show the image. Ask: thumbs up per frame / change the look / try another style.
Draw every beat in the approved look. Fill TIMELINE.board with one key time per beat ({ t, title, sound, next }) and render the board. Ask for thumbs up/down by panel number and notes; redraw what's down; repeat. The panels are the video's own scene functions, so nothing is redrawn later.
pieces/<name>/brief.md (spec, style, beats, bridges, sound plan, claims + sources). Keep a LOG.md.TT, ev(t, d), popS(t), write-ons (see craft.md → Motion). Wire eras, cameras and bridges in src/bridges.js (morph-joined formats) or leave BRIDGES = [] for hard cuts.node tools/build.mjs pieces/<name> → index.html (the style's kit is pulled in from piece.json "style").node tools/tile.mjs pieces/<name> tile.png <frames...> — look at them; tile across every morph and cut.src/score.js (see craft.md → Sound).node tools/export.mjs pieces/<name> --share → frames, audio.wav, stems, renders/final.mp4, renders/share.mp4 (--formats 9:16,1:1,16:9 for every format; --blur 4 for motion blur on 1s styles). Iterate the mix with --only-audio (re-renders the score and remuxes it, ~4× faster).node tools/review.mjs pieces/<name> → contact sheets per shot, cut grid, morph grid, story arc, anchor, text (cut off / overlapping / under the phone UI) and sound (the loudest moment, the silence before it, LUFS). Fix until it passes, view the sheets, write a per-shot PASS table in LOG.md. Trust the text check over your eye: a cropped label looks fine on a contact sheet.Send renders/share.mp4. Say in a few lines: what it is, the checks' numbers, what the review caught and fixed, the weakest shot, and what you haven't verified (e.g. you can't listen to the score). Ask what should change: story, look, transitions, pacing, sound.
After each run append to the piece's LOG.md. If something new went wrong or worked, propose a one-line rule for craft.md, the style's STYLE.md or a kit change, and add it when the user agrees.
Ask at intake (question 3). With a voice, the voice is the clock: each beat starts ~0.3s after the previous sentence ends, and the big moments land on spoken words. The script is the storyboard: one line per beat.
pieces/<name>/voice/script.json: { "lead": 1.2, "tail": 1.8, "lines": [{ "id": "open", "text": "As it is spoken.", "after": 0.45 }, ...] }. Write numbers and names the way they should be said. Keep it ≤ 3.5 words/s; give a line a longer after where the picture needs time to land (a count, a caption, the silence before the payoff).node tools/voice.mjs pieces/<name> --scratch makes a timing voice with the OS's own speech (never ship it), so the whole piece can be animated and reviewed.voice/<id>.mp3 with "file" set on the line.voice/. It costs about one credit per character; say the total before the full run. If the connector was added during the session, its tools may only appear after the app restarts.node tools/voice.mjs pieces/<name> → voice/voice.wav (the lines with their pauses) and voice.json (every line's and word's start and end, heard in the audio by faster-whisper, locally). The build injects it as VOICE.VL(id) is a line, VW(id, word, n) when its n-th word starts; beats start at the previous line's t1 + 0.3; TIMELINE.narration comes from VOICE.lines and DURATION from VOICE.duration. Cue Writes and flashes on the words that name them. Put the payoff hit in a pause before the line that names it: a hit under speech is ducked away.piece.json: "voice": { "file": "voice/voice.wav", "music": -12 }. Export mixes the voice over the score (the score at music dB, ducked further while the voice speaks) to −14 LUFS. Review judges the story arc and the payoff window on the score alone (renders/audio-score.wav; a voice is louder than any hit) and the voice with its NARRATION check.voice.mjs, rebuild: scenes cued from VOICE move with it. A changed word can orphan a cue that points at it; check those beats.Ask at intake (question 6). Without a track the score is composed in code on a 120 BPM grid. With one:
pieces/<name>/audio/track.wav (WAV, MP3 or M4A), and in piece.json: "music": { "file": "audio/track.wav", "start": 12.0, "gain": 0, "fade": 0.5 } (start = where in the song the piece begins).node tools/beats.mjs pieces/<name>/audio/track.wav pieces/<name> --start 12 --dur <piece length> → beats.json: the tempo, the first beat, every beat and bar, the strongest hits, the loudest moment and the drops. Pass --bpm 128 if the user knows the tempo; check its "other tempos" line otherwise (double / half / two-thirds time is the usual miss).BEATS; the starter head reads BPM and GRID0 from it, and onBeat(t) snaps a time to the song's 8th grid. Put cuts, morphs and cues on onBeat(...). The song decides the arc: put the turn on a drop (BEATS.quiet) and the payoff on its loudest hit (BEATS.loudest, BEATS.hits), not where a composed score would have put them.src/score.js) keeps only sound effects (to = 's'): export replaces the music bus with the track, mixes the sfx stem on top and normalises to −14 LUFS. Review's grid uses TIMELINE.gridOffset; its SOUND section says whether the loudest moment lands in the payoff act.Ask at intake (question 7) when the subject is a product. Then:
node tools/capture.mjs <url> pieces/<name>/assets/home.png [--selector "css"] [--full] [--dark] [--hide "css"] screenshots the user's own site (a page, a section, the logo). Ask before capturing anything they don't own. Logo files they give you go in assets/ too (PNG, SVG, JPG, WEBP).tools/build.mjs embeds everything in assets/ into index.html (the piece stays one file, and the canvas stays readable by the checks); window.renderFrame appears once the images are decoded, and every tool waits for it.drawAsset('home.png', x, y, w, h, { fit: 'cover' | 'contain', r }) inside the style's own framing (a torn-paper photo, an inked frame, a printed card) so they belong to the look. asset(name) returns the image.Ask at intake (question 2, multi-select). List them in piece.json "formats": ["9:16", "1:1", "16:9"] (the first is the main one). The starter's head reads ?format= and sets W, H, SAFE and CX; scenes place things with LX(fraction), LY(fraction) and size them with UNIT, and choose a different arrangement with PORTRAIT / WIDE where a shape needs it (a column of three on 9:16, a row of three on 16:9). Never crop a 9:16 render to 16:9.
node tools/export.mjs pieces/<name> --formats 9:16,1:1,16:9 --share → renders/final.mp4 (main) and final-<w>x<h>.mp4 for the others.node tools/review.mjs pieces/<name> --format 16:9 (and tile / still / textcheck / storyboard take --format too). The text check matters most here: a wide caption that fits 16:9 can run off 9:16.kit/core.js): springMove(t0, a, b, SPRING.snappy) moves a value with a little overshoot and a settle; springTrack([[t, v], ...]) follows a value through many targets without a jump. Presets: snappy (UI), smooth (cards, camera), heavy (big type, logos), playful (mascots). Closed-form, so frames stay deterministic. On-2s styles step them every 2 frames, as they should.export.mjs --blur 4 averages 4 sub-frames per frame — only for styles on 1s (STYLE.ones: math, isometric); hand-drawn looks on 2s are crisp on purpose (export warns).A 45–60s piece has 10–15 scenes; split the drawing across agents once the storyboard is approved:
src/ file per section or era, owned by one agent (src/era-01.js, src/era-02.js, …). List them in piece.json "scenes": [...]; they take the place of src/scenes.js in the build order.src/head.html (TIMELINE, eras, shots, cues), src/bridges.js, the score, and the kit. Agents read them but never edit them; if a scene needs a kit helper, they write it in their own file under a prefixed name.STYLE.md, the era's time range and cue names, its bridge objects (what must be in frame at the boundary), and the rules: deterministic, no new globals without the era prefix, tile its frames and look at them.build.mjs joins them; you build, tile across every boundary, and run the review.| path | what | read when |
|---|---|---|
| intake.md | the questions and defaults | step 0 |
| craft.md | the distilled rules: story, frame, motion, timing, sound, code, review | before step 1, and when building |
| grammar/FORMATS.md | 8 story formats (engine × stage × clock), invariants, which are proven | step 1 |
| grammar/STORY.md | beat-level story rules with evidence | step 1 |
| grammar/FRAME.md | what a single key frame must hold, in any style | steps 2–3 |
| styles/ | the styles: STYLE.md (rules + frame checklist), kit.js, sample.png, demo/; the STYLE hooks contract | steps 0, 2, building |
| new-style.md | making a new style from the user's references | step 2 |
kit/core.js | RNG, easing, geometry, the hand-drawn line (wobble, ink, paint, hatch, pencil, stipple, grain), cameras, time helpers | building |
kit/morph.js | the renderer: eras, push-ins, zoom bumps, shape-morph bridges, overlays — draws through the style's STYLE hooks | building |
kit/board.js | the storyboard renderer | steps 2–3 |
kit/score-*.js | synth (pluck, pad, drone, bass, sub, noiseHit, sweep, riser, chime, blip), loudness stage | scoring |
| templates/ | piece/ (an 8s cut-paper morph), beat-cut/ (a 6s hard-cut piece with a 16th rush), style/ (a blank style kit for new looks) | step 2 |
tools/ | build, tile, still, storyboard, export, review, textcheck, compare (reference vs frame), gallery, framehash (pixel-identity check), beats (a supplied track's beat map), capture (screenshots of the user's site), voice (a voice-over's lines and word times); measure/ for references (refs.mjs for stills, shotlog.py for video) | throughout |
| examples/history-of-ai/ | a full 60s worked example (cut paper) | when unsure how something fits |
Formats F2 (chronology / morph chain) and F4 (mission) have each produced a piece that passed every check from the card alone; F5 (fixed-hero journey) has several. The others are documented from study but unproven — say so when you pick one. Cut paper and crosshatch have carried full pieces; riso, sketchbook, math and pixel each come from one or two finished pieces plus a demo; isometric was made from references with new-style.md and so far has only its demo; a style made from new references is new ground until it has carried a piece. WebGL motion design (ray-marched 3D, motion blur, bloom) is not a shipped style yet.
© cth9191, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 137 other files in plugins/animate/skills/animate of cth9191/animate.
Open the folder on GitHubat commit 7e5eb56
Animate next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Animate this skillcth9191/animate | 166 | — | ~4.5k | Automated safety check: Pass | MIT | |
| Painted Animationtuzhechen2005/opus-video-skills | 127 | 1 repos | ~1.9k | Automated safety check: Pass | Custom licence | |
| Qiaomu Cutjoeseesun/qiaomu-cut-skill | 369 | — | ~6.8k | Automated safety check: Notes | MIT | |
| ShowtimeFavioVazquez/showtime | 178 | — | ~3k | Automated safety check: Pass | MIT | |
| Remotion Ad Videoleosssvip-dot/remotion-ad-video-skill | 110 | — | ~6.3k | Automated safety check: Pass | MIT | |
| Content To Videoarchitectds/modeldock | 117 | — | ~2.4k | Automated safety check: Pass | Apache-2.0 |
tuzhechen2005/opus-video-skills
Make hand-painted watercolour-and-ink cartoon videos (MP4) with code — p5.js + p5.brush rendered frame by frame in headless Chrome, encoded with ffmpeg — starring Clawd or any character.
joeseesun/qiaomu-cut-skill
把一句话需求转成可复现、可验收视频工程的乔木智能剪辑导演。Use when the user asks to create, plan, edit, remix, explain, narrate, subtitle, animate, composite, or render a video—including one-line requests such as “制作一个科普视频:介绍…
FavioVazquez/showtime
A skill your agent uses when the user wants a video made, edited or finished: a launch or promo, product demo, explainer, trailer or teaser, tutorial or walkthrough, a screen recording turned into a…
leosssvip-dot/remotion-ad-video-skill
A skill your agent uses when turning product links, app store listings, landing pages, or product briefs into advertising videos with Remotion or Hyperframes projects, storyboards, render-engine…
architectds/modeldock
Turn arbitrary source content (README, article, story, slides, deck, data/report, product description, tutorial text, audio/transcript, or a bare topic) into a finished, high-quality MP4 video.
zhuzhaoyun/Molio
Molio's builtin skill for MAKING a video from any source — wiki notes, articles, scripts, product info, or a brief — and rendering it to MP4.
Works with
Categories
Make a short procedural animation in any style — an explainer, a history, a little story — as a single-file canvas video with a synthesized score, rendered to MP4. Animate is an agent skill from cth9191/animate. Make a short procedural animation in any style — an explainer, a history, a little story — as a single-file canvas video with a synthesized score, rendered to MP4.
Animate fits situations like: the user asks for an animated video; reel made in code; wants a look matched from references.
Run `npx skills add cth9191/animate --skill animate -a claude-code`. Or copy the skill folder (plugins/animate/skills/animate in cth9191/animate) into .claude/skills/animate in your project. Claude Code loads it when a task matches its description.
Run `npx skills add cth9191/animate --skill animate -a codex`. Or copy the skill folder (plugins/animate/skills/animate in cth9191/animate) into .agents/skills/animate in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add cth9191/animate --skill animate -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/animate, .gemini/skills/animate, .github/skills/animate and .opencode/skills/animate in your project.
Going by SKILL.md and its folder, Animate needs JavaScript for the scripts in its folder and the command-line tools its instructions call (node, npm, npx and pip). Our summary lists: Python 3; Node.js.
SKILL.md contains no URLs. Its commands use npm, npx and pip, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Animate is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.5k tokens (SKILL.md is roughly 18k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Animate: Painted Animation (tuzhechen2005/opus-video-skills, 127 stars), Qiaomu Cut (joeseesun/qiaomu-cut-skill, 369 stars), Showtime (FavioVazquez/showtime, 178 stars) and Remotion Ad Video (leosssvip-dot/remotion-ad-video-skill, 110 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
cth9191 (a GitHub user) maintains it in cth9191/animate, which has 166 GitHub stars. The repository was last updated on October 5, 2026.
Source: cth9191/animate on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.