Agent skill

Motion Principles

by nodetool-ai in nodetool-ai/nodetool

Choose timing, easing, stagger, anticipation, and follow-through for a NodeTool timeline.

AGPL-3.0Auto-check passedMedia & Creative

Install Motion Principles

skills CLI
$ npx skills add nodetool-ai/nodetool --skill motion-principles -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install nodetool-ai/nodetool motion-principles --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ 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-src

Use ~/.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/

Facts

Skill name
motion-principles
GitHub stars
556
Token cost
~2.9k tokens
SKILL.md length
1,498 words
Files
1
Skills in repo
127
Repo updated
First seen
Licence
AGPL-3.0

At a glance

Choose timing, easing, stagger, anticipation, and follow-through for a NodeTool timeline.

  • Motion feels stiff
  • SKILL.md covers The same numbers, written as…, Settle three things before…, Three layers, or the frame… and Easing is the biggest lever, plus 9 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md
  • Beat-bound animation needs a duration and curve

What it does

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.

When your agent uses it

  • Motion feels stiff
  • Beat-bound animation needs a duration and curve

Example prompts

  • “/motion-principles”

What it can do on your machine

Read from SKILL.md and the folder at commit 515bd28. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    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.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

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.

Always · name and description, kept in context so the agent knows when to use it
~81
When it runs · the whole SKILL.md, loaded when a task matches
~2.9k

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.

Safety

Auto-check passed

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.

SKILL.md

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.

