agentsclimarketplace

Social clip

Skill tinh2/skills-hub-registry/build/social-clip

Open registry of community-contributed AI coding skills (SKILL.md files) — daily-synced to skills-hub.ai. Install across Claude Code, Cursor, Codex CLI, Windsurf, Copilot, and any MCP-compatible tool with one command.

Install
npx -y skills add tinh2/skills-hub-registry --skill social-clip

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.
  • 8 stars8 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

Create short-form social media videos for TikTok, Instagram Reels, YouTube Shorts, and more. Two modes -- create from scratch with a brief, or repurpose long-form video into short clips. Includes TikTok-style animated captions (Whisper + Remotion), auto-reframe (16:9 to 9:16), hook-first structure, engagement overlays, transition library, and batch export across all platforms.

SKILL.md

22.5 KB, ~6.2k tokens by cl100k_base, as published. Nobody here has run it

Social Clip

Create short-form social media videos optimized for TikTok, Instagram Reels, YouTube Shorts, and other platforms. Two modes: create from scratch or repurpose existing long-form video.

Prerequisites

Requires the video-toolkit skill to be installed for AI asset generation (voiceover, images, music).

TOOLKIT=~/.openclaw/workspace/claude-code-video-toolkit
cd $TOOLKIT && python3 tools/verify_setup.py

Install additional dependencies:

# Whisper for transcription (choose one)
pip3 install --break-system-packages openai-whisper
# OR use Remotion's built-in Whisper.cpp:
npx remotion install-whisper-cpp

# Auto-reframe (optional -- only for repurpose mode)
pip3 install --break-system-packages opencv-python mediapipe

# Clip extraction (optional -- only for repurpose mode)
pip3 install --break-system-packages librosa numpy

Platform Presets

PlatformResolutionFPSDurationAspectSafe Zone (top/bottom/left/right)
TikTok1080x19206015-60s9:16150/270/40/40
Instagram Reel1080x19203015-90s9:16120/300/40/40
YouTube Short1080x19206015-60s9:16100/200/40/40
Instagram Story1080x1920301-15s9:16200/250/40/40
Square (Feed)1080x1080303-60s1:10/0/0/0
Landscape (16:9)1920x1080303-600s16:90/0/0/0

Each preset includes platform-specific safe zones (pixels) to avoid UI overlap with profile icons, captions area, and navigation. Keep all text and critical visual elements inside safe zones.

Codec and bitrate per platform:

PlatformCodecVideo BitrateAudio Bitrate
TikTokH.2648M128k
Instagram ReelH.2646M128k
YouTube ShortH.26410M128k
Instagram StoryH.2646M128k
Square (Feed)H.2645M128k
Landscape (16:9)H.2648M192k

Create Mode

Step 1: Create Project

cd $TOOLKIT
cp -r templates/social-clip projects/MY_CLIP
cd projects/MY_CLIP
npm install

Step 2: Write Config

Edit src/config/clip-config.ts:

import { SocialClipConfig } from './types';

export const clipConfig: SocialClipConfig = {
  title: 'Why devs are switching to terminal video',
  platforms: ['tiktok', 'instagram-reel', 'youtube-short'],
  primaryPlatform: 'tiktok',
  contentType: 'talking-head',
  durationSeconds: 45,

  hook: {
    style: 'bold-text',
    text: 'Stop using video editors.',
    soundEffect: 'audio/sfx/bass-drop.mp3',
    animation: 'zoom-in',
  },

  scenes: [
    {
      type: 'video',
      durationSeconds: 40,
      media: { src: 'video/talking-head.mp4', fit: 'cover' },
    },
    {
      type: 'text-only',
      durationSeconds: 5,
      text: { headline: 'Try it yourself', body: 'Link in bio' },
    },
  ],

  captions: {
    enabled: true,
    style: 'pop',
    highlightColor: '#FFD700',
    position: 'bottom',
    wordsPerLine: 4,
  },

  audio: {
    voiceover: 'audio/voiceover.mp3',
    backgroundMusic: 'audio/bg-lofi.mp3',
    backgroundMusicVolume: 0.12,
  },

  engagement: {
    cta: {
      text: 'Follow for dev tips',
      position: 'end-card',
      animation: 'slide-in',
    },
  },

  transitions: {
    default: 'zoom-rush',
    durationFrames: 8,
  },

  thumbnail: {
    frameSeconds: 1.5,
    textOverlay: 'Stop Using Video Editors',
    style: 'bold',
  },
};

