agentsclimarketplace

Video creator

Skill DrOlu/agent-skills/skills/video-creator

Full-stack cinematic video production skill. Creates professional, story-driven 1920x1080 MP4 videos for products, services, events, SaaS, enterprises, and brands using HyperFrames HTML compositions with GSAP animation, professional TTS voiceover (Kokoro bm_george/af_heart), Whisper transcription for synced captions, Canvas 2D particle effects, SVG animations, kinetic typography, scribble underlines, burst-line highlights, multi-scene transitions (glitch, push, blur, color blocks), and complete production pipeline (design.md → script → voiceover → transcript → composition → lint → validate → render). Use when asked to create any kind of video — product demo, service promo, event teaser, brand launch, enterprise pitch, social ad, explainer, or announcement.From its SKILL.md

Install
npx -y skills add DrOlu/agent-skills --skill video-creator

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

2 things to look at

  • no licenseNo license file was found in the repository. Code published without one is not open source by default, so using it at work is a question for whoever answers licensing questions where you are.
  • 0 stars0 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

SKILL.md

19.5 KB, ~5.6k tokens by cl100k_base, as published. Nobody here has run it

Video Creator

Professional cinematic video production for products, services, events, and brands. Every output is a 1920×1080 MP4 with voiceover, synced captions, rich animation, and multiple scene transitions.

Quick Start (3 commands)

# 1. Scaffold project
npx --yes [email protected] init my-video

# 2. Generate voiceover
python3 -c "from kokoro_onnx import Kokoro; import soundfile as sf; k=Kokoro('models/kokoro-v1.0.onnx','models/voices-v1.0.bin'); s,r=k.create(open('script.txt').read(),voice='bm_george',speed=0.92,lang='en-gb'); sf.write('narration.wav',s,r)"

# 3. Transcribe for captions
npx --yes [email protected] transcribe narration.wav --model small.en

# 4. Render
npx --yes [email protected] render

Production Pipeline

Always follow this sequence — never skip steps:

1. BRIEF       → audience, platform, duration, tone
2. SCRIPT      → write narration (~2.5 wps), hook first
3. design.md   → brand colors, fonts, motion energy
4. VOICEOVER   → npx hyperframes tts OR python kokoro_onnx directly
5. TRANSCRIPT  → npx hyperframes transcribe → transcript.json
6. PLAN        → scene rhythm declaration before any HTML
7. BUILD       → layout-first → then GSAP animation
8. LINT        → npx hyperframes lint (0 errors required)
9. VALIDATE    → npx hyperframes validate --no-contrast
10. RENDER     → npx hyperframes render

Step 1 — Brief the Production

Ask (or infer from context):

  • Subject: product / service / event / brand?
  • Audience: enterprise, developer, consumer, investor?
  • Platform: social (15s), website hero (30s), product demo (60s), presentation?
  • Tone: authoritative, energetic, warm, dramatic, technical?
  • Assets: brand colors, logo, screenshots, existing copy?

Read references/brief-templates.md for audience-specific starting points.

Step 2 — Script Writing

Pacing formula: 2.5 words per second at natural speed

  • 15s → ~37 words
  • 30s → ~75 words
  • 60s → ~150 words

Structure: Hook → Problem/Story → Proof → CTA

Hook patterns (never use generic openings):

  • Bold claim: "The financial infrastructure that powers modern engineering."
  • Contrast: "Your agents are deployed. Nobody's watching them."
  • Question: "What if your entire team — human and AI — moved as one?"
  • Number shock: "Forty percent of enterprise AI projects fail at governance."

Voice register by audience:

  • Enterprise → declarative, measured, bm_george voice
  • Developer → direct, technical, am_adam voice
  • Consumer → warm, story-driven, af_heart voice
  • Startup/energy → punchy, fast, af_sky voice

Write numbers as words in the script (TTS reads literally): 10x → ten times, $2.3T → nearly two point three trillion dollars.

Read references/script-patterns.md for full script examples per video type.

Step 3 — Design System (design.md)

Always create design.md before writing any HTML. It defines the brand contract.

Required fields:

colors:
  bg: "#0A0A0A"           # primary background (dark or light)
  accent: "#E63946"       # main action color
  accent2: "#10b981"      # secondary accent
  text: "#FFFFFF"
  muted: "#999999"
  border: "#141111"
