agentsclimarketplace

Video creator

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

Open agent skills for the skills.sh ecosystem — browser, docs, mail, media, security, networking, orchestration, and more.

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.

What its author says it does

Copied from the file, not written here

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.

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): 10xten times, $2.3Tnearly 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

Gives 0 of the 12 instructions most product growth skills give in ~5.6k tokens

Counted across 728 of the 1,010 authors here whose files we hold, read 2026-08-07

  • Read product marketing context before asking questionsin 24 of 728, across 18 files
  • Define the ideal customer profilein 21 of 728, across 3 files
  • Document a rollback plan before deploymentin 21 of 728, across 12 files
  • Analyze the codebase to understand the productin 19 of 728, across 1 file
  • Ask clarifying questions about the value propositionin 19 of 728, across 1 file
  • Search for companies matching the criteriain 19 of 728, across 1 file
  • Look for signals of immediate needin 19 of 728, across 1 file
  • Assign a fit score from one to tenin 19 of 728, across 1 file
  • Identify the target decision-maker rolein 19 of 728, across 1 file
  • Suggest a personalized contact strategyin 19 of 728, across 1 file
  • Provide conversation starters for outreachin 19 of 728, across 1 file
  • Format results in a scannable markdown templatein 19 of 728, across 1 file

Said here and by no other author read

  • follow the ten-step production pipeline sequence
  • write the script at two point five words per second
  • write numbers as words in the script
  • create design dot md before writing html
  • declare scene rhythm before writing html
  • build scene end-state layout in css first

Grouped from the skills themselves: near-identical wordings counted once, and counted by distinct author, so one author publishing three of these counts once. Length counted with cl100k_base; the agent that loads this file may tokenize it differently.

Keep looking

Skills are one crate of 328,083. 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.