Download SKILL.mdSave it as .claude/skills/motion-principles/SKILL.md (or your agent's skills folder).
name
motion-principles
description
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.
featured
true

Motion Principles → the numbers before the call

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.

The same numbers, written as code

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.

Settle three things before picking a number

PillarThe questionWhat it decides
Emotional intentWhat should the viewer feel?Easing, duration, overshoot
Visual narrativeSetup, action, resolution — what enters when?Sequencing, delayMs, stagger
Motion craftWhy does it look believable?Anticipation, follow-through, arcs

A number chosen before the intent is a number you will change twice.

Three layers, or the frame reads flat

Plan three levels of attention. Track index controls their z-order, while timing decides which one the eye follows:

  • Primary — the one move the eye follows. The clip the shot is about.
  • Secondary — supporting motion reacting to the primary: a scrim settling late, a label arriving 80ms after the plate.
  • Ambient — background life that never asks for attention. A 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.

Easing is the biggest lever

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.

ActionEasingWhy
Entrance (in)easeOut, or cubic-bezier(0.16,1,0.3,1) for a sharper landingArrives with energy, settles
Exit (out)easeIn, or cubic-bezier(0.7,0,0.84,0)Accelerates away
A move that stays on screeneaseInOut, or cubic-bezier(0.65,0,0.35,1)Symmetric, no false weight
Playful landingeaseOutBack, or cubic-bezier(0.34,1.56,0.64,1)The value past 1 is the overshoot
Physical settlespring(180,12,1) one overshoot, spring(180,26,1) noneSolves a real spring; all three constants positive
Held pose, then jumphold on the ending keyframe's segmentKeeps 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.

Duration carries weight

ElementdurationMs
Micro beat: a flash, a pulse on a small element150–250
Title, lower third, overlay entrance300–500
Hero element, full-frame plate, a blur rack500–800
Camera move: kenBurns, a slow push1500–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.
  • A loop cycle longer than the clip shows a fragment. kenBurns at its 3000ms default on a 2000ms clip is a drift that stops halfway.

Stagger is rhythm, and it is clamped

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.

ContentoffsetMs
A phrase that should arrive with texture60–100
A short punchline landing word by word150–250
More than five wordsdo 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.

The 1/3 rule, in both forms

  • Distance. Nothing travels more than about a third of the frame in one unbroken move. 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.
  • Simultaneity. With three or more elements, keep at most a third in active motion at any instant. The rest hold, or run ambient loops.
Show full SKILL.md (609 more words)Show less

Anticipation, follow-through, arcs

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:

json
{"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:

js
// 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.

Rhythm against audio

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.

json
{"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 or duration

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.

Frame texture

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.

Diagnosing

It feelsBecauseFix
Stiff, roboticlinear or a symmetric curve on an entranceeaseOut, or drop easing and take the role default
Floaty, slowDuration too long, curve too gentleCut 30%, sharpen to cubic-bezier(0.16,1,0.3,1)
Cheap, jankyEverything arrives at once, one duration for every sizeStagger, and scale duration with area
Mechanical despite easingNo anticipation, no overlap, straight-line pathsA custom dip before the move; 60ms offsets on attached parts
BusyTwo primary moves in one frameDemote one to a loop or hold it still
Staggered text does not look staggeredSpan exceeded the clip and was compressedLengthen the clip or lower offsetMs yourself

Quick reference

NeedValue
EntranceeaseOut / cubic-bezier(0.16,1,0.3,1), 300–500ms
ExiteaseIn / cubic-bezier(0.7,0,0.84,0), 200–300ms
Move in placeeaseInOut, 300–400ms
Playful landingeaseOutBack, 400–600ms
Word stagger60–100ms, five words or fewer
Clip-to-clip stagger60–80ms delayMs steps, whole reveal ≤ 700ms
Continuous looplinear when constant speed is intended
Travel capdistance ≤ 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

Files

Just SKILL.md in packages/system-skills/motion-principles of nodetool-ai/nodetool.

Open the folder on GitHubat commit 515bd28

Compare with similar skills

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.

Motion Principles compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Motion Principles this skillnodetool-ai/nodetool556—~2.9kAutomated safety check: PassAGPL-3.0
HyperFrames Animationheygen-com/hyperframes59k3 repos~2.1kAutomated safety check: PassApache-2.0
Slack GIF Creatoranthropics/skills180k29 repos~2kAutomated safety check: PassApache-2.0
Stitch to Remotion Walkthrough Videosgoogle-labs-code/stitch-skills8.4k6 repos~3.2kAutomated safety check: NotesApache-2.0
Faceless Explainer Videoheygen-com/hyperframes59k3 repos~7.7kAutomated safety check: NotesApache-2.0
Video ShotcraftVincentwei1021/video-shotcraft11k—~2.6kAutomated safety check: PassApache-2.0

Similar skills

  • 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.

    59k GitHub starsUsed in 3 repos~2.1k tokens
    Media & CreativeAuto-check passed
  • Slack GIF Creator

    anthropics/skills

    Official

    Provides Slack size and frame limits, Python animation helpers and validators for building animated GIFs sized for emoji and messages.

    180k GitHub starsUsed in 29 repos~2k tokens
    Media & CreativeAuto-check passed
  • Stitch to Remotion Walkthrough Videos

    google-labs-code/stitch-skills

    Official

    Builds walkthrough videos from Stitch design projects using Remotion, with transitions, zoom effects and text overlays on each screen.

    8.4k GitHub starsUsed in 6 repos~3.2k tokens
    Media & CreativeAuto-check: notes
  • Faceless Explainer Video

    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.

    59k GitHub starsUsed in 3 repos~7.7k tokens
    Media & CreativeAuto-check: notes
  • Video Shotcraft

    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.

    11k GitHub stars~2.6k tokensUpdated 3 days ago
    Media & CreativeAuto-check passed
  • Figma to HyperFrames

    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.

    59k GitHub starsUsed in 3 repos~4.5k tokens
    Media & CreativeAuto-check: notes

More from nodetool-ai/nodetool

All 127 skills in this repo
  • Beat Sync Editing

    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.

    556 GitHub stars~2.6k tokensUpdated today
    Auto-check passed
  • Caption Titles

    nodetool-ai/nodetool

    Add and animate a consistent text layer on an existing NodeTool timeline.

    556 GitHub stars~1.9k tokensUpdated today
    Auto-check passed
  • Color Motion

    nodetool-ai/nodetool

    Choose and animate colour on a NodeTool timeline, including shape and text gradients, colour grades, 3D LUTs, and dither.

    556 GitHub stars~2.3k tokensUpdated today
    Auto-check passed
  • Commercial Beat Sheet

    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.

    556 GitHub stars~4.6k tokensUpdated today
    Auto-check passed
  • Elevenlabs Audio Prompting

    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…

    556 GitHub stars~1.9k tokensUpdated today
    Auto-check passed
  • Frame Composition

    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.

    556 GitHub stars~3.5k tokensUpdated today
    Auto-check passed

Questions about Motion Principles

What does Motion Principles do?

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.

When should I use Motion Principles?

Motion Principles fits situations like: motion feels stiff; beat-bound animation needs a duration and curve.

How do I install Motion Principles in Claude Code?

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.

How do I install Motion Principles in Codex?

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.

Can I use Motion Principles in Cursor, Gemini CLI or GitHub Copilot?

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.

What does Motion Principles need to run?

SKILL.md names no scripts, command-line tools or credentials: Motion Principles is instructions for the agent only.

Does Motion Principles access the network?

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.

Is Motion Principles safe to install?

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.

What licence does Motion Principles use?

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.

How many tokens does Motion Principles use?

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.

What are the alternatives to Motion Principles?

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.

Who maintains Motion Principles?

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.