Scene types: image, video, text-only, split.

Scene media animations: ken-burns-in, ken-burns-out, pan-left, pan-right, static, zoom-pulse.

Step 3: Generate Voiceover

cd $TOOLKIT
python3 tools/qwen3_tts.py \
  --text "Stop using video editors. Here's how I make viral content from my terminal..." \
  --speaker Ryan --tone excited \
  --output projects/MY_CLIP/public/audio/voiceover.mp3 \
  --cloud modal

Speakers: Ryan, Aiden, Vivian, Serena, Uncle_Fu, Dylan, Eric, Ono_Anna, Sohee Tones: neutral, warm, professional, excited, calm, serious, storyteller, tutorial

Step 4: Generate Background Music (optional)

cd $TOOLKIT
python3 tools/music_gen.py \
  --preset lofi \
  --duration 50 \
  --output projects/MY_CLIP/public/audio/bg-lofi.mp3 \
  --cloud modal

Presets: corporate-bg, upbeat-tech, ambient, dramatic, tension, hopeful, cta, lofi.

Step 5: Transcribe for Captions

cd $TOOLKIT
python3 tools/transcribe.py \
  --input projects/MY_CLIP/public/audio/voiceover.mp3 \
  --output projects/MY_CLIP/public/captions/transcript.json \
  --model base.en --word-timestamps

Output format (compatible with @remotion/captions):

{
  "segments": [
    {
      "text": "Stop using video editors",
      "start": 0.0,
      "end": 1.8,
      "words": [
        { "word": "Stop", "start": 0.0, "end": 0.3 },
        { "word": "using", "start": 0.35, "end": 0.6 },
        { "word": "video", "start": 0.62, "end": 0.9 },
        { "word": "editors", "start": 0.92, "end": 1.4 }
      ]
    }
  ]
}

The <CaptionOverlay> component uses createTikTokStyleCaptions() from @remotion/captions to render word-by-word animated captions synced to the transcript timestamps.

Step 6: Sync Timing

cd $TOOLKIT
ffprobe -v error -show_entries format=duration -of csv=p=0 \
  projects/MY_CLIP/public/audio/voiceover.mp3

Update durationSeconds in config to match actual audio: ceil(audio_duration + 3) (3s buffer for hook + CTA).

Asset Manifest

Each asset gets a manifest entry telling the skill what it contains, its role in the clip, and how prominently to feature it.

interface SocialAsset {
  path: string;                    // relative path to file
  type: 'photo' | 'video' | 'audio' | 'text-card' | 'product-shot' | 'screenshot';
  description: string;             // what this shows — Claude uses for placement
  tags: string[];                  // searchable: ['hook', 'highlight', 'b-roll', 'reaction']
  weight: 1 | 2 | 3 | 4 | 5;     // 1=b-roll flash, 3=standard, 5=hero/hook content
  section?: 'hook' | 'body' | 'cta' | 'outro';  // force into clip section
  platform?: string[];             // limit to: ['tiktok', 'reels'] or omit for all
  trimStart?: number;              // trim video from this second
  trimEnd?: number;                // trim video to this second
  beatSync?: boolean;              // true = cut on beat boundaries
  caption?: string;                // overlay text when this asset is shown
  duration?: number;               // suggested screen time
  notes?: string;                  // special instructions
}

