HyperFrames Animation
heygen-com/hyperframes
Collects motion rules, scene blueprints, transitions and runtime adapters for HyperFrames video compositions, with GSAP as the default animation runtime.
Choose timing, easing, stagger, anticipation, and follow-through for a NodeTool timeline.
$ npx skills add nodetool-ai/nodetool --skill motion-principles -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install nodetool-ai/nodetool motion-principles --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/nodetool-ai/nodetool.git skills-src && mkdir -p .claude/skills && cp -r skills-src/packages/system-skills/motion-principles .claude/skills/motion-principles && 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 "motion-principles" agent skill from https://github.com/nodetool-ai/nodetool/tree/main/packages/system-skills/motion-principles into .claude/skills/motion-principles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "motion-principles", 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/nodetool-ai/nodetool/tree/main/packages/system-skills/motion-principlesType 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 nodetool-ai/nodetool --skill motion-principles -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install nodetool-ai/nodetool motion-principles --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nodetool-ai/nodetool.git skills-src && mkdir -p .agents/skills && cp -r skills-src/packages/system-skills/motion-principles .agents/skills/motion-principles && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "motion-principles" agent skill from https://github.com/nodetool-ai/nodetool/tree/main/packages/system-skills/motion-principles into .agents/skills/motion-principles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "motion-principles", 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 nodetool-ai/nodetool --skill motion-principles -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install nodetool-ai/nodetool motion-principles --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nodetool-ai/nodetool.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/packages/system-skills/motion-principles .cursor/skills/motion-principles && 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 "motion-principles" agent skill from https://github.com/nodetool-ai/nodetool/tree/main/packages/system-skills/motion-principles into .cursor/skills/motion-principles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "motion-principles", 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/nodetool-ai/nodetool.git --path packages/system-skills/motion-principles--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 nodetool-ai/nodetool --skill motion-principles -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install nodetool-ai/nodetool motion-principles --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nodetool-ai/nodetool.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/packages/system-skills/motion-principles .gemini/skills/motion-principles && 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 "motion-principles" agent skill from https://github.com/nodetool-ai/nodetool/tree/main/packages/system-skills/motion-principles into .gemini/skills/motion-principles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "motion-principles", 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 nodetool-ai/nodetool motion-principlesInstalls 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 nodetool-ai/nodetool --skill motion-principles -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/nodetool-ai/nodetool.git skills-src && mkdir -p .github/skills && cp -r skills-src/packages/system-skills/motion-principles .github/skills/motion-principles && 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 "motion-principles" agent skill from https://github.com/nodetool-ai/nodetool/tree/main/packages/system-skills/motion-principles into .github/skills/motion-principles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "motion-principles", 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 nodetool-ai/nodetool --skill motion-principles -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install nodetool-ai/nodetool motion-principles --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/nodetool-ai/nodetool.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/packages/system-skills/motion-principles .opencode/skills/motion-principles && 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 "motion-principles" agent skill from https://github.com/nodetool-ai/nodetool/tree/main/packages/system-skills/motion-principles into .opencode/skills/motion-principles/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "motion-principles", 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.
motion-principlesChoose timing, easing, stagger, anticipation, and follow-through for a NodeTool timeline.
Motion Principles is an agent skill from nodetool-ai/nodetool. Choose timing, easing, stagger, anticipation, and follow-through for a NodeTool timeline. Use when motion feels stiff, floaty, busy, or late, or when an entrance, transition, or beat-bound animation needs a duration and curve. The op contract lives in timeline-edit-ops; the build loop is motion-graphics.
Its SKILL.md is about 2.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Media & Creative, covering Motion graphics. The repository describes itself as: Agent-first Creative Workspace. The licence is AGPL-3.0.
Read from SKILL.md and the folder at commit 515bd28. 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.
No scripts in the folder and no shell commands in SKILL.md (its code samples are json and javascript).
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
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.
Motion Principles loads about 2.9k tokens when it runs. Until then it costs about 81 tokens; SKILL.md has 1,498 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 nodetool-ai/nodetool at commit 515bd28, republished under its AGPL-3.0 licence (© nodetool-ai). 1,498 words, ~2,858 tokens.
.claude/skills/motion-principles/SKILL.md (or your agent's skills folder).timeline-edit-ops is how to write an animation onto a clip with
edit_timeline. This is how to decide what to write. Every number here is in
the units animate_clip takes: milliseconds, a normalized 0..1 distance, an
easing string.
Building with @nodetool-ai/sandbox-timeline instead (motion-graphics
picks the surface)? Every number below still applies — only the unit
changes. durationMs becomes dur in seconds (divide by 1000: 400ms is
dur: 0.4). A normalized 0..1 distance becomes actual px, against the
frame's own width/height (0.3 on a 1920-wide frame is offsetX: 576 in
from). Easing strings are identical — ease: "outExpo" or a raw curve —
and every role still means the same thing: el.enter() is in, el.exit()
is out, el.animate() covers emphasis and general keyframing,
el.loop() is loop. el.count(), el.draw(), el.scramble(),
el.typewriter(), el.expr() and el.morph() have no ops equivalent
below; they are shortcuts for a ticker, a trimEnd draw-on, a scramble
reveal, a whole-clip typewriter entrance, a hand-written keyframe function,
and a path outline morph.
| Pillar | The question | What it decides |
|---|---|---|
| Emotional intent | What should the viewer feel? | Easing, duration, overshoot |
| Visual narrative | Setup, action, resolution — what enters when? | Sequencing, delayMs, stagger |
| Motion craft | Why does it look believable? | Anticipation, follow-through, arcs |
A number chosen before the intent is a number you will change twice.
Plan three levels of attention. Track index controls their z-order, while timing decides which one the eye follows:
loop preset
at low amplitude on the bed.motion-direction ranks the same three as Hero / Support / Texture and decides
which elements earn each. Two clips carrying primary motion at once is the most
common cause of a busy frame.
linear reads as robotic. Keep it for motion that never lands: the loop
presets float, rotate and hueShift, and the shake emphasis, whose
zig-zag is linear by default. Everything the eye reads as an event decelerates
into rest.
| Action | Easing | Why |
|---|---|---|
Entrance (in) | easeOut, or cubic-bezier(0.16,1,0.3,1) for a sharper landing | Arrives with energy, settles |
Exit (out) | easeIn, or cubic-bezier(0.7,0,0.84,0) | Accelerates away |
| A move that stays on screen | easeInOut, or cubic-bezier(0.65,0,0.35,1) | Symmetric, no false weight |
| Playful landing | easeOutBack, or cubic-bezier(0.34,1.56,0.64,1) | The value past 1 is the overshoot |
| Physical settle | spring(180,12,1) one overshoot, spring(180,26,1) none | Solves a real spring; all three constants positive |
| Held pose, then jump | hold on the ending keyframe's segment | Keeps the prior value until the segment ends |
The role defaults already do the right thing: in gets easeOut, out gets
easeIn. Leave easing unset unless you want something the default is not.
A string the parser cannot read eases linearly and reports unknown_easing —
easeOut, never ease-out.
Overshoot reads as toy-like. Keep easeOutBack, easeOutElastic and
easeOutBounce off anything financial, medical or corporate.
| Element | durationMs |
|---|---|
Micro beat: a flash, a pulse on a small element | 150–250 |
| Title, lower third, overlay entrance | 300–500 |
Hero element, full-frame plate, a blur rack | 500–800 |
Camera move: kenBurns, a slow push | 1500–4000 |
Distance and area scale it. A caption travelling distance: 0.05 and a
full-bleed plate travelling 0.5 must not share 400ms — the plate looks
weightless. Add roughly 30–50% when the travel or the area doubles.
Two limits the engine enforces rather than warns about in prose:
in + out must fit the clip with hold left over. A 3000ms title with 500ms
each way holds 2000ms. Under about 1000ms of hold the element never settles
and reads as a glitch. Over-long windows report animation_exceeds_clip.loop cycle longer than the clip shows a fragment. kenBurns at its 3000ms
default on a 2000ms clip is a drift that stops halfway.Never reveal a group in one event. On a text clip, stagger splits the
animation per word, grapheme or wrapped line. Which unit counts what, and how
the count changes with the frame, is in motion-graphics.
| Content | offsetMs |
|---|---|
| A phrase that should arrive with texture | 60–100 |
| A short punchline landing word by word | 150–250 |
| More than five words | do not stagger — the reader is waiting on the sentence |
The span is durationMs + offsetMs × (units − 1), halved for from: "center".
Work it out and compare it against the clip's durationMs minus delayMs. A
span that does not fit is compressed silently: the engine shrinks the offset,
never the per-unit duration, so the line lands flatter than written and only
validate_timeline says so, as stagger_compressed.
For a group of separate clips — three lower-third parts, five icons — stagger by
giving each clip's in animation a delayMs 60–80ms apart, and cap the whole
reveal near 700ms. Past that the tail drags.
slide with distance above 0.35 reads as "the template
moved". Break it with a scale or opacity change on the same window, or shorten
the travel.The three that separate animated from moved. None has a preset; each is a
custom animation, which is where a short code body earns its place.
Anticipation — a counter-move of 60–120ms before the main action. Ask for a dip before a pop:
{"role": "in", "preset": "custom", "durationMs": 520,
"curves": [{"property": "scale", "keyframes": [
{"t": 0, "value": 1}, {"t": 0.2, "value": 0.94, "easing": "easeInOut"},
{"t": 0.75, "value": 1.06, "easing": "easeOut"}, {"t": 1, "value": 1}]}]}Follow-through — attached parts settle 40–80ms after the body. Give the
child clip the same preset and a delayMs 60ms later, rather than animating the
whole group as one block.
Arcs — straight-line translation of anything organic looks mechanical. Drive
offsetX linearly and offsetY as a shallow curve over the same window; the
two fold as add, so they compose.
A decaying bounce, an arc, or a settle written as a function of time is a code
body returning samples — one bag per point, {t, offsetY}, at
inputs.sampleCount points. The body runs once at author time, hermetically, and
reads role, durationMs, clipDurationMs, canvasWidth, canvasHeight,
params, staggerCount and sampleCount off inputs:
// fragment
const n = inputs.sampleCount;
const h = 0.06 * inputs.canvasHeight;
const samples = [];
for (let i = 0; i < n; i++) {
const t = i / (n - 1);
// three decaying hops, ending exactly at rest
const y = -h * Math.abs(Math.sin(Math.PI * 3 * t)) * (1 - t);
samples.push({ t, offsetY: y });
}
return { samples };Land the last sample on the identity value — 0 for an offset, 1 for a scale or
an opacity — when the motion should settle. An in curve contributes nothing
after its window, an out curve holds its last value after the window, and an
emphasis curve returns to its base outside the window.
Land impact keyframes on the beat. At 120 BPM a beat is 500ms and the eighth
grid is 250ms. beat-sync-editing turns detected onsets into markers and
snaps. For motion that should follow later tempo edits, store beat on the
animation in the full timeline document. Its index is one-based, scope
is clip or sequence, and offsetMs can place anticipation before the hit.
edit_timeline's animate_clip input does not author this field; use
get_timeline and set_timeline_document as described in motion-graphics.
{"id":"impact","role":"emphasis","preset":"pulse","durationMs":240,"beat":{"index":3,"scope":"sequence","offsetMs":-20}}A move ending 80ms after a hit reads late, and one ending 80ms before it can
weaken the impact. Use offsetMs deliberately for anticipation.
With no music, keep one major event per 500–800ms so the piece breathes at a constant pulse.
spring(stiffness,damping,mass) shapes the motion inside the animation's
durationMs; it is scaled to settle near the end of that window. Use it for a
physical-looking landing, then set durationMs against the cut as you would
for any other easing. For a precise held pose or hard timecode, write
keyframes and put hold on the segment that should stay still.
Use per-clip motionBlur when a fast move strobes. Start with a 180-degree
shutter and raise samplesPerFrame only as far as the frame needs; the highest
requested sample count is shared by the scene. Use steppedTime.fps for a
deliberate low-frame-rate look, or temporalEcho for delayed copies. These are
stored clip fields written through set_timeline_document, not
animate_clip parameters.
| It feels | Because | Fix |
|---|---|---|
| Stiff, robotic | linear or a symmetric curve on an entrance | easeOut, or drop easing and take the role default |
| Floaty, slow | Duration too long, curve too gentle | Cut 30%, sharpen to cubic-bezier(0.16,1,0.3,1) |
| Cheap, janky | Everything arrives at once, one duration for every size | Stagger, and scale duration with area |
| Mechanical despite easing | No anticipation, no overlap, straight-line paths | A custom dip before the move; 60ms offsets on attached parts |
| Busy | Two primary moves in one frame | Demote one to a loop or hold it still |
| Staggered text does not look staggered | Span exceeded the clip and was compressed | Lengthen the clip or lower offsetMs yourself |
| Need | Value |
|---|---|
| Entrance | easeOut / cubic-bezier(0.16,1,0.3,1), 300–500ms |
| Exit | easeIn / cubic-bezier(0.7,0,0.84,0), 200–300ms |
| Move in place | easeInOut, 300–400ms |
| Playful landing | easeOutBack, 400–600ms |
| Word stagger | 60–100ms, five words or fewer |
| Clip-to-clip stagger | 60–80ms delayMs steps, whole reveal ≤ 700ms |
| Continuous loop | linear when constant speed is intended |
| Travel cap | distance ≤ 0.35 without a second channel |
© nodetool-ai, AGPL-3.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in packages/system-skills/motion-principles of nodetool-ai/nodetool.
Open the folder on GitHubat commit 515bd28
Motion Principles 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 |
|---|---|---|---|---|---|---|
| Motion Principles this skillnodetool-ai/nodetool | 556 | — | ~2.9k | Automated safety check: Pass | AGPL-3.0 | |
| HyperFrames Animationheygen-com/hyperframes | 59k | 3 repos | ~2.1k | Automated safety check: Pass | Apache-2.0 | |
| Slack GIF Creatoranthropics/skills | 180k | 29 repos | ~2k | Automated safety check: Pass | Apache-2.0 | |
| Stitch to Remotion Walkthrough Videosgoogle-labs-code/stitch-skills | 8.4k | 6 repos | ~3.2k | Automated safety check: Notes | Apache-2.0 | |
| Faceless Explainer Videoheygen-com/hyperframes | 59k | 3 repos | ~7.7k | Automated safety check: Notes | Apache-2.0 | |
| Video ShotcraftVincentwei1021/video-shotcraft | 11k | — | ~2.6k | Automated safety check: Pass | Apache-2.0 |
heygen-com/hyperframes
Collects motion rules, scene blueprints, transitions and runtime adapters for HyperFrames video compositions, with GSAP as the default animation runtime.
anthropics/skills
Provides Slack size and frame limits, Python animation helpers and validators for building animated GIFs sized for emoji and messages.
google-labs-code/stitch-skills
Builds walkthrough videos from Stitch design projects using Remotion, with transitions, zoom effects and text overlays on each screen.
heygen-com/hyperframes
Turns an article, notes or a topic brief into an explainer video whose visuals are invented per scene, built frame by frame in HyperFrames with no footage.
Vincentwei1021/video-shotcraft
Makes cinematic product videos with Remotion from shot recipe cards, a ready template, real page screenshots, camera moves and sound design, or builds a single animated shot.
heygen-com/hyperframes
Imports Figma assets, brand tokens, components and motion into a HyperFrames video composition, using the Figma REST API with a connector or native export for shaders.
nodetool-ai/nodetool
Cut a NodeTool timeline to music and shape its pacing — detect the beat grid, place cuts on phrases, pick a cut type, build speed ramps with time remap, and give the piece an arc.
nodetool-ai/nodetool
Add and animate a consistent text layer on an existing NodeTool timeline.
nodetool-ai/nodetool
Choose and animate colour on a NodeTool timeline, including shape and text gradients, colour grades, 3D LUTs, and dither.
nodetool-ai/nodetool
Write a shootable, precisely timed commercial beat sheet and store it as a NodeTool storyboard, with a consistent entity roster behind every shot.
nodetool-ai/nodetool
Direct ElevenLabs speech, dialogue, sound effects and music — the bracketed audio tags v3 acts on and why the voice decides whether a tag lands, stability as the delivery dial, punctuation instead…
nodetool-ai/nodetool
Stage the frame on a NodeTool timeline — grids, focal placement, safe areas per aspect ratio, depth layers and parallax, camera moves, and where elements enter and leave.
Categories
Choose timing, easing, stagger, anticipation, and follow-through for a NodeTool timeline. Motion Principles is an agent skill from nodetool-ai/nodetool. Choose timing, easing, stagger, anticipation, and follow-through for a NodeTool timeline.
Motion Principles fits situations like: motion feels stiff; beat-bound animation needs a duration and curve.
Run `npx skills add nodetool-ai/nodetool --skill motion-principles -a claude-code`. Or copy the skill folder (packages/system-skills/motion-principles in nodetool-ai/nodetool) into .claude/skills/motion-principles in your project. Claude Code loads it when a task matches its description.
Run `npx skills add nodetool-ai/nodetool --skill motion-principles -a codex`. Or copy the skill folder (packages/system-skills/motion-principles in nodetool-ai/nodetool) into .agents/skills/motion-principles 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 nodetool-ai/nodetool --skill motion-principles -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/motion-principles, .gemini/skills/motion-principles, .github/skills/motion-principles and .opencode/skills/motion-principles in your project.
SKILL.md names no scripts, command-line tools or credentials: Motion Principles is instructions for the agent only.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. 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.
Motion Principles is published under the AGPL-3.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.9k tokens (SKILL.md is roughly 11k 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 Motion Principles: HyperFrames Animation (heygen-com/hyperframes, 59k stars), Slack GIF Creator (anthropics/skills, 180k stars), Stitch to Remotion Walkthrough Videos (google-labs-code/stitch-skills, 8.4k stars) and Faceless Explainer Video (heygen-com/hyperframes, 59k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
nodetool-ai (a GitHub organization) maintains it in nodetool-ai/nodetool, which has 556 GitHub stars. The repository holds 127 skills in this directory. The repository was last updated on October 8, 2026.
Source: nodetool-ai/nodetool on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.