Agent skill

Beat Sync Editing

by nodetool-ai in 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.

AGPL-3.0Auto-check passedMedia & Creative

Install Beat Sync Editing

skills CLI
$ npx skills add nodetool-ai/nodetool --skill beat-sync-editing -a claude-code

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

GitHub CLI
$ gh skill install nodetool-ai/nodetool beat-sync-editing --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/beat-sync-editing .claude/skills/beat-sync-editing && 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
beat-sync-editing
GitHub stars
560
Token cost
~2.6k tokens
SKILL.md length
1,522 words
Files
1
Skills in repo
127
Repo updated
First seen
Licence
AGPL-3.0

At a glance

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.

  • Clips should land on the music
  • SKILL.md covers Get the grid from the audio,…, Cut on phrases, not on beats, Shape an arc and Hide the seam, plus 4 more sections
  • Instructions only: no scripts, shell commands, URLs or credentials in SKILL.md
  • A hit needs impact

What it does

Beat Sync Editing is an agent skill from 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. Use when clips should land on the music, when pacing drags or feels choppy, when a hit needs impact, or when transitions feel arbitrary. Not for what each shot contains.

Its SKILL.md is about 2.6k 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. The repository describes itself as: Agent-first Creative Workspace. The licence is AGPL-3.0.

When your agent uses it

  • Clips should land on the music
  • A hit needs impact
  • Transitions feel arbitrary

Example prompts

  • “/beat-sync-editing”

What it can do on your machine

Read from SKILL.md and the folder at commit 58765d3. 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).

    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

Beat Sync Editing loads about 2.6k tokens when it runs. Until then it costs about 92 tokens; SKILL.md has 1,522 words of instructions outside code blocks.

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

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 58765d3, republished under its AGPL-3.0 licence (© nodetool-ai). 1,522 words, ~2,630 tokens.