interface SocialManifest {
  assets: SocialAsset[];
  defaults: {
    weight: number;
    durationByWeight: {
      1: number; // 0.5s — flash cut
      2: number; // 1s — quick show
      3: number; // 2s — standard beat
      4: number; // 3s — featured moment
      5: number; // 4s — hero content (hook or climax)
    };
  };
}

How Weights Work for Social Clips

WeightRoleScreen TimePositionPacing
5 — Hook/HeroScroll-stopper3-5sFirst 3 seconds OR climaxHold, dramatic entry
4 — FeaturedKey moment2-3sBody highlightsBeat-synced emphasis
3 — StandardGood content1.5-2sBody sequenceStandard beat cuts
2 — SupportingContext0.75-1.5sBetween key momentsFast cuts
1 — FlashTexture/energy0.3-0.75sRapid montageFlash cuts on beats

Smart Placement Rules

  • weight: 5 + section: 'hook' → ALWAYS first 3 seconds. Non-negotiable.
  • weight: 5 without section → hook if no other hook exists, else climax
  • type: 'video' with beatSync: true → cuts land on beat boundaries
  • type: 'text-card' → shown as animated overlay, not standalone frame
  • weight: 1-2 assets fill rapid-fire montage sections between key moments
  • trimStart/trimEnd → only use this portion of the video
  • platform: ['tiktok'] → only included in TikTok renders (e.g., vertical-optimized clips)
  • If total asset duration exceeds clip length, lower-weight assets get dropped first

Example

const manifest: SocialManifest = {
  assets: [
    {
      path: 'clips/reaction-wow.mp4',
      type: 'video',
      description: 'Friend reacting with genuine surprise and laughter',
      tags: ['hook', 'reaction'],
      weight: 5,
      section: 'hook',
      trimStart: 2.1,
      trimEnd: 4.8,
      notes: 'This is THE scroll-stopper. Use in first 3 seconds.',
    },
    {
      path: 'clips/cooking-montage.mp4',
      type: 'video',
      description: 'Quick cuts of cooking process — chopping, sauteing, plating',
      tags: ['process', 'montage'],
      weight: 3,
      section: 'body',
      beatSync: true,
    },
    {
      path: 'photos/finished-dish.jpg',
      type: 'photo',
      description: 'Beautifully plated final dish with garnish',
      tags: ['result', 'hero'],
      weight: 4,
      section: 'body',
      caption: 'The result speaks for itself',
    },
    {
      path: 'photos/kitchen-candid.jpg',
      type: 'photo',
      description: 'Candid shot laughing in the kitchen',
      tags: ['b-roll', 'personality'],
      weight: 1,
      beatSync: true,
    },
  ],
  defaults: {
    weight: 3,
    durationByWeight: { 1: 0.5, 2: 1, 3: 2, 4: 3, 5: 4 },
  },
};

Step 7: Preview and Render

cd $TOOLKIT/projects/MY_CLIP

# Preview hook frame
npx remotion still src/index.ts SocialClip-tiktok --frame=0 --output=/tmp/hook.png

# Preview mid-clip
npx remotion still src/index.ts SocialClip-tiktok --frame=900 --output=/tmp/mid.png

# Render primary platform
npm run render

# Batch render all platforms
bash ../../tools/batch_render.sh \
  --project . \
  --platforms tiktok,instagram-reel,youtube-short \
  --output out/

Output: out/tiktok/clip.mp4, out/instagram-reel/clip.mp4, out/youtube-short/clip.mp4 + thumbnails.

Repurpose Mode

Take an existing long-form video and extract the best segments as short-form social clips.

Step 1: Analyze Long-Form Video

cd $TOOLKIT
python3 tools/extract_clips.py \
  --input path/to/long-form-video.mp4 \
  --max-clips 5 \
  --target-duration 30-60 \
  --output projects/MY_CLIP/clips-manifest.json

