by atmirrr
A Claude skill for pro motion design with correct Persian (Farsi) typography: no slideshows, no broken letters. 8 techniques, HarfBuzz tooling, Remotion examples.
# Add to your Claude Code skills
git clone https://github.com/atmirrr/persian-motion-directorGuides for using ai agents skills like persian-motion-director.
See how persian-motion-director compares with popular alternatives.
persian-motion-director is an open-source ai agents skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by atmirrr. A Claude skill for pro motion design with correct Persian (Farsi) typography: no slideshows, no broken letters. 8 techniques, HarfBuzz tooling, Remotion examples. It has 97 GitHub stars.
persian-motion-director's catalog security scan is still queued. You can run an instant dependency and prompt-injection check now with the "Scan for vulnerabilities" button above.
Clone the repository with "git clone https://github.com/atmirrr/persian-motion-director" and add it to your Claude Code skills directory (see the Installation section above). persian-motion-director ships a SKILL.md manifest, so compatible agents can discover and load it automatically.
persian-motion-director is primarily written in JavaScript. It is open-source under atmirrr on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other AI Agents skills you can browse and compare side by side. Open the AI Agents category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh persian-motion-director against similar tools.
No comments yet. Be the first to share your thoughts!
⚠️ Third-Party Software Notice
This skill is third-party open-source software developed and hosted independently on GitHub. SkillsLLM is an informational directory and does not control or maintain the underlying repository.
Any security checks, ratings, or warnings displayed by SkillsLLM are automated and limited in scope. They do not constitute a security certification or guarantee that the software is safe, error-free, or free from malicious code, vulnerabilities, compromised dependencies, or prompt-injection risks.
Review the source code, permissions, dependencies, and configuration before installing or running any third-party skill. Use is at your own risk. To the maximum extent permitted by applicable law, SkillsLLM is not liable for losses arising from third-party software.
The deep catalog scan for this skill is still queued. Run an instant dependency check now instead.
See comparison
You are directing, not just animating. Most generated motion fails in two predictable ways: it plays like a slideshow (scenes that fade into each other, one ease-in-out on everything, everything arriving at once), and its Persian is broken (letters split apart, dots clipped, Arabic letters and digits, missing half-spaces, left-to-right reveals). This skill fixes both. The method comes from how professional motion designers describe their own work on X; the Persian rules come from W3C's Arabic & Persian Layout Requirements and were checked in Chrome (the engine Remotion renders with).
Work in this order. Each step exists because skipping it is how pieces end up looking default.
assets/sketches/gallery.html (or render the clips) and let the user choose. Rework after a full build costs ten times more than a pick list.assets/music/compose_shur_pulse.py is a working example that writes beats.json) or ask for one. At 120 BPM one beat is 0.5 s and one bar 2 s; at 60 fps a beat is 30 frames.references/workflow.md). Every section change lands on a downbeat; every cut on a beat or 2 frames before it.assets/remotion/render-stills.mjs) and get a yes before animating everything.assets/remotion/src/intro/Intro.tsx for a complete worked example).scripts/lint_persian.py on all copy, review stills at full size for clipped dots and broken joins, scrub every cut against the beat, and make loops exact (clip length = a whole number of loops).| Slideshow habit | What to do instead |
|---|---|
| Scenes chained with fade transitions | One camera travels between scenes, or one object carries into the next scene. Never fade() scene to scene. |
| The same ease-in-out on everything | Each move gets its own curve. Entrances: bezier(.16,1,.3,1) over ~20 frames. Exits: bezier(.7,0,.84,0) over ~8 frames, travelling only ~70% as far. |
| Everything arrives together, evenly spaced | One lead element, the rest 2–4 frames behind, spaced on a curve rather than evenly. |
Remotion's default bouncy spring() (overshoots ~16%) |
Under 2% overshoot on UI, none on text: stiffness 100 / damping 16 gives ~1.5%. |
| Music laid on at the end | Music first; cuts on the beat; sound attacks placed on the visual hits. |
| Centered text on a gradient, logo at the end | Show the real product doing a real task in the first 10 seconds. |
| Freezes, or motion that never pauses | Hold long enough to read; only the camera breathes (zoom 1.00 → 1.04 per scene). |
| Grain, halftone or ASCII as a finish | Texture only with a physical reason (paper, print, light). These finishes are now the AI default. |
More numbers and the sources behind them: references/anti-slideshow.md.
Read references/persian-typography.md before writing any Persian into a frame. The short version:
inline-block spans, flex children (including direct children of Remotion's <AbsoluteFill>, which is a flex box) and any per-letter transform draw each letter in its isolated form. Animate whole words or lines. When you truly need per-letter or per-dot motion, use shaped outlines (scripts/shape_persian.py) or zero-width-joiner splitting (scripts/split_fa.js).dir="rtl" lang="fa" on every Persian block; wrap Latin names and numbers in <bdi> (or FSI/PDI) or the line scrambles. Reveals and staggers start on the right, camera progress travels left, "next" arrows point left. Play buttons, clocks and numbers are never mirrored.scripts/lint_persian.py catches these.FontFace + delayRender (see assets/remotion/src/fonts.ts).references/persian-copy.md).Live code for each is in assets/sketches/sketches.js (plain JS, a pure function of time) and runs both in a browser page and in Remotion through SketchPlayer. Details, numbers and the X posts each comes from are in references/techniques/.
| # | Technique | Use it for | Sketch id |
|---|---|---|---|
| 01 | One camera, no cuts | The spine of a film: scenes on one strip, whip pans with motion blur and parallax | oner |
| 02 | One shape carries the story | Transitions: a full stop grows into a chat bubble, then into the next full stop | match |
| 03 | The real UI, directed | Product beats: real interface in 3D, cursor on arcs, focus pulls | ui |
| 04 | Cut on the beat | Feature runs and kinetic type: hard cuts on every beat, punch-ins, inverted frames | beat |
| 05 | On twos, with line boil | A hand-drawn layer over clean UI: drawings hold 2 frames, lines wobble 12×/s | boil |
| 06 | Paper cut-out letters | Warm title cards: each joined letter group is a rigid paper piece | cutout |
| 07 | Dots last | Wordmarks and reveals: letter bodies first, then the dots drop in | nuqta |
| 08 | Kashida, not letter-spacing | Emphasis on a held note: stretch the joining stroke, measured in calligraphic dots | kashida |
Pick by the brief, not by novelty: one or two signature techniques used consistently read as a system; all eight at once read as a reel.
scripts/shape_persian.py — shapes Persian with HarfBuzz and exports SVG outlines split into letter bodies, dots and connected letter groups (pip install uharfbuzz fonttools). This is what makes per-letter, per-dot and kashida animation possible without breaking the script.scripts/split_fa.js — splits a Persian word into letters that keep their joined forms (zero-width joiners), for when outlines are overkill.scripts/lint_persian.py — checks copy (Arabic letters and digits, missing half-spaces, English punctuation, misplaced kashida) and code (letter-spacing, per-letter boxes, missing dir).assets/sketches/ — the motion engine (engine.js), the eight sketches, shaped glyph data, styles and gallery.html (serve the folder with any static server).assets/remotion/ — SketchPlayer (drives a sketch from the frame number), one clip composition per technique, the full intro film as a worked example, and scripts to render clips and stills.assets/music/compose_shur_pulse.py — an original 120 BPM track in Dastgah Shur written in code, with a beat map; shows how to make the edit lock to the music.Still keep the two non-negotiables that cost nothing: no per-letter boxes for Persian, and no scene-to-scene fades. Use one technique well, set the timing on a beat grid, and render stills to check the Persian before the full render.
A Claude skill for professional motion design with correct Persian typography. Films that don't play like slideshows, and Persian that doesn't fall apart.
Most generated motion fails in two predictable ways. It plays like a slideshow: scenes fade into each other, one ease-in-out on everything, everything arrives at once. And its Persian breaks: letters split apart when animated, dots get clipped, Arabic letters and digits slip in, half-spaces go missing, reveals run the wrong way.
This skill teaches Claude to direct instead: show directions before building, lock the music first, cut on the beat, keep one camera moving, and set Persian the way a Persian reader expects. It comes with eight working techniques, tooling for per-letter and per-dot Persian animation, and a checklist and linter for Persian copy.
Every sketch is plain JavaScript, a pure function of time, so the same code runs live in a browser and frame-exact in Remotion.
| 01 · One camera, no cuts · یک دوربین، بدون کاتScenes on one strip, right to left; whip pans with motion blur and parallax. | 02 · One shape carries the story · یک شکل، کلِ داستانThe full stop grows into the reply bubble, then into the next full stop. |
| 03 · The real UI, directed · رابطِ واقعی، کارگردانیشدهRTL interface in 3D, a cursor on arcs, a focus pull. | 04 · Cut on the beat · کات روی ضربMusic first; a hard cut on every beat, punch-ins, inverted frames. |
| 05 · On twos, with line boil · دوفریمی، با خطِ لرزانDrawings hold two frames, lines wobble; the camera stays smooth. | 06 · Paper cut-out letters · حروفِ کاغذیEach joined letter group is a rigid paper piece, one light, matching shadows. |
| 07 · Dots last · نقطهها آخرLetter bodies first, right to left; then the dots drop in. | 08 · Kashida, not letter-spacing · کشیده، نه فاصلهStretch the joining stroke, measured in calligraphic dots. |
SKILL.md the director's loop, anti-slideshow rules, Persian non-negotiables
references/
workflow.md brief → directions → music first → shot list on the bar grid → style frames → build → checks
anti-slideshow.md curves, springs, staggers, holds, motion blur, rhythm (with numbers and sources)
persian-typography.md joining, masks, bidi, characters, kashida, fonts, a review checklist
persian-copy.md natural Persian for motion, common machine-copy mistakes
techniques/01…08 one file per technique: recipe, values, Persian notes, the X posts behind it
scripts/
shape_persian.py HarfBuzz shaping → SVG outlines split into letter bodies, dots and joined groups
split_fa.js split a word into letters that keep their joined forms (zero-width joiners)
lint_persian.py lint copy (ي/ك, digits, half-spaces, punctuation, kashida) and code (letter boxes, letter-spacing, fades)
assets/
sketches/ motion engine, the eight sketches, shaped glyph data, gallery.html
remotion/ SketchPlayer adapter, one clip per technique, the intro film, render scripts
music/compose_shur_pulse.py an original 120 BPM track in Dastgah Shur, written in code, with a beat map
Claude Code (personal skills):
git clone https://github.com/atmirrr/persian-motion-director ~/.claude/skills/persian-motion-director
Or put it in a project's .claude/skills/ folder. Claude picks it up when you ask for motion with Persian or RTL text, or when you say an animation looks "like a slideshow".
Things to ask Claude:
Check Persian copy and code yourself:
python3 scripts/lint_persian.py copy copy.txt
python3 scripts/lint_persian.py code src/
pip install uharfbuzz fonttools
python3 scripts/shape_persian.py assets/sketches/fonts/Vazirmatn-VF.ttf "کارگردان موشن فارسی" --wght 800
Live sketches in a browser:
cd assets/sketches && python3 -m http.server 8000 # open http://localhost:8000/gallery.html
Render the clips and the intro film with Remotion:
cd assets/remotion
npm install
npx remotion studio src/index.ts # browse every composition
node render-clips.mjs out # the eight technique clips
node render-clips.mjs out --only Intro # the 82-second intro film
python3 ../music/compose_shur_pulse.py public/music # rebuild the music (WAV) and beat map, then convert to MP3
The intro film is the worked example: music first (120 BPM, Shur on D), a bar map, every cut on a beat, one camera that whips right to left between sections, and Persian set correctly throughout. See assets/remotion/src/intro/Intro.tsx.
The anti-slideshow rules and the eight techniques come from research into how professional motion designers describe their own work on X (October 2026, about 100 posts, each one checked to exist). Every technique file links the posts it draws on. The Persian rules follow W3C's Arabic & Persian Layout Requirements and were tested in Chrome, the engine Remotion renders with.
کارگردانِ موشنِ فارسی یک اسکیل متنباز برای Claude است که دو مشکل همیشگی موشنهای ساختهشده با هوش مصنوعی را حل میکند: حسِ اسلایدشو، و فارسیِ بههمریخته.
Code: MIT. Vazirmatn: SIL Open Font License (assets/sketches/fonts/OFL.txt). The music in assets/remotion/public/music is generated by assets/music/compose_shur_pulse.py and is free to use. Example copy uses the word هرمس (Hermes) from the original brief; the default palette (#0000F2, #F2F2F2, #F2F200) is set with CSS variables and easy to change.