motion-promo-reels

agent
Security Audit
Fail
Health Warn
  • License — License: MIT
  • Description — Repository has a description
  • Active repo — Last push 0 days ago
  • Low visibility — Only 6 GitHub stars
Code Fail
  • rm -rf — Recursive force deletion command in .github/workflows/package-skill.yml
  • rm -rf — Recursive force deletion command in install.sh
  • child_process — Shell command execution capability in templates/catalogo-9x16/comprobar.js
  • spawnSync — Synchronous process spawning in templates/catalogo-9x16/comprobar.js
  • process.env — Environment variable access in templates/catalogo-9x16/comprobar.js
  • fs module — File system access in templates/catalogo-9x16/comprobar.js
  • network request — Outbound network request in templates/catalogo-9x16/comprobar.js
  • fs module — File system access in templates/catalogo-9x16/extraer.js
  • network request — Outbound network request in templates/catalogo-9x16/extraer.js
Permissions Pass
  • Permissions — No dangerous permissions requested

No AI report is available for this listing yet.

SUMMARY

Claude skill: promotional videos with motion graphics and audio, 100% generated by code (canvas + ffmpeg). For a person, a product or a whole store catalog. Install: npx skills add david-d2c2/motion-promo-reels

README.md

motion-promo-reels

English · Español

motion-promo-reels: promotional videos with motion graphics, generated entirely by code

A Claude skill that generates promotional videos with motion graphics and audio, 100% by code: 2D canvas → frames → ffmpeg, plus music and sound effects synthesized with numpy. No video templates, no After Effects, no third-party music.

It covers three cases:

  • a person or personal brand: a 27 s video in 16:9, now with A/B/C versions on demand;
  • a handful of products: 15.5 s reels in 9:16, one hand-written gag per product and, since v2, a different construction per reel;
  • since v3, music styles, sound-effect packs and an optional voice-over in all three;
  • a whole catalog (WooCommerce): one reel per product, a gag per category, data read straight from the store — and, since v2, a different construction for every reel.

Battle-tested in production on real projects: a personal brand, a small online shop and a catalog of 100+ products. All sample data in this repository is fictional.

What makes it different

Three hooks generated by the templates: invisible, diagonal and a sequence of widths

  • Nothing made up. Prices, colors, sizes and features come from the website or the store's API. Anything that can't be confirmed gets flagged as pending.
  • The gag is what the video does, not a joke on top. A transparent product → "There's a case here. Can't see it?" A diagonal-striped one → the reel tilts 45°. A 50-metre roll → "This reel lasts 15 s. You won't have time to use it up."
  • A self-referential element runs through the whole video: a HUD with frame counter, a stitch line counting stitches, or a tape measure that "measures" the reel.
  • Built-in quality control:
    • frame-by-frame review;
    • Instagram safe zones;
    • −14 LUFS loudness;
    • an AI label (EU AI Act, art. 50) when photos show AI-generated people;
    • a calm tone for sensitive categories.

v3: they don't sound alike either, and they can talk

v2 varied the picture; the music was still one loop with a different tempo or timbre. v3 replaces it:

  • Ten music styles with their own instruments, drums, groove and harmony — not presets of the same loop. A seed composes each video's melody and picks its drum pattern, fills, harmonic rhythm and arpeggio, so two videos in the same style don't sound the same either.
  • The arrangement follows the scenes: a sparse intro under the gag, the full band with the product, a lighter bed while facts are read, a drum fill before each cut and a final chord.
  • Five sound-effect packs (digital, organico, cinematico, minimo, juguete), with chimes tuned to the music's key.
  • Optional voice-over with a free local voice (Piper, Spanish or English, installed only if you say yes: node voz.js --instalar piper es), ElevenLabs, Voicebox or any TTS command. It only says what is on screen, caches every sentence (re-renders are free), stops at a character budget, ducks the music about 10 dB and writes an .srt.
  • Choose the look in plain words (v3.1): node variar.js --opciones shows the menu; node variar.js --preferencias musica=tranquila colores=claro steers every video without fixing it. If a request says nothing about tone, the skill asks one question.
  • Built to be run by any model: node comprobar.js checks the environment and the data and says where each problem is and how to fix it; SKILL.md opens with a step-by-step quick path; install.sh --agents installs into ~/.agents/skills for agents such as pi.

Spectrograms of the same 15.5-second reel in the ten music styles: each one has a different texture, drum pattern and density

Nothing new is mandatory: no new dependencies, and without locucion.json there is no voice.

v2: fifty reels that don't look like one

In v1 every reel of a template shared the same timeline, layout, transition, colors, music and — within a catalog category — the same hook text. Fifty products gave you fifty copies of one film with different numbers.

v2 gives every video a plan, chosen by a seeded planner that compares it with the videos published right before it. All three templates share one variation core (variacion.js), so they behave the same way. For catalogs:

Axis Options
Scene order 6 orders of range, facts and price after the product reveal
Product scene card · blurred backdrop + full photo · arch frame
Range scene pills · ruler + color stripes · tile grid
Facts scene checklist · numbered 01–03 · stacked cards
Price scene big · round stamp · hanging tag
Transition flash · push · iris · diagonal · blinds · zoom (crossfade for sensitive categories)
Color theme light · dark · accent — derived from the brand palette, only when WCAG contrast passes
Hook text entrance (rise · mask · letters) and phrase variants that rotate within each category
Music progression · key · tempo · timbre · arpeggio pattern (audio reads the same plan, so sound and picture stay in sync)