typography:
  headline: { fontFamily: "Space Grotesk", fontWeight: 800 }
  label:    { fontFamily: "Space Mono", fontWeight: 700 }
motion:
  energy: high | medium | low
  transition: glitch | blur | push | cover

Visual style picker (read references/visual-styles.md for full YAML tokens):

StyleBest forSignature
DeconstructedTech, SaaS, securityScan lines, brutal borders, Space Grotesk/Mono
MaximalistLaunches, announcementsGiant type fills frame, color slams
Velvet StandardEnterprise, luxuryWide letter-spacing, generous space
Data DriftAI, ML, fintechParticle fields, thin futuristic sans
Shadow CutDramatic reveals, securityNear-monochrome + blood accent
Folk FrequencyConsumer, communityBold color, bounce, pattern

Step 4 — Voiceover Generation

Via npx (preferred when available)

npx --yes [email protected] tts script.txt --voice bm_george --output narration.wav --speed 0.92

Via Python direct (fallback if npx fails)

# First-run: download models (~340MB total, cached)
curl -L -o models/kokoro-v1.0.onnx \
  https://github.com/thewh1teagle/kokoro-onnx/releases/download/model-files-v1.0/kokoro-v1.0.onnx
curl -L -o models/voices-v1.0.bin \
  https://github.com/thewh1teagle/kokoro-onnx/releases/download/model-files-v1.0/voices-v1.0.bin

# Generate
python3 << 'EOF'
from kokoro_onnx import Kokoro
import soundfile as sf
k = Kokoro("models/kokoro-v1.0.onnx", "models/voices-v1.0.bin")
text = open("script.txt").read().strip()
samples, rate = k.create(text, voice="bm_george", speed=0.92, lang="en-gb")
sf.write("narration.wav", samples, rate)
print(f"Generated: {len(samples)/rate:.1f}s")
EOF

Voice guide:

VoiceCharacterUse for
bm_georgeAuthoritative British maleEnterprise, B2B, keynote
bf_emmaClear British femaleTutorial, documentation, premium
am_michaelConfident American maleMarketing, promo, SaaS
am_adamNeutral American maleDeveloper tools, explainers
af_heartWarm American femaleConsumer, wellness, personal
af_skyEnergetic American femaleSocial ads, launches, lifestyle

Install dependencies (one time):

pip install kokoro-onnx soundfile

Step 5 — Transcription (Word-Level Captions)

npx --yes [email protected] transcribe narration.wav --model small.en
# → produces transcript.json with word-level timestamps

Output format:

[
  { "text": "Enterprise", "start": 0.03, "end": 0.82 },
  { "text": "teams", "start": 0.82, "end": 1.18 }
]

Use timestamps to:

  1. Anchor scene transitions to spoken sentence boundaries
  2. Drive per-word caption animations (pop in per word)
  3. Sync visual emphasis (burst lines, highlights) to key nouns

Step 6 — Scene Rhythm Planning

Declare the rhythm before writing any HTML. Name the pattern:

SLAM → breathe → CASCADE → PUNCH → CTA           (product launch)
PAIN → GLIMPSE → PROOF → CONVICTION              (problem/solution)
HOOK → STORY → PROOF → SCALE → CTA              (enterprise pitch)
TEASE → REVEAL → DETAIL → DETAIL → CTA          (feature showcase)

Scene timing template (30s enterprise):

Scene 1: Problem/Hook      0–7s    (sentence 1-2 of VO)
Scene 2: Platform intro    7–10s   (sentence 3)
Scene 3: Feature demo     10–17s   (sentence 4-5)
Scene 4: Proof/stats      17–21s   (sentence 6)
Scene 5: Scale            21–28s   (sentence 7-8)
Scene 6: CTA              28–32s   (sentence 9)

Read references/scene-timing.md for timing templates per duration.

Step 7 — Build the Composition