Download SKILL.mdSave it as .claude/skills/beat-sync-editing/SKILL.md (or your agent's skills folder).
name
beat-sync-editing
description
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. Use when clips should land on the music, when pacing drags or feels choppy, when a hit needs impact, or when transitions feel arbitrary. Not for what each shot contains.
featured
true

Beat-Sync Editing → cuts, rhythm and retiming

Where a cut lands matters as much as what is on screen. This turns a track and a brief into millisecond cut points on the timeline.

motion-direction sets the energy; this turns it into a grid and an arc. motion-graphics carries the op contract for the calls named here. video-audio-continuity decides where the bed comes from before there is a grid to read: a track you add yourself, or one generated clip carrying every scene.

Get the grid from the audio, not from arithmetic

When the bed does not exist yet, generate it with the grid in mind: a Stable Audio prompt states its BPM (stable-audio-prompting), and an ElevenLabs composition_plan pins each section's length in milliseconds (elevenlabs-audio-prompting), so the drop lands where the plan says instead of where the model felt like putting it. Then measure it anyway — the generated file, not the prompt, is the grid.

detect_audio_events on the music clip reports onsets and a tempo.

  • onsets.times are in seconds. Every timeline op takes milliseconds, so multiply by 1000. This is the single most common mistake here.
  • Read tempo.reliable before you build anything off bpm. Speech and room tone produce a confident-looking number from nothing. Unreliable means use the onsets directly.
  • The first onset is the grid's offset. A grid anchored at 0 instead of beat one puts every cut a few frames early — the edit that feels "almost right".

With a reliable tempo:

ms_per_beat = 60000 / bpm
frames_per_beat = (60 / bpm) × fps          # fps comes from get_timeline

At 120 BPM: 500ms a beat, 15 frames at 30fps, a 2000ms bar. Round each cumulative beat, never the step, or the grid drifts over a long edit.

Lay the grid down so you can see it, then pull edges onto it:

json
{"op": "set_markers_from_beats", "onsets_ms": [0, 500, 1000], "count": 32}
{"op": "snap_to_beats", "targets": "all", "tolerance_ms": 60,
 "mode": "start", "action": "move"}

Either takes onsets_ms, or a bpm with an offset_ms. The 60ms default tolerance is about two frames at 30fps — close enough to read as on the beat, tight enough not to drag an edge onto a beat it was never near. snap_to_beats reports every target including the ones nothing was in reach of, with the reason. action: "move" keeps the clip's length and shifts what follows; action: "trim" changes the length and leaves the neighbours alone. Move a title that has to land on a hit; trim a picture clip whose out point has to meet the next shot.

For an animation that should follow tempo changes, store a beat anchor on the animation: {index: 3, scope: "clip", offsetMs: -20} counts from the clip's start; scope: "sequence" counts from the document tempo's offsetMs. index is one-based, and delayMs adds another offset. This is distinct from snapping a clip edge or baking a measured audio curve. animate_clip does not accept beat in its tool input; write the animation's beat through the full document with set_timeline_document. A stored animation needs its id, role, preset, and durationMs; keep those and the rest of the animation when adding beat. Keep the document's tempo, setup, media tracks, template identity, clips, tracks, and markers in the write.

Cut on phrases, not on beats

A cut on every beat is relentless and the viewer fatigues by beat eight. Cut on 2, 4 or 8 beats, and accent on the eighth grid sparingly.

PersonalityCut everyTransition familyRetime
Playful4 beats, syncopated accentsHard cut, occasional pushLight ramps
Premium8–16 beats, long holdsHard cut, occasional crossfadeSlow, smooth
Corporate8 beats, steadyHard cut onlyNone
Energetic1–2 beats at the peakHard cut, zoom, pushAggressive, on the beat

Put the single biggest visual on the drop. One piece, one peak.

Shape an arc

Uniform pacing reads as flat regardless of content.

PhaseCut everyShot lengthNote
Establish8–16 beatsLongestSet the place, let it breathe
Develop8 → 4 beatsShorteningAccelerate to build
Climax1–2 beatsShortestThe drop, the biggest visual, the ramp
ResolveOne long holdLongestThe end card breathes after the peak

Hide the seam

A cut is invisible when motion carries the eye across it. Cut during a movement, and match its direction and speed across the cut. For graphics, cut at a transform peak — mid-travel, not at rest.

Default to the hard cut: two clips on the same track, meeting exactly. Reach for anything else only when it is motivated.

CutHow, on the timelineReach for it when
Hard cutAdjacent clips, no overlap, no set_transitionNine cuts in ten
Match cutHard cut where both frames share a shape, position or motion vectorTwo shots rhyme; the strongest move in motion design
Crossfadeset_transition crossfade on the incoming clip, clips overlapped by at least its durationMsTwo shots of the same scene
DipdipToColor with your own colorA chapter break
Wipe / push / slideThose types with a direction naming the edge the incoming clip arrives fromA graphic feel, or lateral energy
ZoomzoomPushing into the next beat
J-cutThe next clip's audio clip starts 4–12 frames before its picture, on its own audio trackDialogue, reveals: it pulls the viewer forward
L-cutThe current clip's audio runs 12–24 frames under the next pictureScene changes, ambience
WhipA short offsetX move plus a blur effect either side of a hard cutHype, a scene jump

Two things the engine does whether you asked or not:

  • Two clips on one track whose times overlap dissolve across the overlap with no call at all. An accidental overlap is an accidental dissolve. When a cut looks soft where you wanted it hard, check startMs and durationMs first.
  • A transition plays over the incoming clip's head against whatever is beneath it. With no overlap there is nothing under it and it reads as a fade from black.

J and L cuts are built by splitting picture and sound onto separate clips, not by a transition: the shot's audio twin already sits on its own audio track after an assemble, so move that clip rather than the picture.

Show full SKILL.md (536 more words)Show less

Speed ramps

set_time_remap maps timeline time onto source time. t runs 0..1 over the clip's own window, must start at 0, end at 1 and ascend; sourceMs says which millisecond of the source plays there. Descending sourceMs is a reverse, a flat pair is a freeze.

Ramp into a hit and snap out, with the slowest frame on the beat. On a 2000ms clip whose impact sits at 1200ms:

json
{"op": "set_time_remap", "target": "Shot 3", "timeRemap": {"keyframes": [
  {"t": 0, "sourceMs": 0},
  {"t": 0.5, "sourceMs": 900, "easing": "easeIn"},
  {"t": 0.6, "sourceMs": 1000, "easing": "easeOut"},
  {"t": 1, "sourceMs": 2400}]}}

Between 0.5 and 0.6 the source advances 100ms across 200ms of timeline: quarter speed on the hit. t that repeats or goes backwards is time_remap_not_monotonic, an error. split_clip and trim_clip refuse a remapped clip, because re-deriving the curve silently is how a ramp becomes a different move — clear the remap, cut, re-apply.

speedMultiplier on set_clip_params is the flat alternative: one rate for the whole clip, no curve. Use it when nothing needs to ramp.

For rhythmic texture, steppedTime: {fps} quantizes one clip's sampling clock. temporalEcho: {copies, intervalMs, opacityDecay} draws delayed copies, which can trail a hit without duplicating clips by hand. A clip's motionBlur sets samplesPerFrame and shutterAngle for its own shutter window. Values above one request a minimum scene sample count; the scene uses the highest request, capped at 32, and samples each layer evenly over its own shutter. Set these fields in the full timeline document. set_clip_params refuses them.

If motion must follow the actual audio envelope or detected onsets, use bake_audio_animation. It writes a source-anchored curve with bakedFrom provenance through set_baked_animation; re-baking replaces that measured curve. A beat anchor instead recomputes timing from the document tempo, while markers and snap_to_beats move edit points.

The plan, before the calls

Write the cut down before editing, in the units the ops take:

  • Track spec: bpm, fps, the first onset in ms, the drop in ms, ms per beat.
  • The four phases with their ms ranges and target shot length.
  • Every cut as an absolute ms, its clip, and its cut type.
  • Audio offsets in ms for each J and L cut.
  • Each ramp as its t / sourceMs keyframes.
  • The marker list you will pass to set_markers_from_beats.

Check it

validate_timeline after every batch: it catches overlapping clips, a transition longer than the clip carrying it, and clips shorter than a frame.

Then look and listen. preview_timeline_frame at the ms either side of a cut says whether the seam is where you think it is; analyze_audio on the music confirms the grid you built matches the file. Before calling the cut done, render_timeline — a preview answers what one timecode looks like, a render answers whether it plays.

Common mistakes

SymptomCauseFix
FranticA cut on every beatCut on 2, 4 or 8 beat phrases
Almost on beatGrid anchored at 0, ignoring the first onsetAnchor to the onset, in ms
Drift over a long editRounding each stepRound each cumulative beat
Jarring cutPlaced at rest, between motionsCut mid-motion, match direction
Soft where it should be hardOverlapping clips on one trackFix startMs and durationMs
Transition fades from blackNothing beneath the incoming headOverlap the clips by the transition's durationMs
FlatUniform pacingEstablish, develop, climax, resolve
Nothing landsNo single peakOne biggest visual, on the drop, then a hold

© 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/beat-sync-editing of nodetool-ai/nodetool.

Open the folder on GitHubat commit 58765d3

Compare with similar skills

Beat Sync Editing 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.

Beat Sync Editing compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Beat Sync Editing this skillnodetool-ai/nodetool560—~2.6kAutomated safety check: PassAGPL-3.0
Guizang Social Cardsop7418/guizang-social-card-skill7.4k1 repos~7.8kAutomated safety check: PassAGPL-3.0
Weekly Changelog Videoheygen-com/hyperframes59k—~3.3kAutomated safety check: PassApache-2.0
Anthropic Brand Stylinganthropics/skills180k30 repos~559Automated safety check: PassApache-2.0
MoneyPrinterTurbo Video Generatorharry0703/MoneyPrinterTurbo129k—~2.1kAutomated safety check: WarnMIT
Brag Slim Launch Video Makerlatent-spaces/brag14k1 repos~1.9kAutomated safety check: PassMIT

Similar skills

  • Guizang Social Cards

    op7418/guizang-social-card-skill

    Produces social card sets for Xiaohongshu and WeChat: carousels, Live Photo motion cards and puzzle layouts, and WeChat cover pairs, rendered from single-file HTML.

    7.4k GitHub starsUsed in 1 repo~7.8k tokens
    Media & CreativeAuto-check passed
  • Weekly Changelog Video

    heygen-com/hyperframes

    Turns a weekly changelog markdown file into a branded HyperFrames video with voiceover, animated mock-UI scenes and captions, using fonts, background and scripts bundled in the skill.

    59k GitHub stars~3.3k tokensUpdated today
    Media & CreativeAuto-check passed
  • Anthropic Brand Styling

    anthropics/skills

    Official

    Applies Anthropic's brand colors and fonts to artifacts such as PowerPoint slides, using fixed hex values for text and accents, Poppins headings and Lora body text.

    180k GitHub starsUsed in 30 repos~559 tokens
    Media & CreativeAuto-check passed
  • MoneyPrinterTurbo Video Generator

    harry0703/MoneyPrinterTurbo

    Installs and runs MoneyPrinterTurbo to turn a topic or script into a finished short video with voice-over, subtitles, stock footage and music.

    129k GitHub stars~2.1k tokensUpdated today
    Media & CreativeAuto-check: warnings
  • Builds a short, shareable launch video with music and motion from a project directory or a website URL, using only tools already on the machine.

    14k GitHub starsUsed in 1 repo~1.9k tokens
    Media & CreativeAuto-check passed
  • HyperFrames Media Use

    heygen-com/hyperframes

    Finds, generates and edits media for HyperFrames video projects: music, sound effects, images, icons, logos, voiceovers, captions and color grades.

    59k GitHub stars~2.4k tokensUpdated today
    Media & CreativeAuto-check passed

More from nodetool-ai/nodetool

All 127 skills in this repo
  • Caption Titles

    nodetool-ai/nodetool

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

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

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

    560 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…

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

    560 GitHub stars~3.5k tokensUpdated today
    Auto-check passed
  • Gpt Image 2 Prompting

    nodetool-ai/nodetool

    Prompt OpenAI's GPT Image 2 — the five-slot Scene/Subject/Details/Use case/Constraints template it responds to, the change-versus-preserve shape for edits, labelled multi-image compositing, and how…

    560 GitHub stars~1.6k tokensUpdated today
    Auto-check passed

Questions about Beat Sync Editing

What does Beat Sync Editing do?

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. Beat Sync Editing is an agent skill from 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.

When should I use Beat Sync Editing?

Beat Sync Editing fits situations like: clips should land on the music; A hit needs impact; transitions feel arbitrary.

How do I install Beat Sync Editing in Claude Code?

Run `npx skills add nodetool-ai/nodetool --skill beat-sync-editing -a claude-code`. Or copy the skill folder (packages/system-skills/beat-sync-editing in nodetool-ai/nodetool) into .claude/skills/beat-sync-editing in your project. Claude Code loads it when a task matches its description.

How do I install Beat Sync Editing in Codex?

Run `npx skills add nodetool-ai/nodetool --skill beat-sync-editing -a codex`. Or copy the skill folder (packages/system-skills/beat-sync-editing in nodetool-ai/nodetool) into .agents/skills/beat-sync-editing in your project. Codex loads it when a task matches its description.

Can I use Beat Sync Editing 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 beat-sync-editing -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/beat-sync-editing, .gemini/skills/beat-sync-editing, .github/skills/beat-sync-editing and .opencode/skills/beat-sync-editing in your project.

What does Beat Sync Editing need to run?

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

Does Beat Sync Editing 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 Beat Sync Editing 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 Beat Sync Editing use?

Beat Sync Editing 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 Beat Sync Editing use?

About 2.6k 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 Beat Sync Editing?

Skills that share tags, products or a category with Beat Sync Editing: Guizang Social Cards (op7418/guizang-social-card-skill, 7.4k stars), Weekly Changelog Video (heygen-com/hyperframes, 59k stars), Anthropic Brand Styling (anthropics/skills, 180k stars) and MoneyPrinterTurbo Video Generator (harry0703/MoneyPrinterTurbo, 129k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Beat Sync Editing?

nodetool-ai (a GitHub organization) maintains it in nodetool-ai/nodetool, which has 560 GitHub stars. The repository holds 127 skills in this directory. The repository was last updated on October 9, 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.