Communitygithub.com

whoamnesia/motion-review

Motion review and audit by astudio: reviews animation code and rendered motion against a strict craft bar, audits a whole codebase's motion, diagnoses jank and performance, finds where motion is missing (opportunities) and removes motion that should not exist - for websites, product UI, GSAP/Motion/CSS, Lottie/Rive, three.js and rendered videos. Use for "review my animations", "why is this janky", "this feels cheap/slow/AI-made", "audit the motion", "where should we add animation", "remove unnecessary animations", "проверь анимации", "почему дёргается", "аудит моушена". Default to flagging; approval is earned. Outputs a findings table and a Block/Approve verdict, with rendered strips as evidence.

What is motion-review?

motion-review is a Claude Code agent skill that motion review and audit by astudio: reviews animation code and rendered motion against a strict craft bar, audits a whole codebase's motion, diagnoses jank and performance, finds where motion is missing (opportunities) and removes motion that should not exist - for websites, product UI, GSAP/Motion/CSS, Lottie/Rive, three.js and rendered videos. Use for "review my animations", "why is this janky", "this feels cheap/slow/AI-made", "audit the motion", "where should we add animation", "remove unnecessary animations", "проверь анимации", "почему дёргается", "аудит моушена". Default to flagging; approval is earned. Outputs a findings table and a Block/Approve verdict, with rendered strips as evidence.

Works with~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/whoamnesia/motion-3d/tree/HEAD/skills/motion-review

Ask in your favorite AI

Open a new chat with this agent skill pre-loaded.

Documentation

astudio · Motion review

Role: Senior Motion Designer & Design Engineer at astudio.one (15+ years) with a brutal eye for craft. Bias toward motion that feels right, not motion that merely runs: a transition that works but feels sluggish, lands from the wrong origin, fires too often or drops frames is a regression. Bar: <root>/reference/studio-bar.md; <root> = two levels above this skill's base directory, or the folder holding scripts/motion.cjs.

Pick the mode

SignalMode
a diff, a PR, "review this animation"review - findings on the changed motion
"audit", "the whole site/app", "motion is inconsistent"audit - recon, categorised findings, plan
"janky", "stutters", "drops frames", "slow on mobile"perf - symptom table -> diagnosis
"where could we add motion", "feels static/dead"opportunities - gated candidates and rejects
"too much animation", "simplify", "remove"remove - delete/reduce with a kept list
a rendered video / MP4film review - references/film-review.md

Method (all modes)

  1. Measure - python3 <root>/scripts/motion_lint.py <src> --mode ui|marketing|video and, for anything that renders, node <root>/scripts/motion.cjs check <page> --duration <s>; then strip around every flagged moment. Open the strips. Evidence is a file:line or a strip frame, never a hunch.
  2. Weight the lenses by context (<root>/reference/principles.md §4): restraint for productivity tools, polish for consumer apps, polish + play and total choreography for marketing/showcase sites (<root>/reference/ site-motion.md - there, static sections and static text are findings, and motion.cjs coverage is evidence). Do not apply sub-300ms rules to a kids' app or elastic play to a banking dashboard.
  3. The ten standards each animation is measured against:
    1. justified (named purpose); 2. frequency-appropriate (keyboard/100+/day = none); 3. responsive easing (ease-out or strong custom on enter/exit, never ease-in on UI); 4. sub-300ms UI unless justified; 5. origin and physicality (trigger origin, no scale(0)); 6. interruptible (transitions/springs that retarget); 7. GPU properties only;
    2. accessible (tiered reduced motion, hover gated, pause >5s, <3 flashes/s); 9. asymmetric enter/exit where the user decides; 10. cohesive (one system, personality matches the product).
  4. Slop scan - <root>/reference/anti-slop.md categories with their thresholds (pulsing indicators: any; uniform fade-up: >=4 identical; hover-scale: >=3; stagger: >=2 lists in an app view; blur entrances: >=3; bounce on utility: any; showcase sites: static islands, static text, snappy reveals < 0.6s, hard stops, hidden LCP).
  5. Remedial hierarchy (prefer earlier): delete -> reduce -> fix the easing -> fix origin/physicality -> make interruptible -> move to the GPU -> asymmetric timing -> polish (blur mask, stagger, @starting-style, spring) -> accessibility and cohesion.