HTML Structure (mandatory)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8"/>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/gsap.min.js"></script>
<style>
body { margin:0; width:1920px; height:1080px; overflow:hidden; background:#0A0A0A; }
.scene { position:absolute; top:0; left:0; width:1920px; height:1080px; overflow:hidden; }
#s1 { z-index:1; background:#0A0A0A; }        /* scene 1 — visible by default */
#s2 { z-index:2; background:#0A0A0A; opacity:0; }  /* all others hidden */
</style>
</head>
<body>
<div id="root" data-composition-id="main" data-width="1920" data-height="1080"
     data-start="0" data-duration="32">

  <!-- Audio (separate from video, always) -->
  <audio id="vo" data-start="0" data-duration="31.1" data-track-index="10"
         data-volume="1" src="narration.wav"></audio>

  <!-- Transition overlays (always above all scenes) -->
  <div id="ov-r" style="position:absolute;top:0;left:0;width:1920px;height:1080px;z-index:80;background:#E63946;opacity:0;pointer-events:none"></div>

  <!-- Scenes -->
  <div id="s1" class="scene"><!-- content --></div>
  <div id="s2" class="scene"><!-- content --></div>
</div>

<script>
window.__timelines = window.__timelines || {};
var tl = gsap.timeline({ paused: true });
// ... animations ...
window.__timelines["main"] = tl;
</script>
</body>
</html>

Layout Before Animation (non-negotiable)

  1. Build the end-state of each scene in pure CSS first
  2. Content containers: display:flex; flex-direction:column; padding:120px 160px; width:100%; height:100%;
  3. Never use position:absolute; top:Npx on content — only on decoratives
  4. Add gsap.fromTo() after layout is confirmed
  5. Run npx hyperframes inspect to verify no overflow

GSAP Rules

// ALWAYS use fromTo (not from) inside scenes for deterministic seeking
tl.fromTo("#el", { opacity:0, y:40 }, { opacity:1, y:0, duration:0.5, ease:"back.out(2)" }, 1.2);

// NEVER bare gsap.to() for ambient motion — must be on tl
tl.to("#glow", { scale:1.08, yoyo:true, repeat:4, duration:2, ease:"sine.inOut" }, 0);

// NEVER repeat:-1 (breaks capture engine) — calculate finite repeats
// For a 4s beat: Math.ceil(4 / 2) = 2 cycles
tl.to("#pulse", { scale:1.1, yoyo:true, repeat:3, duration:2, ease:"sine.inOut" }, 0);

// Hard-kill scene exits
tl.set("#s1", { opacity:0, visibility:"hidden" }, exitTime);

// Always register
window.__timelines["main"] = tl;

Scene Density Requirements

Every scene MUST have:

  • Background layer: radial glow + grid/pattern + ghost text + scanline (2–5 elements)
  • Content layer: headline + subtitle + supporting element (3–5 elements)
  • Foreground accents: corner marks + divider line + label/badge (3+ elements)
  • Total: 8–10 visual elements minimum

Read references/scene-density.md for per-scene element checklists.

Transition Library

Read references/transitions.md for full code. Quick picks:

EnergyTransitionCode pattern
Chaos → ClarityBlur crossfadetl.to(old, {filter:"blur(14px)",scale:1.04,opacity:0,duration:0.5})
Level upVertical pushtl.to(old,{y:-1080,duration:0.45,ease:"power3.inOut"}, T)
Next itemPush slide lefttl.to(old,{x:-1920,duration:0.45,ease:"power3.inOut"}, T)
Hard cutColor dip to blacktl.to("#ov-k",{opacity:1,duration:0.25}) then tl.set(new,{opacity:1})
Big momentStaggered color blocksRed then green block slides across, swaps scene underneath
IndustrialGlitchRGB overlay jitter, 6 frames at ±40px, 0.35s

No exit animations before transitions except the final scene's fade to black.

Animation Techniques Library

1. Canvas 2D Particle Field (background ambience)

<canvas id="bg-canvas" width="1920" height="1080" style="position:absolute;top:0;left:0;z-index:1"></canvas>
<script>
var c=document.getElementById("bg-canvas"),ctx=c.getContext("2d");
function h(x,y){var n=x*374761393+y*668265263;n=(n^(n>>13))*1274126177;return((n^(n>>16))&0x7fffffff)/0x7fffffff}
var N=120, pts=[];
for(var i=0;i<N;i++) pts.push({bx:h(i,0)*1920,by:h(i,1)*1080,vx:(h(i,3)-0.5)*0.3,vy:(h(i,4)-0.5)*0.2,r:1+h(i,2)*2.5});
var px={t:0};
tl.to(px,{t:DURATION,duration:DURATION,ease:"none",onUpdate:function(){
  var ti=px.t;
  ctx.clearRect(0,0,1920,1080);
  // grid
  ctx.strokeStyle="rgba(230,57,70,0.04)"; ctx.lineWidth=1;
  for(var gx=0;gx<1920;gx+=160){ctx.beginPath();ctx.moveTo(gx,0);ctx.lineTo(gx,1080);ctx.stroke()}
  for(var gy=0;gy<1080;gy+=120){ctx.beginPath();ctx.moveTo(0,gy);ctx.lineTo(1920,gy);ctx.stroke()}
  // particles
  for(var i=0;i<N;i++){
    var p=pts[i],x=(p.bx+p.vx*ti*60)%1920,y=(p.by+p.vy*ti*60)%1080;
    if(x<0)x+=1920;if(y<0)y+=1080;
    ctx.fillStyle="rgba(230,57,70,"+(0.15+0.1*h(i,Math.floor(ti*6)))+")";
    ctx.fillRect(x-p.r/2,y-p.r/2,p.r,p.r);
  }
}},0);
</script>

2. SVG Scribble Underline

<span style="position:relative;display:inline-block">
  key phrase
  <svg style="position:absolute;left:0;bottom:-8px;width:100%;height:20px" viewBox="0 0 500 20" preserveAspectRatio="none">
    <path id="scr" fill="none" stroke="#E63946" stroke-width="3" stroke-linecap="round"
      stroke-dasharray="800" stroke-dashoffset="800"
      d="M0,10 Q62,0 125,10 Q187,20 250,10 Q312,0 375,10 Q437,20 500,10"/>
  </svg>
</span>
<script>
// after path element exists in DOM:
var p=document.getElementById("scr"), l=p.getTotalLength();
gsap.set(p,{strokeDasharray:l,strokeDashoffset:l});
tl.to("#scr",{strokeDashoffset:0,duration:0.7,ease:"power1.inOut"}, START);
</script>

3. Per-Word Kinetic Headline (voice-synced)

<div id="headline">
  <span class="w" id="w0">Ship</span>
  <span class="w" id="w1">faster.</span>
  <span class="w" id="w2">CyberAgent.</span>
</div>
<script>
// timings from transcript.json word start times
var times = [0.0, 0.3, 0.7];
var eases = ["back.out(2.5)", "expo.out", "back.out(3)"];
var dirs  = [{y:60,rotation:4}, {y:80,scale:0.7}, {scale:0.5,rotation:-5}];
times.forEach(function(t,i){
  tl.fromTo("#w"+i,
    Object.assign({opacity:0},dirs[i]),
    Object.assign({opacity:1,y:0,scale:1,rotation:0,duration:0.45,ease:eases[i]},{}),
    t);
});
</script>

4. Burst Lines (stat reveal)

<div style="position:relative;display:inline-block">
  <div id="stat-num">10×</div>
  <div style="position:absolute;top:50%;left:50%;width:0;height:0" id="burst">
    <span style="position:absolute;display:block;width:3px;height:52px;background:#E63946;left:-1.5px;top:-52px;transform:rotate(0deg);transform-origin:bottom center;opacity:0"></span>
    <span style="position:absolute;display:block;width:3px;height:38px;background:#E63946;left:-1.5px;top:-38px;transform:rotate(36deg);transform-origin:bottom center;opacity:0"></span>
    <!-- repeat for 8-12 lines at 30-45deg increments, vary lengths 36-60px -->
  </div>
</div>
<script>
tl.fromTo("#burst span",{scaleY:0,opacity:0},{scaleY:1,opacity:1,duration:0.35,ease:"power2.out",stagger:0.025},STAT_TIME);
</script>

5. Character-by-Character Terminal Typing

<div style="font-family:'Space Mono',monospace">
  <span style="color:#E63946">❯ </span>
  <span id="cmd"></span>
  <span id="cur" style="display:inline-block;width:10px;height:18px;background:#E63946;vertical-align:text-bottom"></span>
</div>
<script>
var CMD="your-cli-command --flag value";
var el=document.getElementById("cmd");
tl.fromTo("#cur",{opacity:1},{opacity:0,duration:0.12,yoyo:true,repeat:12,ease:"steps(1)"},START);
for(var i=0;i<CMD.length;i++){
  (function(idx){
    tl.call(function(){ el.textContent=CMD.substring(0,idx+1); },[],START+(idx/CMD.length)*0.9);
  })(i);
}
</script>

6. Circle Highlight Around Key Word

<span style="position:relative;display:inline-block">
  CyberAgent
  <span id="ring" style="position:absolute;top:50%;left:50%;width:115%;height:155%;
    transform:translate(-50%,-50%) rotate(-2deg) scale(0);
    border:4px solid #E63946;border-radius:50%;pointer-events:none"></span>
</span>
<script>
tl.fromTo("#ring",
  {scale:0,rotation:-15,transformOrigin:"50% 50%"},
  {scale:1,rotation:-2,duration:0.55,ease:"back.out(1.7)"},
  RING_TIME);
</script>

7. Synced Caption System

// Read transcript.json → group into 3-4 word chunks → render per word
var WORDS = [ /* from transcript.json */ ];
var groups = [];
for(var i=0;i<WORDS.length;){
  var g=[]; while(i<WORDS.length && g.length<4){ g.push(WORDS[i]); i++; if(g[g.length-1].t.match(/[.,!?]$/) && g.length>=2) break; }
  groups.push(g);
}
var cap=document.getElementById("captions"); // position:absolute;bottom:52px;width:1920px;text-align:center;z-index:99
groups.forEach(function(grp,gi){
  var div=document.createElement("div");
  div.style.cssText="position:absolute;bottom:0;left:50%;transform:translateX(-50%);display:flex;gap:8px;opacity:0";
  div.id="cg"+gi;
  grp.forEach(function(w,wi){
    var sp=document.createElement("span");
    sp.id="cw"+gi+"_"+wi;
    sp.textContent=w.text;
    sp.style.cssText="font-size:52px;font-weight:700;color:#fff;opacity:0;display:inline-block;text-shadow:0 2px 24px rgba(0,0,0,0.9)";
    // Brand names in accent color
    if(w.text.match(/CyberAgent|YourBrand/)) sp.style.color="#E63946";
    div.appendChild(sp);
  });
  cap.appendChild(div);
  var gs=grp[0].start, ge=grp[grp.length-1].end+0.1;
  tl.fromTo("#cg"+gi,{opacity:0},{opacity:1,duration:0.08},gs);
  tl.to("#cg"+gi,{opacity:0,duration:0.12},ge);
  tl.set("#cg"+gi,{opacity:0},ge+0.12);
  grp.forEach(function(w,wi){
    tl.fromTo("#cw"+gi+"_"+wi,{opacity:0,y:8,scale:0.88},{opacity:1,y:0,scale:1,duration:0.12,ease:"back.out(2)"},w.start);
  });
});

Scene Templates by Type

Read references/scene-templates.md for complete HTML+CSS for:

  • Problem/pain scene (split layout: copy left, terminal chaos right)
  • Platform reveal (centered cinematic, scribble underline)
  • Feature diagram (orchestration flow, approval gates, connectors)
  • Proof stats (3-column stat blocks with burst lines)
  • Org chart / scale diagram (hierarchy animation)
  • CTA slam (full accent-color, diagonal stripes, circle ring)

Output Quality Checklist

Before render:

  • npx hyperframes lint → 0 errors
  • npx hyperframes validate --no-contrast → no console errors
  • npx hyperframes inspect → no unintentional overflow
  • All gsap.fromTo() (not from()) for clip elements
  • All ambient loops on tl (not bare gsap.to())
  • All scene exits have tl.set(el, {visibility:"hidden"}, exitTime)
  • No repeat:-1 anywhere
  • No exit animations before transitions (except final scene)
  • Audio in <audio> element with data-track-index, not <video>
  • window.__timelines["main"] = tl registered

References

What ships with it: 10 files

77.9 KB alongside SKILL.md

Keep looking

Skills are one crate of 325,949. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.