reanimate
Clone a section, widget, page or animation from any reference (a live website URL, a screen recording, an mp4/mov/webm, a gif, a Lottie file, a prototype export) frame by frame into the user's own codebase, then record the clone and verify it against the reference frame by frame, iterating until timing, easing, sequence and layout match. Use whenever the user wants to clone, copy, replicate, recreate, reverse-engineer, port or "steal" a hero, section, widget, marquee, carousel, hover effect, page transition, loader, scroll animation or interaction from a site or video, says "make it look/feel/move like this", "same animation as", "match this exactly", or hands over a gif/video and asks to build it, including when they also want to add their own content, colours or extra features on top, or only want part of the reference (one section, one widget, a few seconds). Covers canvas, WebGL, WebGPU and three.js / 3D scenes (shaders, particles, globes, glTF models) as well as CSS and JS motion. Pixel-level matching of fonts, colours and spacing is done only when they ask for it.
Install
npx skills add https://github.com/NiazMorshed2007/reanimate --skill reanimateReading frames and writing the motion spec
The spec turns "I watched it" into rows you can check. Write it before building; update it when verification teaches you something; it is the first thing to show the user when they ask "does it match?".
spec.md template
Where the numbers come from
inspect.json › animations(websites with CSS/WAAPI motion):timing.delay,timing.duration, per-keyframeeasing,iterations,direction. Transitions show up asCSSTransitionwithtransitionProperty. Copy them.track.json+easing.ts(websites, any technology): per element and property, prints delay, visible duration, overshoot and the best-fitting named easing with its fitted duration. Run it for every moving element and property (translateY,opacity,scale,x,w…). Overshoot > 2 % means a spring or a back easing; note the overshoot percentage and the settle time, the implementation notes say how to map them.gl-track.json+easing.ts --channel(canvas, WebGL, 3D, captured with--gl): uniforms and scene-graph values (camera, object transforms, material uniforms) per rendered frame.gl.ts summarylists the animated ones by kind (clock,transition,there-and-back,oscillation,steps) with their change windows, and the fixed uniforms are constants to copy as they are. Seereferences/webgl.md.- Frames (videos, gifs, and canvas when there is no trace): for each element find the first frame where it changes and the last frame where it changes;
start = first/fps,duration = (last − first + 1)/fps. Judge the easing from where the midpoint lands: if the element has covered more than half of its distance at a third of the duration it is an ease-out; less than a quarter, an ease-in; symmetric, ease-in-out; constant steps, linear. Overshoot past the final position then return: back/spring.compare.tsprints an activity curve per set that shows these shapes as bars even without a track. - Staggers: the gap between the start frames of siblings. Note whether it is a constant (each +80 ms), grows (ease on the stagger), or is per-character/per-word (text reveals).
Patterns worth recognising
Most landing-page motion is one of these; naming it saves rounds.
How to read a sheet
- Go row by row with the timestamp labels. Write down, per element, the frame it first moves and the frame it rests. Do this for every element, not just the biggest one.
- Compare consecutive frames: a big jump early then small changes = ease-out; small then big = ease-in.
- Look for things that are easy to miss: a backdrop that fades, a shadow that grows, letter-spacing that tightens, a blur that clears, a border that appears, an icon that rotates. They are part of the motion.
- Note what does not move. A clone that animates an element the reference keeps still fails just as much.