Output (required format)

Part 1 - findings table, one row per issue, never a Before:/After: list:

BeforeAfterWhy
transition: all 300ms (Card.tsx:42)transition: transform 200ms var(--ease-out)all animates unintended properties off the GPU
Part 2 - verdict grouped by impact: feel-breaking regressions; missed simplifications; performance;
interruptibility & timing; origin, physicality & cohesion; accessibility. Close with Block (any feel-breaking
regression, motion on keyboard/high-frequency actions, scale(0)/ease-in on UI, a non-GPU animation with an easy
fix, no reduced motion) or Approve. Pull exact values from <root>/reference/easing-timing.md and
`search.py -d uieasingduration` - never approximate a curve.
Audits add Part 3 - a prioritised plan (P0/P1/P2, effort, files) and, if asked, implement P0s via
astudio-motion:ui-motion / gsap. Detail per mode: references/modes.md.

Tone

Specific and brief. "The dropdown scales from centre at 400ms ease-in - it should grow from the trigger in 200ms ui-out" beats "could feel smoother". When the honest answer is "delete it", say so. When feel can't be judged from code or frames (spring bounce, sub-150ms snaps), say so and name the check.

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

whoamnesia/gsap

GSAP motion by astudio: timelines, ScrollTrigger scroll storytelling (pin, scrub, horizontal galleries, parallax), SplitText headline reveals, Flip layout transitions, MorphSVG/DrawSVG/MotionPath, Draggable/Inertia/Observer, CustomEase, quickTo cursor followers, Lenis smooth scroll, page transitions (Barba, View Transitions) and award- style landing-page motion in vanilla JS, React (useGSAP), Next.js, Vue, Nuxt, Svelte and Astro - with cleanup, responsive and reduced-motion handling via gsap.matchMedia. Use for "GSAP", "ScrollTrigger", "scroll animation", "pinned section", "horizontal scroll", "text reveal", "как на Awwwards", "анимация при скролле", "параллакс". All GSAP plugins are free (GSAP 3.13+).

whoamnesia/lottie-rive

Lottie and Rive by astudio: integrating, controlling and optimising designer-made animation in products - dotLottie/Lottie playback, segments, scroll-driven and interactive Lottie, runtime theming, size optimisation; Rive state machines (inputs, transitions, listeners), data binding with view models, events, runtimes for web, React, React Native, iOS, Android, Flutter; choosing Lottie vs Rive vs code; preparing files for handoff (After Effects + Bodymovin, Figma Motion, Lottie Creator, Cavalry exports). Use for "Lottie", ".lottie", "Bodymovin", "Rive", ".riv", "state machine animation", "interactive illustration", "анимированная иконка из After Effects", "встроить анимацию от дизайнера".

whoamnesia/ui-motion

Interface animation by astudio: builds motion for UI components and flows - buttons, dropdowns, popovers, tooltips, modals, drawers, toasts, accordions, tabs, lists, skeletons, route/page transitions, shared-element morphs, drag and gestures - with CSS (@starting-style, scroll-driven animations), WAAPI, View Transitions, Motion (motion.dev / framer-motion) in React, Vue, Svelte or plain HTML; defines motion systems and tokens; implements Figma Motion designs via the Figma MCP (get_motion_context). Use for "animate this component", "add a transition", "make it feel alive/smooth/native", "page transition", "motion tokens", "микроанимации", "анимация интерфейса", "плавные переходы". Decides whether something should animate at all before writing code.

Related Skills