The extraction tool:

  1. Transcribes with Whisper to get content segments
  2. Scores segments by audio energy (loud = engaging), speech density (words/second), and silence gaps (natural boundaries)
  3. Identifies top N segments by engagement score
  4. Outputs manifest with timestamps and suggested hook text

Step 2: Auto-Reframe (if source is 16:9)

cd $TOOLKIT
python3 tools/auto_reframe.py \
  --input path/to/long-form-video.mp4 \
  --output projects/MY_CLIP/public/focus-regions.json \
  --mode face-track

Reframe modes:

  • center -- static center crop (no analysis needed)
  • face-track -- OpenCV Haar cascades or MediaPipe face detection, tracks largest face
  • motion-track -- optical flow to find area of highest motion
  • rule-of-thirds -- positions crop at left or right third based on content density

The <AutoReframe> component reads focus-regions.json and applies an animated crop window that smoothly pans between focus regions using interpolate().

Step 3: Extract and Configure

Select clips from the manifest and create config with autoReframe.enabled: true:

autoReframe: {
  enabled: true,
  sourceAspectRatio: '16:9',
  focusMode: 'face-track',
},

Or provide manual focus region overrides:

autoReframe: {
  enabled: true,
  focusMode: 'manual',
  manualRegions: [
    { startSeconds: 0, endSeconds: 10, x: 660, y: 0, width: 608, height: 1080 },
    { startSeconds: 10, endSeconds: 25, x: 400, y: 0, width: 608, height: 1080 },
  ],
},

Step 4: Add Captions and Render

Same as Create Mode steps 5-7. Transcribe the extracted audio, enable captions, and batch render.

Caption Styles

StyleEffectBest for
popWords scale up with spring() bounce when spokenHigh energy, comedy
highlightCurrent word changes to highlightColor, others stay whiteEducational, tutorial
karaokeWords fill with color left-to-right (gradient mask)Music, storytelling
subtitleTraditional subtitle bar at bottom, no per-word animationProfessional, clean
bounceWords drop in from above with gravity-like springPlayful, casual

Caption config defaults:

  • fontSize: 64 for 9:16 platforms, 48 for 1:1
  • fontFamily: Inter
  • primaryColor: #FFFFFF
  • highlightColor: #FFD700
  • backgroundColor: rgba(0,0,0,0.6)
  • position: bottom
  • wordsPerLine: 4

Transition Library

TransitionEffectBest for
swipeDirectional swipe (up/down/left/right)Scene changes
zoom-rushRapid zoom in then out to next sceneHigh energy cuts
glitchDigital glitch distortionTech content, edgy
flashWhite flash between scenesPhoto reveals
whip-panMotion blur simulating camera whip (use @remotion/motion-blur <CameraMotionBlur>)Fast pacing
fadeStandard opacity crossfadeCalm transitions
cutHard cut, no transitionBeat-synced montages

Import custom transitions from lib/transitions/presentations/ directly, never from barrel files. For additional variety, use GL Transitions (remotion-gl-transitions) for trend-matching styles.

Content Types

TypeDescriptionWhen to use
talking-headSingle speaker with captions, optional PiPAdvice, opinions, tutorials
montageMulti-clip rapid cuts with even, custom, or beat-synced timingShowcases, highlights, travel
before-afterSide-by-side or sequential comparison with split/wipe layoutTransformations, results
listicleNumbered items with animated reveals and progress indicatorTips, rankings, recommendations
quote-cardStyled quote with attribution and decorative quote marksMotivation, testimonials
product-showcaseProduct shots with feature callouts and optional rotationMarketing, launches
tutorial-snippetQuick how-to with step indicators and progress barRecipes, DIY, code tips

Hook Structure (First 3 Seconds)

