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.
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.
$ npx skills add nodetool-ai/nodetool --skill beat-sync-editing -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install nodetool-ai/nodetool beat-sync-editing --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/beat-sync-editing .claude/skills/beat-sync-editing && 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 "beat-sync-editing" agent skill from https://github.com/nodetool-ai/nodetool/tree/main/packages/system-skills/beat-sync-editing into .claude/skills/beat-sync-editing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "beat-sync-editing", 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/beat-sync-editingType 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 beat-sync-editing -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install nodetool-ai/nodetool beat-sync-editing --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/beat-sync-editing .agents/skills/beat-sync-editing && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "beat-sync-editing" agent skill from https://github.com/nodetool-ai/nodetool/tree/main/packages/system-skills/beat-sync-editing into .agents/skills/beat-sync-editing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "beat-sync-editing", 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 beat-sync-editing -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install nodetool-ai/nodetool beat-sync-editing --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/beat-sync-editing .cursor/skills/beat-sync-editing && 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 "beat-sync-editing" agent skill from https://github.com/nodetool-ai/nodetool/tree/main/packages/system-skills/beat-sync-editing into .cursor/skills/beat-sync-editing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "beat-sync-editing", 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/beat-sync-editing--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 beat-sync-editing -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install nodetool-ai/nodetool beat-sync-editing --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/beat-sync-editing .gemini/skills/beat-sync-editing && 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 "beat-sync-editing" agent skill from https://github.com/nodetool-ai/nodetool/tree/main/packages/system-skills/beat-sync-editing into .gemini/skills/beat-sync-editing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "beat-sync-editing", 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 beat-sync-editingInstalls 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 beat-sync-editing -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/beat-sync-editing .github/skills/beat-sync-editing && 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 "beat-sync-editing" agent skill from https://github.com/nodetool-ai/nodetool/tree/main/packages/system-skills/beat-sync-editing into .github/skills/beat-sync-editing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "beat-sync-editing", 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 beat-sync-editing -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 beat-sync-editing --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/beat-sync-editing .opencode/skills/beat-sync-editing && 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 "beat-sync-editing" agent skill from https://github.com/nodetool-ai/nodetool/tree/main/packages/system-skills/beat-sync-editing into .opencode/skills/beat-sync-editing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "beat-sync-editing", 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.
beat-sync-editingCut 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. 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.
Read from SKILL.md and the folder at commit 58765d3. 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).
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.
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.
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 58765d3, republished under its AGPL-3.0 licence (© nodetool-ai). 1,522 words, ~2,630 tokens.
.claude/skills/beat-sync-editing/SKILL.md (or your agent's skills folder).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.
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.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.With a reliable tempo:
ms_per_beat = 60000 / bpm
frames_per_beat = (60 / bpm) × fps # fps comes from get_timelineAt 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:
{"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.
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.
| Personality | Cut every | Transition family | Retime |
|---|---|---|---|
| Playful | 4 beats, syncopated accents | Hard cut, occasional push | Light ramps |
| Premium | 8–16 beats, long holds | Hard cut, occasional crossfade | Slow, smooth |
| Corporate | 8 beats, steady | Hard cut only | None |
| Energetic | 1–2 beats at the peak | Hard cut, zoom, push | Aggressive, on the beat |
Put the single biggest visual on the drop. One piece, one peak.
Uniform pacing reads as flat regardless of content.
| Phase | Cut every | Shot length | Note |
|---|---|---|---|
| Establish | 8–16 beats | Longest | Set the place, let it breathe |
| Develop | 8 → 4 beats | Shortening | Accelerate to build |
| Climax | 1–2 beats | Shortest | The drop, the biggest visual, the ramp |
| Resolve | One long hold | Longest | The end card breathes after the peak |
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.
| Cut | How, on the timeline | Reach for it when |
|---|---|---|
| Hard cut | Adjacent clips, no overlap, no set_transition | Nine cuts in ten |
| Match cut | Hard cut where both frames share a shape, position or motion vector | Two shots rhyme; the strongest move in motion design |
| Crossfade | set_transition crossfade on the incoming clip, clips overlapped by at least its durationMs | Two shots of the same scene |
| Dip | dipToColor with your own color | A chapter break |
| Wipe / push / slide | Those types with a direction naming the edge the incoming clip arrives from | A graphic feel, or lateral energy |
| Zoom | zoom | Pushing into the next beat |
| J-cut | The next clip's audio clip starts 4–12 frames before its picture, on its own audio track | Dialogue, reveals: it pulls the viewer forward |
| L-cut | The current clip's audio runs 12–24 frames under the next picture | Scene changes, ambience |
| Whip | A short offsetX move plus a blur effect either side of a hard cut | Hype, a scene jump |
Two things the engine does whether you asked or not:
startMs and durationMs first.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.
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:
{"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.
Write the cut down before editing, in the units the ops take:
bpm, fps, the first onset in ms, the drop in ms, ms per beat.t / sourceMs keyframes.set_markers_from_beats.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.
| Symptom | Cause | Fix |
|---|---|---|
| Frantic | A cut on every beat | Cut on 2, 4 or 8 beat phrases |
| Almost on beat | Grid anchored at 0, ignoring the first onset | Anchor to the onset, in ms |
| Drift over a long edit | Rounding each step | Round each cumulative beat |
| Jarring cut | Placed at rest, between motions | Cut mid-motion, match direction |
| Soft where it should be hard | Overlapping clips on one track | Fix startMs and durationMs |
| Transition fades from black | Nothing beneath the incoming head | Overlap the clips by the transition's durationMs |
| Flat | Uniform pacing | Establish, develop, climax, resolve |
| Nothing lands | No single peak | One 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
Just SKILL.md in packages/system-skills/beat-sync-editing of nodetool-ai/nodetool.
Open the folder on GitHubat commit 58765d3
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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Beat Sync Editing this skillnodetool-ai/nodetool | 560 | — | ~2.6k | Automated safety check: Pass | AGPL-3.0 | |
| Guizang Social Cardsop7418/guizang-social-card-skill | 7.4k | 1 repos | ~7.8k | Automated safety check: Pass | AGPL-3.0 | |
| Weekly Changelog Videoheygen-com/hyperframes | 59k | — | ~3.3k | Automated safety check: Pass | Apache-2.0 | |
| Anthropic Brand Stylinganthropics/skills | 180k | 30 repos | ~559 | Automated safety check: Pass | Apache-2.0 | |
| MoneyPrinterTurbo Video Generatorharry0703/MoneyPrinterTurbo | 129k | — | ~2.1k | Automated safety check: Warn | MIT | |
| Brag Slim Launch Video Makerlatent-spaces/brag | 14k | 1 repos | ~1.9k | Automated safety check: Pass | MIT |
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.
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.
anthropics/skills
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.
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.
latent-spaces/brag
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.
heygen-com/hyperframes
Finds, generates and edits media for HyperFrames video projects: music, sound effects, images, icons, logos, voiceovers, captions and color grades.
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.
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…
Categories
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.
Beat Sync Editing fits situations like: clips should land on the music; A hit needs impact; transitions feel arbitrary.
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.
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.
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.
SKILL.md names no scripts, command-line tools or credentials: Beat Sync Editing 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.
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.
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.
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.
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.