System purpose
alchaincyf/huashu-art-motion (version 1.2.0), released by Huashu (alchaincyf) under the MIT license, is a code-driven animation Agent skill built from a pure-code breakdown and redraw of X user Tak's (@cherry_mx_reds) 15-second Art History Speedrun. The repository ships a self-contained scripts/engine/ animation workspace that pairs 17 JavaScript drawing and camera libraries, 53 art-style recipe cards (36 implemented styles plus 17 artwork-anchored study recipes), 9 explainer animation grammars, and a verification toolchain covering storyboard linting, frame-by-frame rendering, and anti-PPT delivery gates.
SKILL.md splits execution into two paths by model capability: the Open-field track targets Claude Opus 5.5 or stronger models, allowing free composition of libraries, custom renderers, and routing tables; the Rail track targets other models, enforcing the sequence "write storyboard table → pass storyboard_lint.py red-light gate → render shot by shot (capped at 8 seconds per parameterized clip) → ffmpeg concat and audio mix → qa.py quantitative check → deliver.py delivery".
| Explainer grammar ID and name | Typical shot duration | Primary easing and transitions | Target content and core mechanism |
|---|---|---|---|
y1_kurzgesagt (Flat science explainer) | Hard-cut 7–9 s; visual unit 4.6–6.7 s | MO.k75, lensReveal / matchCut | Turns abstract concepts into concrete objects inside a logarithmically scalable world where the camera travels across scales |
y2_vox (Investigative collage) | Slow median 3.3 s (3–7 s); fast 1.4–1.8 s | MO.sineInOut, 12 fps stepped elements, same / cut | Lays archival documents, news clippings, and screenshots on a desk with 12 fps stepped red strings and highlighter strokes |
y3_whiteboard (Hand-drawn whiteboard) | Median hold 6.6 s per board zone | MO.sineInOut (1.2–2.4 s pan), 0.8 s whip pan | Step-by-step reasoning chains where drawing starts roughly 0.5 s after the spoken phrase and pulls back at the end |
y4_storytime (Storytime character) | Mean 2.43 s (median 1.87 s) | MO.expoOut (0.1 s pose swap) + MO.settle, 24 fps | First-person anecdotes and punchlines using 0.1 s pose snaps followed by still holds and reaction close-ups |
y5_kinetic_type (Kinetic typography) | Roughly 2 s per bar at 120 BPM | MO.expoOut, MO.springHz, fillZoom / bands | Lists, key quotes, and chapter cards where primary words slam in on downbeats with a single visual focal point |
t1_3b1b (Math and mechanism morph) | Single animation 1–3 s + 1 s hold; concept 8–20 s | MO.smooth, zoomThrough / fadeShift | Morphs one concept directly into the next on a dark background via Transform while locking colors to concept names |
t2_keynote_ui (Keynote product UI) | Keynote screen 5–8 s; fast cut 1.5–3 s | MO.spring, MO.appleOut, blurPush / expandRect | Full-frame product screenshots or hardware with zoom focus, landing nouns and numbers on spoken cues with optional glass cards |
t3_finance_chart (Finance chart) | Single chart 2.5–6 s | MO.quintOut, MO.smooth, slidePush / zoomThrough | Draws axes first, grows data second, and annotates a single takeaway last; bar charts always start from 0 |
y6_presenter_explainer (Presenter explainer) | Configured per full-film narration section | Combines whiteboard, charts, and presenter character frames | Grammar 9, shipping a grammar card and full-film reference code snapshots (reference_films/) that require user-supplied character and audio assets |
Storyboard and style definition layer
- 36 implemented styles (35 Canvas scenes + 37_rick_morty SVG)
- 17 artwork-anchored study recipes (IDs 38 to 55, skipping 54)
- storyboard_lint.py style lock, palette, and 6 anti-pattern checks
Engine and rendering layer (scripts/engine/)
- 17 libraries (MO / CAM / DG / TY / CH / UI / CL / MD / TOON, etc.)
- 8 parameterized JSON clips (clip.html + clips/*.js) and long-scroll rig
- Playwright Chromium + render.py outputting H.264 MP4 or ProRes 4444 MOV
Quantitative QA and delivery gate layer
- clip_lint.py and render.py --audit (checks overflow and overlap every 0.25 s)
- qa.py stability, frame cost, motion, and text-framing diagnostics
- film_gate.py and deliver.py (blocks PPT slideshows, 0.3 s blank frames, and 30% blue-purple backgrounds)
The Rail track requires passing storyboard_lint.py before coding; delivery requires passing film_gate.py and independent Agent review before copying the final video and writing a fingerprinted manifest.
While the README.md inventory table lists 53 style recipe cards and 53 scripts/engine/scenes/ scene files, line 3 of the SKILL.md front matter and line 1 of the style master index retain the earlier phrase "36 implemented styles + 16 study recipes"; inspecting the "New study recipes (17 types)" table at line 13 of the style master index (IDs 38_giotto through 55_dunhuang, with ID 54 unused) confirms 17 study cards (self-scored 65–82 and independently reviewed at 53–74, remaining study recipes because none reached the 80 threshold), bringing the total to 53 style recipe cards.
Installation and verification
- Not completed:
Install the Python package manager
uv,ffmpeg, and Playwright Chromium for headless frame-by-frame screenshot rendering. - Not completed:
Base code animations require no voice or image API keys; enable optional voice cloning or image generation on demand via
scripts/capabilities.pyandscripts/images.py. - Not completed:
Bundled fonts live under
scripts/engine/lib/fonts/(licensed under SIL OFL 1.1, wherePuHuiandLXGWWenKai-500cover all6,763GB2312 Chinese characters).
This report inspected source code, recipe cards, and script logic only; it did not launch Playwright Chromium locally to render video files.
Route One: Install the skill via npx skills or Git
npx skills add alchaincyf/huashu-art-motionTo clone the repository directly or mount it manually under ~/.claude/skills/:
git clone https://github.com/alchaincyf/huashu-art-motion.git
cd huashu-art-motion
uv run --with playwright playwright install chromiumRoute Two: Minimal verification with a single-frame still and parameterized clip
From the repository root, render a single still frame of the Van Gogh scene (09_postimp) and a parameterized finance chart clip (t3_finance_chart):
uv run --with playwright python scripts/engine/render.py \
--solo 09_postimp \
--stills 0.3 \
--out preview_stills
uv run --with playwright python scripts/engine/render.py \
--spec scripts/engine/examples/t3_finance_chart.json \
--out preview_chart.mp4Core capabilities
Reference video breakdown
uv run scripts/analyze/breakdown.py
Map a reference animation into a code-ready blueprint
Measures cut timestamps, beat grids (BPM), and per-segment motion heatmaps from a reference video to guide mechanism recreation and shot planning.
Storyboard red-light linter
uv run scripts/storyboard_lint.py
Block non-compliant storyboards before coding starts
Validates the header style lock, palette hex values, character policy, concrete nouns and motion verbs per shot, 3 consecutive zoom-ins, ending title cards, and number parity with the narration script.
Dual-mode frame renderer
uv run --with playwright python scripts/engine/render.py
Render art scenes, long-scroll films, or JSON clips
Supports --solo single scenes, --film full films, --spec parameterized clips, --alpha ProRes 4444 transparent exports, and --audit layout checks every 0.25 seconds.
Clip lint and stress testing
clip_lint.py / stress_clip.py / regress_clips.py
Validate JSON specs and stress-test 4 layout variants
clip_lint.py checks schema fields and timing; stress_clip.py tests 4 variants (portrait, extra-long text, English, and square) to prevent layout breakage.
Quantitative QA analysis
uv run scripts/qa.py
Measure determinism, frame render cost, motion, and framing
Evaluates single-clip specs or full projects for pixel determinism, motion distribution, and isolated jumps (smooth pans or zooms under 2 seconds count as camera events rather than jumps).
Anti-PPT gate and delivery
uv run scripts/deliver.py
Run film_gate.py and emit a fingerprinted delivery manifest
Fails with a red light if fast-motion frames fall below 0.035, mid-film blank frames last 0.3 seconds, or blue-purple backgrounds reach 30%; copies the final MP4 and writes a verifiable hash manifest on pass.
The 17 core libraries under scripts/engine/lib/ expose global namespaces shared across all scenes and parameterized clips:
| Library files | Namespace | Core capabilities and representative functions |
|---|---|---|
motion.js / util.js | MO / U | Camera duration constants PULSE, slam curve slam, 12 fps stepped timing step, Manim easing smooth, Bezier k75 / appleOut, SwiftUI spring, and beat alignment onBeat |
camera.js | CAM | Logarithmic zoom zlerp, aperture zoom coverZoom, keyframe path at, camera action table track (push / pull / glide / punch / pan / slam / shake / cut), and parallax layer |
diagram.js / chart.js | DG / CH | Progressive stroke drawing drawPartial, hand jitter hand, shape morphing morph, Manim equation write, whiteboard timeline board; axes grid, bar charts bars, candlesticks candles, and callout |
typo.js / ui.js | TY / UI | Auto-shrinking line wrapper fit (keeps long English words inside bounds), character rise charsIn, typewriter typed, number counter count; mesh glow mesh, frosted card glass, sheen, and pseudo-3D persp |
collage.js / media.js | CL / MD | Paper grain fillPaper, torn edge tornRect, halftone photo halftone, red string string, rough highlighter highlight; full-bleed asset cover, Polaroid print print (errors immediately on missing files) |
brush.js / paint.js / medium.js / post.js / finish.js | Artistic media layer | Flow-field strokes, watercolor washes, pointillist mixing, gold-leaf embossing, ink diffusion, Protocol 16 media channels, and whole-clip finishing finish (soft / film / punch) |
toon.js / rig.js / rig_huashu.js | TOON / rigs | Two-tone shading flat, pose-to-pose switching with settle poseAt, and lip-sync envelope mouth (the bean mannequin is restricted to previsualization and barred from final cuts) |
Operating principles
Cap each parameterized clip at 8 seconds and lock a single theme
Letting duration exceed 8 seconds holds a single layout on screen too long and creates a slide-deck feel. Split a film into multiple shots (2 to 6 seconds each), assign the same theme palette name (paper, poster, ink, navy, bauhaus, snow, wood, chalk) across all specs, and mix at most 2 explainer grammars per film.
Use gentle pushes and pulls for transitions and save snaps for accents
Keep the camera still while elements move on their own or while viewers read text; use gentle pushes (push), pans (glide), or pulls (pull, 0.6 to 1.5 seconds) to guide attention, and never push in across 3 consecutive shots without pulling back or cutting. Reserve fast pushes (camera=snap, 0.28 seconds) and slams (0.17 seconds) for reveals and key numbers.
Display real screenshots and photos full-bleed instead of redrawing in code
When product screenshots, photographs, recordings, or source documents exist, present them full-bleed at native aspect ratio via MD.cover or MD.print and use code only for annotations, leader lines, and zoom focus. Redrawing real interfaces in code or inserting generic chibi stick figures triggers the six anti-pattern checks.
Avoid blue-purple gradients and never reuse the 35-grid room layout
film_gate.py rejects any film where blue-purple backgrounds cover 30% or more of frames (unless justified with --allow-blue-purple). Furthermore, the shared room composition across the 35 art-history samples exists only for the speedrun premise; design fresh compositions for new topics and present 3 distinct layout options before locking a new style or character direction.
For human or mascot characters, SKILL.md specifies that unless 37_rick_morty or 52_south_park flat cartoon style is explicitly selected for original semantic SVG characters, all other styles must composite AI-generated character frames with code or show only hands and back views when no image generator is configured.
Worked example
The following sequence copies scripts/engine into a project workspace and runs JSON linting, --audit layout verification, standard MP4 and ProRes 4444 alpha rendering, qa.py scoring, and deliver.py gated packaging.
1. Copy the engine workspace and run spec and layout audits
mkdir -p projects/demo_clip
cp -R scripts/engine projects/demo_clip/engine
cp scripts/engine/examples/t3_finance_chart.json projects/demo_clip/clip01.json
python3 scripts/clip_lint.py projects/demo_clip/clip01.json
uv run --with playwright python projects/demo_clip/engine/render.py \
--spec projects/demo_clip/clip01.json \
--audit2. Render the standard H.264 MP4 and transparent overlay clip
uv run --with playwright python projects/demo_clip/engine/render.py \
--spec projects/demo_clip/clip01.json \
--out projects/demo_clip/clip01.mp4 \
--stills 0.5,2.0
uv run --with playwright python projects/demo_clip/engine/render.py \
--spec projects/demo_clip/clip01.json \
--alpha \
--out projects/demo_clip/clip01_alpha.mov3. Run quantitative QA and gated delivery
uv run scripts/qa.py \
--spec projects/demo_clip/clip01.json \
--out projects/demo_clip/qa/clip01
uv run scripts/deliver.py projects/demo_clip/clip01.mp4 \
--spec projects/demo_clip/clip01.json \
--qa projects/demo_clip/qa/clip01 \
--out projects/demo_clip/output/
uv run scripts/deliver.py --verify projects/demo_clip/output/Limitations and caveats
| Limitation | Technical boundary and compliance requirement |
|---|---|
| Separate stroke-order and font licenses | Derived stroke-order medians in reference_films/spacex/spacex_wb/assets/strokes.js remain under the Arphic Public License; fonts in scripts/engine/lib/fonts/ retain their respective SIL OFL 1.1 licenses (LICENSES.md) |
| 17 study recipes are below production score | The 17 study cards (38 through 55) include single-scene prototypes (--film style_studies), but independent review scores range from 53–74 (below the 80 production threshold) and require validation under Protocols 15 and 16 before cross-scene reuse |
| Style 36 uses a standalone SVG pipeline | 37_rick_morty (assigned internal ID 37 because 36_picasso_blue is already occupied) uses a standalone SVG renderer and HTML preview excluded from the 35-cell Canvas gallery and omits a walking rig |
| Full-narration reference films require user assets | reference_films/ and grammar 9 (y6_presenter_explainer) are code snapshots requiring user-supplied character and audio files; copying compositions, characters, or assets directly from demo films into new productions is prohibited |
| Cross-agent online regression coverage | Per references/compatibility.md, installation and reinstallation pass across three agent platforms and Codex online regression passes, whereas Claude Code and Kimi online regressions remain pending due to test-account constraints |
Next steps
To build a horizontal long-scroll animation where a character walks left to right across multiple art eras, copy
scripts/engine/demos/long_scroll/and follow reference guide 11 to configure world boundaries and character frame swaps.To transfer an artist's style to a new subject, fetch original works with
scripts/analyze/fetch_reference.py, route shapes throughlib/medium.jsunder Protocols 15 and 16, and generate side-by-side comparison sheets withscripts/engine/compare.py.To composite
--alphatransparent explainer clips from this skill over a talking-head timeline, pair it with the Digital Human Koubo Guide.
Source pinned at 8a0d7d72ca65fcce6f8ba82c4a6c8dfe35b8422c. Official reference files:
README: Project architecture, showcase animations, 53 style recipes, and license exceptions.
Main skill specification (SKILL.md): Open-field vs. Rail track routing, camera and style rules, six failure modes, and delivery gates.
Explainer animation grammars and clip contract (09): Selection matrix for the 8 renderable explainer grammars, 12 cross-grammar rules, 17-library quick reference, and JSON clip contract.
References
- Verified source revision and README
- Main skill specification (SKILL.md)
- MIT license and asset exceptions
- Art style recipe master index (36 implemented + 17 study recipes)
- Explainer animation grammars and clip contract (09)
- Storyboard lint script
- Engine renderer and clip audit entrypoint
- Quantitative QA script
- Anti-PPT and blank-frame film gate
- One-command delivery and manifest generator
- Optional voice and private capability configuration