Every clip must hook within 3 seconds. The hook config controls the opening:

  • bold-text -- Large text slams in with spring() scale + shake. Pair with bass-drop SFX.
  • question -- Typewriter question engages curiosity. "Did you know...?"
  • statistic -- Animated counter rolls to a surprising number with interpolate(). "10x faster"
  • motion-burst -- Flash + zoom + reveal. Maximum visual energy.
  • sound-effect -- Audio sting with synced visual pulse. Whoosh, ding, dramatic.

Hook animations: zoom-in, shake, flash, scale-bounce.

Engagement Overlays

CTA (Call to Action)

engagement: {
  cta: {
    text: 'Follow for more',    // or "Link in bio", "Subscribe", etc.
    position: 'end-card',       // 'bottom' for persistent, 'end-card' for last 3-5s
    animation: 'pulse',         // 'pulse', 'slide-in', 'fade'
  },
},

Comment Prompt

engagement: {
  commentPrompt: {
    text: 'What do you think? Comment below',
    showAt: 20,                 // Seconds into clip
  },
},

Countdown

engagement: {
  countdown: {
    from: 5,
    showAt: 10,
    style: 'bold',              // 'minimal', 'bold', 'neon'
  },
},

Poll

engagement: {
  poll: {
    question: 'Which do you prefer?',
    options: ['Terminal', 'GUI Editor'],
    showAt: 15,
    durationSeconds: 5,
  },
},

Text Overlays

textOverlays: [
  {
    text: '#DevTips',
    startSeconds: 0,
    durationSeconds: 10,
    position: 'top',
    style: 'hashtag',           // 'title', 'subtitle', 'callout', 'label', 'hashtag'
    animation: 'fade-in',       // 'fade-in', 'slide-up', 'scale-in', 'typewriter', 'bounce-in'
  },
],

Platform-appropriate font sizes:

  • Title: 72px (9:16), 56px (1:1), 48px (16:9)
  • Subtitle: 48px (9:16), 36px (1:1), 32px (16:9)
  • Callout: 56px with background pill
  • Label: 32px uppercase tracking
  • Hashtag: 36px with # prefix, accent color

Style Configuration

style: {
  colorScheme: 'dark',          // 'dark', 'light', 'vibrant', 'pastel', 'neon'
  accentColor: '#FFD700',
  fontFamily: 'Inter',
  borderRadius: 12,             // For image/video element corners
},

Batch Multi-Platform Export

Render one piece of content across all target platforms in a single command:

bash tools/batch_render.sh \
  --project projects/MY_CLIP \
  --platforms tiktok,instagram-reel,youtube-short,square \
  --output out/

The batch render script:

  1. Reads clip-config.ts for the platform list
  2. For each platform, runs npx remotion render with platform-specific composition ID
  3. Post-processes with FFmpeg for codec/bitrate optimization per platform specs
  4. Generates thumbnail stills for each platform
  5. Outputs all files to out/{platform}/clip.mp4 + out/{platform}/thumbnail.png

Composition Patterns

Audio Layering

// Voiceover with 1s delay for hook
<Sequence from={fps * 3}>
  <Audio src={staticFile('audio/voiceover.mp3')} volume={1} />
</Sequence>

// Background music (full duration, low volume)
<Audio src={staticFile('audio/bg-lofi.mp3')} volume={0.12} />

// Sound effect at specific time
<Sequence from={0}>
  <Audio src={staticFile('audio/sfx/bass-drop.mp3')} volume={0.8} />
</Sequence>

Scene Transitions

import { TransitionSeries, linearTiming } from '@remotion/transitions';
import { fade } from '@remotion/transitions/fade';
// Custom transitions from lib/transitions/presentations/
import { swipe } from './lib/transitions/presentations/swipe';
import { zoomRush } from './lib/transitions/presentations/zoom-rush';

ALWAYS use <OffthreadVideo>, NEVER <video>.

Cost Estimates