The brand signature stays fixed on purpose: the self-referential tape measure and the closing card.

Contact sheet of six consecutive catalog reels from the same engine, each with a different construction

A few products get the same axes with layouts of their own (a Polaroid that drops in, a color fan deck, facts on sewn labels, a hanging price tag), while keeping each product's hand-written gag.

A personal video is a story, so its order never changes (the namesake gag depends on it). Instead you get versions — for different channels or to post again — that change the palette, the headline entrance, the stats, method and stack layouts, the background and the music:

Three versions of the same personal-brand video: neon, ink on paper and lime palettes with different layouts

# catalog and products
node variar.js                       # plan new products, keep existing plans → VARIACION.md (batch report)
node variar.js --temporada 2027-01   # a fresh look for every reel, to publish again
node render.js all --hoja            # contact sheets: one row per reel, one frame per scene

# person
node variar.js 3                     # versions A, B and C, as different as possible → versiones.json
node render.js video promo_B.mp4 --version B
node render.js hoja                  # contact sheet of all versions

Plans are reproducible and hand-editable ("manual": true protects a product's plan). Without a plan, every template renders exactly like v1, minus the v1 bugs fixed along the way. See CHANGELOG.md.

Structure

motion-promo-reels/
├── SKILL.md                    instructions for Claude (the full method)
├── install.sh / install.ps1    one-line installers (curl / PowerShell)
├── assets/                     images for this README
└── templates/
    ├── README.md               what to change first in each template
    ├── persona-16x9/           personal brand (CFG block at the top of anim.html + versiones.json)
    ├── producto-9x16/          a few products (productos.json + variar.js)
    └── catalogo-9x16/          WooCommerce catalog (config.json + extraer.js + variar.js)

The skill is language-agnostic: Claude replies in your language and writes the on-screen copy in your audience's language. The sample data and code comments are in Spanish. All on-screen text can be changed without touching code:

  • Product and brand copy lives in CFG (persona), productos.json (product) or config.json (catalog).
  • Interface strings ("from", "colors", "NOT HIM", "measuring this reel…"…) live in a textos block. Spanish defaults are built in; override only the keys you need. See templates/README.md.

Installation

Claude Code: pick whichever method you prefer. All of them leave the skill in ~/.claude/skills/motion-promo-reels unless you choose another folder.

# npx (Node 18+), using the open skills CLI
npx skills add david-d2c2/motion-promo-reels -g -a claude-code   # all your projects
npx skills add david-d2c2/motion-promo-reels -a claude-code      # current project only

# curl (macOS / Linux)
curl -fsSL https://raw.githubusercontent.com/david-d2c2/motion-promo-reels/main/install.sh | bash
curl -fsSL https://raw.githubusercontent.com/david-d2c2/motion-promo-reels/main/install.sh | bash -s -- --dir /path/to/skills
curl -fsSL https://raw.githubusercontent.com/david-d2c2/motion-promo-reels/main/install.sh | bash -s -- --project
# Windows (PowerShell)
irm https://raw.githubusercontent.com/david-d2c2/motion-promo-reels/main/install.ps1 | iex
& ([scriptblock]::Create((irm https://raw.githubusercontent.com/david-d2c2/motion-promo-reels/main/install.ps1))) -Dir "D:\skills"

The install.sh / install.ps1 options:

Option Effect
--dir PATH / -Dir PATH Installs into PATH/motion-promo-reels
--project / -Project Installs into ./.claude/skills/ of the current folder
--agents / -Agents Installs into ~/.agents/skills/, for agents that read that folder (such as pi)
--force / -Force Replaces an existing installation (updating)
--version TAG / -Version TAG Installs a specific release instead of the latest

Both scripts download the same zip as the release below. Read them before piping them into a shell: they are short.

Or with git:

git clone https://github.com/david-d2c2/motion-promo-reels ~/.claude/skills/motion-promo-reels

claude.ai: download motion-promo-reels.zip from the latest release and upload it under Customize → Skills, then turn it on.

Don't use GitHub's green Code → Download ZIP button for this: it names the folder motion-promo-reels-main, and claude.ai requires the folder to match the skill name (motion-promo-reels). The release zip is built with the right layout.

Then just ask: "make a promo reel for this product", "research [name] and create a promotional video with motion graphics", "generate one reel for every product in my store".

Rendering requirements

Rendering runs real tools, so it works best where they're installed: Claude Code, Cowork or any coding agent on your own machine. In a cloud sandbox, the agent installs what's missing when it can.

  • Node 18+ and npm install (installs puppeteer-core) inside the template you use
  • Chrome or Edge (or CHROME_PATH)
  • ffmpeg on your PATH
  • Python 3 with numpy and scipy (plus Pillow for the batch contact sheets)
cd templates/producto-9x16
npm install
node comprobar.js                                        # environment + data check, with fix-it messages
node render.js all --stills 1.6,3.4,7.4,10.4,12.4,14.4   # review frames
node render.js all                                       # final videos in out/

Licenses

  • Code: MIT.
  • Bundled fonts (Inter, Gelasio, Playfair Display, Outfit): SIL Open Font License 1.1. Each fonts/ folder includes its license text.
  • The videos you generate are yours. Music and sound effects are synthesized in sonido.py: no samples or third-party tracks. A voice-over is subject to the terms of the provider you choose (ElevenLabs, Voicebox's engines…), and a cloned voice needs its owner's consent.

Reviews (0)

No results found