StepCostNotes
Voiceover (Qwen3-TTS)~$0.01Per clip, via Modal
Background music (MusicGen)~$0.02-0.05Duration-dependent
Image generation (FLUX.2)~$0.01/imageIf AI backgrounds needed
Whisper transcriptionFreeRuns locally via whisper.cpp — preferred over cloud APIs
Remotion renderFreeLocal render, no license for personal use
Auto-reframe analysisFreeLocal OpenCV processing

Total per clip: ~$0.05-0.10 for AI-generated assets. Free if using only user-provided media.

Batch export: Rendering 4 platform variants costs zero extra -- same Remotion render with different dimensions.

Remotion Ecosystem Packages

Install the official Remotion skills for best results: npx skills i remotion-dev/skills/skills/remotion. This provides 35 production rules covering animations, audio, transitions, text, 3D, and more.

Core Packages

PackageWhat it does
@remotion/transitionsfade, slide, wipe, flip, clockWipe, iris
@remotion/captionsTikTok-style word-by-word captions
@remotion/media-utilsvisualizeAudio(), getAudioData(), getAudioDurationInSeconds()
@remotion/layout-utilsmeasureText(), fitText(), fillTextBox()
@remotion/motion-blur<Trail> and <CameraMotionBlur> — use for whip-pan transitions
@remotion/noiseProcedural noise for film grain
@remotion/google-fontsGoogle Fonts loading
@remotion/shapesGeometric shape components
@remotion/pathsSVG path animation
remotion-animatedDeclarative <Animated> with Move(), Scale(), Fade()

Community Packages

PackageWhat it does
Remotion Bits (npx remotion-bits find/fetch)ParticleSystem (confetti, rain, starfields) for engagement effects, AnimatedText, StaggeredMotion
GL Transitions (remotion-gl-transitions)Hundreds of GLSL shader transitions from gl-transitions.com — use for trend-matching transition styles
remotion-confettiCanvas-based confetti with physics

AI Services

ServiceWhat it doesCost
fal.aiSingle API for video gen (Veo 3.1, Kling 3, Wan 2.2). One key for AI clip generation$0.05-0.50/sec
whisper.cppLOCAL speech-to-text, zero cost. Use for transcription instead of cloud APIsFree
Suno (via KIE)AI music with vocals. Better than MusicGen for songs with lyrics$0.03/song

Producer Intelligence

Audio ducking: Auto-lower music volume when voiceover speaks. Use Remotion's interpolate() on volume based on voiceover audio presence. Essential for voiceover clips.

Loudness normalization: Target LUFS per platform: YouTube -14, TikTok -14, Instagram -14, Podcast -16. Post-process:

ffmpeg -i input.mp4 -af loudnorm=I=-14:TP=-1.5:LRA=11 output.mp4

Film grain via @remotion/noise: Use noise2D() or noise3D() for procedural film grain instead of CSS overlay.

Light leaks via @remotion/light-leaks: WebGL overlays for transitions between scenes.

Tips

  1. Hook is everything -- spend 80% of creative effort on the first 3 seconds. If the hook fails, nothing else matters.
  2. Captions are mandatory -- 85% of social video is watched with sound off. Always enable captions.
  3. Keep text in safe zones -- each platform overlays UI on the video. Use the preset safe zones to avoid text behind profile icons or navigation.
  4. Match platform pacing -- TikTok favors cuts every 2-3 seconds. Instagram tolerates slower pacing. YouTube Shorts split the difference.
  5. Use zoom-rush sparingly -- one zoom-rush per clip is impactful, five is nauseating.
  6. End with CTA -- the last 3-5 seconds should always include a call to action.
  7. Batch render always -- if you are making a TikTok, render Reel and Short variants too. Nearly free and doubles your reach.
  8. Duration rule -- for scenes with voiceover, set durationSeconds to ceil(audio_duration + 3) (3s buffer for hook + CTA).
  9. Test the hook first -- use npx remotion still --frame=0 to preview the opening frame before full render.
  10. Sound effects sell it -- a bass-drop or whoosh on the hook frame increases perceived production quality dramatically.

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.