Ffmpeg Skill
kajisho5/ffmpeg-skill
Edit video and audio with local FFmpeg from natural-language requests: cut, trim, join, resize/reframe (9:16, 1:1), speed change, captions and subtitles (SRT/ASS, animated, karaoke), logos and text…
Command reference for cutting clips from online video: yt-dlp downloads, whisper transcription, SRT subtitle files and ffmpeg processing, with Windows, macOS and Linux differences.
The automated check flagged lines worth reading first. See the safety section below.
$ npx skills add RightNow-AI/openfang --skill clip-hand-skill -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install RightNow-AI/openfang clip-hand-skill --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/RightNow-AI/openfang.git skills-src && mkdir -p .claude/skills && cp -r skills-src/crates/openfang-hands/bundled/clip .claude/skills/clip-hand-skill && 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 "clip-hand-skill" agent skill from https://github.com/RightNow-AI/openfang/tree/main/crates/openfang-hands/bundled/clip into .claude/skills/clip-hand-skill/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "clip-hand-skill", 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/RightNow-AI/openfang/tree/main/crates/openfang-hands/bundled/clipType 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 RightNow-AI/openfang --skill clip-hand-skill -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install RightNow-AI/openfang clip-hand-skill --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/RightNow-AI/openfang.git skills-src && mkdir -p .agents/skills && cp -r skills-src/crates/openfang-hands/bundled/clip .agents/skills/clip-hand-skill && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "clip-hand-skill" agent skill from https://github.com/RightNow-AI/openfang/tree/main/crates/openfang-hands/bundled/clip into .agents/skills/clip-hand-skill/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "clip-hand-skill", 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 RightNow-AI/openfang --skill clip-hand-skill -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install RightNow-AI/openfang clip-hand-skill --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/RightNow-AI/openfang.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/crates/openfang-hands/bundled/clip .cursor/skills/clip-hand-skill && 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 "clip-hand-skill" agent skill from https://github.com/RightNow-AI/openfang/tree/main/crates/openfang-hands/bundled/clip into .cursor/skills/clip-hand-skill/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "clip-hand-skill", 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/RightNow-AI/openfang.git --path crates/openfang-hands/bundled/clip--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 RightNow-AI/openfang --skill clip-hand-skill -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install RightNow-AI/openfang clip-hand-skill --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/RightNow-AI/openfang.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/crates/openfang-hands/bundled/clip .gemini/skills/clip-hand-skill && 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 "clip-hand-skill" agent skill from https://github.com/RightNow-AI/openfang/tree/main/crates/openfang-hands/bundled/clip into .gemini/skills/clip-hand-skill/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "clip-hand-skill", 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 RightNow-AI/openfang clip-hand-skillInstalls 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 RightNow-AI/openfang --skill clip-hand-skill -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/RightNow-AI/openfang.git skills-src && mkdir -p .github/skills && cp -r skills-src/crates/openfang-hands/bundled/clip .github/skills/clip-hand-skill && 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 "clip-hand-skill" agent skill from https://github.com/RightNow-AI/openfang/tree/main/crates/openfang-hands/bundled/clip into .github/skills/clip-hand-skill/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "clip-hand-skill", 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 RightNow-AI/openfang --skill clip-hand-skill -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install RightNow-AI/openfang clip-hand-skill --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/RightNow-AI/openfang.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/crates/openfang-hands/bundled/clip .opencode/skills/clip-hand-skill && 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 "clip-hand-skill" agent skill from https://github.com/RightNow-AI/openfang/tree/main/crates/openfang-hands/bundled/clip into .opencode/skills/clip-hand-skill/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "clip-hand-skill", 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.
clip-hand-skillCommand reference for cutting clips from online video: yt-dlp downloads, whisper transcription, SRT subtitle files and ffmpeg processing, with Windows, macOS and Linux differences.
This skill is a command reference rather than a step-by-step workflow. It notes that ffmpeg, ffprobe, yt-dlp and whisper take the same flags on Windows, macOS and Linux and only the shell syntax differs, with a table covering stderr redirection, output filtering, deleting files and ffmpeg subtitle paths, which need forward slashes and an escaped colon for absolute Windows paths. It prefers creating SRT and text files with a file-write tool over shell echo or heredocs.
The yt-dlp section covers downloading at up to 1080p with merged audio, dumping metadata as JSON, fetching YouTube auto-generated subtitles with word-level timing, and flags such as --restrict-filenames, --no-playlist, --extract-audio and --cookies-from-browser. The whisper section shows extracting mono 16kHz WAV audio with ffmpeg, running a transcription with word timestamps and JSON output, and includes a table of model sizes.
2 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit acf2587. 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.
Shell commands in SKILL.md call:
ffmpegcurlyt-dlpffprobewhisperpipFrom the folder's file list and the shell code blocks in SKILL.md.
Hosts in commands or code, which the agent is likely to contact:
api.openai.comgraph.facebook.comapi.groq.comapi.deepgram.comapi.elevenlabs.ioapi.telegram.orgFrom URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
OPENAI_API_KEYACCESS_TOKENGROQ_API_KEYDEEPGRAM_API_KEYELEVENLABS_API_KEYBOT_TOKENFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Video Clipping Reference loads about 4.1k tokens when it runs. Until then it costs about 34 tokens; SKILL.md has 1,012 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 patterns that need a careful read before installing.
- `--cookies-from-browser chrome` — use browser cookies for age-restricted contentAutomated 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 RightNow-AI/openfang at commit acf2587, republished under its Apache-2.0 licence (© RightNow-AI). 1,012 words, ~4,110 tokens.
.claude/skills/clip-hand-skill/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.All tools (ffmpeg, ffprobe, yt-dlp, whisper) use identical CLI flags on Windows, macOS, and Linux. The differences are only in shell syntax:
| Feature | macOS / Linux | Windows (cmd.exe) |
|---|---|---|
| Suppress stderr | 2>/dev/null | 2>NUL |
| Filter output | | grep pattern | | findstr pattern |
| Delete files | rm file1 file2 | del file1 file2 |
| Null output device | -f null - | -f null - (same) |
| ffmpeg subtitle paths | subtitles=clip.srt | subtitles=clip.srt (relative OK, absolute needs C\\:/path) |
IMPORTANT: ffmpeg filter paths (-vf "subtitles=...") always need forward slashes. On Windows with absolute paths, escape the colon: subtitles=C\\:/Users/me/clip.srt
Prefer using file_write tool for creating SRT/text files instead of shell echo/heredoc.
# Best video up to 1080p + best audio, merged
yt-dlp -f "bv[height<=1080]+ba/b[height<=1080]" --restrict-filenames -o "source.%(ext)s" "URL"
# 720p max (smaller, faster)
yt-dlp -f "bv[height<=720]+ba/b[height<=720]" --restrict-filenames -o "source.%(ext)s" "URL"
# Audio only (for transcription-only workflows)
yt-dlp -x --audio-format wav --restrict-filenames -o "audio.%(ext)s" "URL"# Get full metadata as JSON (duration, title, chapters, available subs)
yt-dlp --dump-json "URL"
# Key fields: duration, title, description, chapters, subtitles, automatic_captions# Download auto-generated subtitles in json3 format (word-level timing)
yt-dlp --write-auto-subs --sub-lang en --sub-format json3 --skip-download --restrict-filenames -o "source" "URL"
# Download manual subtitles if available
yt-dlp --write-subs --sub-lang en --sub-format srt --skip-download --restrict-filenames -o "source" "URL"
# List available subtitle languages
yt-dlp --list-subs "URL"--restrict-filenames — safe ASCII filenames (no spaces/special chars) — important on all platforms--no-playlist — download single video even if URL is in a playlist-o "template.%(ext)s" — output template (%(ext)s auto-detects format)--cookies-from-browser chrome — use browser cookies for age-restricted content--extract-audio / -x — extract audio only--audio-format wav — convert audio to wav (for whisper)# Extract mono 16kHz WAV (whisper's preferred input format)
ffmpeg -i source.mp4 -vn -ar 16000 -ac 1 -y audio.wav# Standard transcription with word-level timestamps
whisper audio.wav --model small --output_format json --word_timestamps true --language en
# Faster alternative (same flags, 4x speed)
whisper-ctranslate2 audio.wav --model small --output_format json --word_timestamps true --language en| Model | VRAM | Speed | Quality | Use When |
|---|---|---|---|---|
| tiny | ~1GB | Fastest | Rough | Quick previews, testing pipeline |
| base | ~1GB | Fast | OK | Short clips, clear speech |
| small | ~2GB | Good | Good | Default — best balance |
| medium | ~5GB | Slow | Better | Important content, accented speech |
| large-v3 | ~10GB | Slowest | Best | Final production, multiple languages |
Note: On macOS Apple Silicon, consider mlx-whisper as a faster native alternative.
{
"text": "full transcript text...",
"segments": [
{
"id": 0,
"start": 0.0,
"end": 4.52,
"text": " Hello everyone, welcome back.",
"words": [
{"word": " Hello", "start": 0.0, "end": 0.32, "probability": 0.95},
{"word": " everyone,", "start": 0.32, "end": 0.78, "probability": 0.91},
{"word": " welcome", "start": 0.78, "end": 1.14, "probability": 0.98},
{"word": " back.", "start": 1.14, "end": 1.52, "probability": 0.97}
]
}
]
}segments[].words[] gives word-level timing when --word_timestamps trueprobability indicates confidence (< 0.5 = likely wrong){
"events": [
{
"tStartMs": 1230,
"dDurationMs": 5000,
"segs": [
{"utf8": "hello ", "tOffsetMs": 0},
{"utf8": "world ", "tOffsetMs": 200},
{"utf8": "how ", "tOffsetMs": 450},
{"utf8": "are you", "tOffsetMs": 700}
]
}
]
}For each event and each segment within it:
word_start_ms = event.tStartMs + seg.tOffsetMsword_start_secs = word_start_ms / 1000.0word_text = seg.utf8.trim()Events without segs are line breaks or formatting — skip them.
Events with segs containing only "\n" are newlines — skip them.
1
00:00:00,000 --> 00:00:02,500
First line of caption text
2
00:00:02,500 --> 00:00:05,100
Second line of caption textHH:MM:SS,mmm (comma separator, not dot)file_write tool to create the SRT file — works identically on all platformsFor animated/styled captions, use ASS subtitle format instead of SRT:
ffmpeg -i clip.mp4 -vf "subtitles=clip.ass:force_style='FontSize=22,FontName=Arial,Bold=1,PrimaryColour=&H00FFFFFF,OutlineColour=&H00000000,Outline=2,Shadow=1,Alignment=2,MarginV=40'" -c:a copy output.mp4Key ASS style properties:
PrimaryColour=&H00FFFFFF — white text (AABBGGRR format)OutlineColour=&H00000000 — black outlineOutline=2 — outline thicknessAlignment=2 — bottom centerMarginV=40 — margin from bottom edgeFontSize=22 — good size for 1080x1920 verticalffmpeg -i input.mp4 -filter:v "select='gt(scene,0.3)',showinfo" -f null - 2>&1pts_time: from showinfo output for timestampsgrep showinfo, on Windows pipe through findstr showinfoffmpeg -i input.mp4 -af "silencedetect=noise=-30dB:d=1.5" -f null - 2>&1d=1.5 = minimum 1.5 seconds of silencesilence_start and silence_end in output# Re-encoded (accurate cuts)
ffmpeg -ss 00:01:30 -to 00:02:15 -i input.mp4 -c:v libx264 -c:a aac -preset fast -crf 23 -movflags +faststart -y clip.mp4
# Lossless copy (fast but may have keyframe alignment issues)
ffmpeg -ss 00:01:30 -to 00:02:15 -i input.mp4 -c copy -y clip.mp4-ss before -i = fast seek (recommended for extraction)-to = end timestamp, -t = duration# Center crop (when source is 16:9)
ffmpeg -i input.mp4 -vf "crop=ih*9/16:ih:(iw-ih*9/16)/2:0,scale=1080:1920" -c:a copy output.mp4
# Scale with letterbox padding (preserves full frame)
ffmpeg -i input.mp4 -vf "scale=1080:1920:force_original_aspect_ratio=decrease,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black" -c:a copy output.mp4# SRT subtitles with styling (use relative path or forward-slash absolute path)
ffmpeg -i input.mp4 -vf "subtitles=subs.srt:force_style='FontSize=22,FontName=Arial,PrimaryColour=&H00FFFFFF,OutlineColour=&H00000000,Outline=2,Alignment=2,MarginV=40'" -c:a copy output.mp4
# Simple text overlay
ffmpeg -i input.mp4 -vf "drawtext=text='Caption':fontsize=48:fontcolor=white:borderw=3:bordercolor=black:x=(w-text_w)/2:y=h-th-40" output.mp4Windows path escaping: subtitles=C\\:/Users/me/subs.srt (double-backslash before colon)
# At specific time (2 seconds in)
ffmpeg -i input.mp4 -ss 2 -frames:v 1 -q:v 2 -y thumb.jpg
# Best keyframe
ffmpeg -i input.mp4 -vf "select='eq(pict_type,I)',scale=1280:720" -frames:v 1 thumb.jpg
# Contact sheet
ffmpeg -i input.mp4 -vf "fps=1/10,scale=320:-1,tile=4x4" contact.jpg# Full metadata (JSON)
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4
# Duration only
ffprobe -v error -show_entries format=duration -of csv=p=0 input.mp4
# Resolution
ffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 input.mp4Fastest cloud STT — uses whisper-large-v3 on Groq hardware. Free tier available.
curl -s -X POST "https://api.groq.com/openai/v1/audio/transcriptions" \
-H "Authorization: Bearer $GROQ_API_KEY" \
-H "Content-Type: multipart/form-data" \
-F "file=@audio.wav" \
-F "model=whisper-large-v3" \
-F "response_format=verbose_json" \
-F "timestamp_granularities[]=word" \
-o transcript_raw.jsonResponse: {"text": "...", "words": [{"word": "hello", "start": 0.0, "end": 0.32}]}
timestamp_granularities[]=word is required for word-level timing.curl -s -X POST "https://api.openai.com/v1/audio/transcriptions" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: multipart/form-data" \
-F "file=@audio.wav" \
-F "model=whisper-1" \
-F "response_format=verbose_json" \
-F "timestamp_granularities[]=word" \
-o transcript_raw.jsonResponse format same as Groq. Max 25MB.
curl -s -X POST "https://api.deepgram.com/v1/listen?model=nova-2&smart_format=true&utterances=true&punctuate=true" \
-H "Authorization: Token $DEEPGRAM_API_KEY" \
-H "Content-Type: audio/wav" \
--data-binary @audio.wav \
-o transcript_raw.jsonResponse: {"results": {"channels": [{"alternatives": [{"words": [{"word": "hello", "start": 0.0, "end": 0.32, "confidence": 0.99}]}]}]}}
smart_format=true adds punctuation and casing.# List available voices
edge-tts --list-voices
# Generate speech
edge-tts --text "Your caption text here" --voice en-US-AriaNeural --write-media tts_output.mp3
# Other good voices: en-US-GuyNeural, en-GB-SoniaNeural, en-AU-NatashaNeuralInstall: pip install edge-tts
curl -s -X POST "https://api.openai.com/v1/audio/speech" \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"tts-1","input":"Your text here","voice":"alloy"}' \
--output tts_output.mp3Voices: alloy, echo, fable, onyx, nova, shimmer
Models: tts-1 (fast), tts-1-hd (quality)
curl -s -X POST "https://api.elevenlabs.io/v1/text-to-speech/21m00Tcm4TlvDq8ikWAM" \
-H "xi-api-key: $ELEVENLABS_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Your text here","model_id":"eleven_monolingual_v1"}' \
--output tts_output.mp3Voice ID 21m00Tcm4TlvDq8ikWAM = Rachel (default). List voices: GET /v1/voices
# Mix TTS over original audio (original at 30% volume, TTS at 100%)
ffmpeg -i clip.mp4 -i tts.mp3 \
-filter_complex "[0:a]volume=0.3[orig];[1:a]volume=1.0[tts];[orig][tts]amix=inputs=2:duration=first[out]" \
-map 0:v -map "[out]" -c:v copy -c:a aac -y clip_voiced.mp4
# Replace audio entirely (no original audio)
ffmpeg -i clip.mp4 -i tts.mp3 -map 0:v -map 1:a -c:v copy -c:a aac -shortest -y clip_voiced.mp4-preset ultrafast for quick previews, -preset slow for final output-crf 23 for good quality (18=high, 28=low, lower=bigger files)-movflags +faststart for web-friendly MP4-threads 0 to auto-detect CPU cores-y to overwrite without askingcurl -s -X POST "https://api.telegram.org/bot<BOT_TOKEN>/sendVideo" \
-F "chat_id=<CHAT_ID>" \
-F "video=@clip_N_final.mp4" \
-F "caption=Clip title here" \
-F "parse_mode=HTML" \
-F "supports_streaming=true"| Parameter | Required | Description |
|---|---|---|
chat_id | Yes | Channel (-100XXXXXXXXXX or @channelname), group, or user numeric ID |
video | Yes | @filepath for upload (max 50MB) or a Telegram file_id for re-send |
caption | No | Text caption, up to 1024 characters |
parse_mode | No | HTML or MarkdownV2 for styled captions |
supports_streaming | No | true enables progressive playback |
{"ok": true, "result": {"message_id": 1234, "video": {"file_id": "BAACAgI...", "file_size": 5242880}}}{"ok": false, "error_code": 400, "description": "Bad Request: chat not found"}| Error Code | Description | Fix |
|---|---|---|
| 400 | Chat not found | Verify chat_id; bot must be added to the channel/group |
| 401 | Unauthorized | Bot token is invalid or revoked — regenerate via @BotFather |
| 413 | Request entity too large | File exceeds 50MB — re-encode: ffmpeg -i input.mp4 -fs 49M -c:v libx264 -crf 28 -preset fast -c:a aac -y output.mp4 |
| 429 | Too many requests | Rate limited — wait the retry_after seconds from the response |
Telegram allows up to 50MB for video uploads via Bot API. If a clip exceeds this:
ffmpeg -i clip_N_final.mp4 -fs 49M -c:v libx264 -crf 28 -preset fast -c:a aac -movflags +faststart -y clip_N_tg.mp4WhatsApp Cloud API requires uploading the video first to get a media_id, then sending a message referencing that ID.
curl -s -X POST "https://graph.facebook.com/v21.0/<PHONE_NUMBER_ID>/media" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-F "file=@clip_N_final.mp4" \
-F "type=video/mp4" \
-F "messaging_product=whatsapp"Success response:
{"id": "1234567890"}curl -s -X POST "https://graph.facebook.com/v21.0/<PHONE_NUMBER_ID>/messages" \
-H "Authorization: Bearer <ACCESS_TOKEN>" \
-H "Content-Type: application/json" \
-d '{
"messaging_product": "whatsapp",
"to": "<RECIPIENT_PHONE>",
"type": "video",
"video": {
"id": "<MEDIA_ID>",
"caption": "Clip title here"
}
}'Success response:
{"messaging_product": "whatsapp", "contacts": [{"wa_id": "14155551234"}], "messages": [{"id": "wamid.HBgL..."}]}WhatsApp allows up to 16MB for video uploads. If a clip exceeds this:
ffmpeg -i clip_N_final.mp4 -fs 15M -c:v libx264 -crf 30 -preset fast -c:a aac -movflags +faststart -y clip_N_wa.mp4WhatsApp requires the recipient to have messaged you within the last 24 hours (for non-template messages). If you get a "template required" error, either:
| Error Code | Description | Fix |
|---|---|---|
| 100 | Invalid parameter | Check phone_number_id and recipient format (no + prefix, no spaces) |
| 190 | Invalid/expired access token | Regenerate token in Meta Business Settings; temporary tokens expire in 24h |
| 131030 | Recipient not in allowed list | In test mode, add recipient to allowed numbers in Meta Developer Portal |
| 131047 | Re-engagement message / template required | Recipient hasn't messaged within 24h — use a template or ask them to message first |
| 131053 | Media upload failed | File too large or unsupported format — re-encode as MP4 under 16MB |
© RightNow-AI, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in crates/openfang-hands/bundled/clip of RightNow-AI/openfang.
Open the folder on GitHubat commit acf2587
Video Clipping Reference 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 |
|---|---|---|---|---|---|---|
| Video Clipping Reference this skillRightNow-AI/openfang | 18k | — | ~4.1k | Automated safety check: Warn | Apache-2.0 | |
| Ffmpeg Skillkajisho5/ffmpeg-skill | 1.9k | — | ~7.4k | Automated safety check: Pass | MIT | |
| Video Clip Extractorlinzzzzzz/openclip | 569 | — | ~2.8k | Automated safety check: Warn | MIT | |
| Record Demolibnativeapi/nativeapi | 166 | — | ~2.9k | Automated safety check: Pass | MIT | |
| Transcribebadlogic/pi-skills | 2.6k | — | ~264 | Automated safety check: Pass | MIT | |
| Watchmathiaschu/watch | 142 | — | ~4k | Automated safety check: Warn | MIT |
kajisho5/ffmpeg-skill
Edit video and audio with local FFmpeg from natural-language requests: cut, trim, join, resize/reframe (9:16, 1:1), speed change, captions and subtitles (SRT/ASS, animated, karaoke), logos and text…
linzzzzzz/openclip
Processes videos to identify engaging moments, generate transcripts, and create highlight clips with artistic titles and custom cover images.
libnativeapi/nativeapi
Record a demo video of a desktop app — launch it, play a scripted scenario with smooth synthetic mouse input, and capture the screen (cursor and click highlights included) straight to an…
badlogic/pi-skills
Local speech-to-text transcription on Apple Silicon macOS. An agent skill from badlogic/pi-skills.
mathiaschu/watch
Watch a video from YouTube, Instagram, X/Twitter, Vimeo, TikTok or any of ~1800 yt-dlp sites (or a local path).
calesthio/OpenMontage
Download video and audio from YouTube and 1000+ sites using yt-dlp.
RightNow-AI/openfang
Reference of CSS selectors, step-by-step web workflows and error recovery tactics for an agent that browses, fills forms and compares prices on live sites.
RightNow-AI/openfang
Reference knowledge for open-source intelligence collection: the collection cycle, source reliability tiers, search query patterns and entity extraction.
RightNow-AI/openfang
Reference knowledge for AI lead generation: building an ideal customer profile, researching prospects on the web, enriching lead records and finding email formats.
RightNow-AI/openfang
Reference knowledge for AI forecasting: superforecasting principles, a signal taxonomy, confidence calibration rules and reasoning chains for making and tracking predictions.
RightNow-AI/openfang
Reference knowledge for AI deep research: a five-phase process, strategies by question type, CRAAP source scoring, cross-referencing, synthesis and citation formats.
RightNow-AI/openfang
Expert knowledge for AI Twitter/X management — API v2 reference, content strategy, engagement playbook, safety, and performance tracking
Categories
Command reference for cutting clips from online video: yt-dlp downloads, whisper transcription, SRT subtitle files and ffmpeg processing, with Windows, macOS and Linux differences. This skill is a command reference rather than a step-by-step workflow. It notes that ffmpeg, ffprobe, yt-dlp and whisper take the same flags on Windows, macOS and Linux and only the shell syntax differs, with a table covering stderr redirection, output filtering, deleting files and ffmpeg subtitle paths, which need forward slashes and an escaped colon for absolute Windows paths.
Video Clipping Reference fits situations like: cutting short clips out of a longer video with ffmpeg; downloading a video and its subtitles with yt-dlp; transcribing a video's audio with whisper to get word-level timestamps; burning SRT subtitles into a clip when working with Windows paths.
Run `npx skills add RightNow-AI/openfang --skill clip-hand-skill -a claude-code`. Or copy the skill folder (crates/openfang-hands/bundled/clip in RightNow-AI/openfang) into .claude/skills/clip-hand-skill in your project. Claude Code loads it when a task matches its description.
Run `npx skills add RightNow-AI/openfang --skill clip-hand-skill -a codex`. Or copy the skill folder (crates/openfang-hands/bundled/clip in RightNow-AI/openfang) into .agents/skills/clip-hand-skill 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 RightNow-AI/openfang --skill clip-hand-skill -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/clip-hand-skill, .gemini/skills/clip-hand-skill, .github/skills/clip-hand-skill and .opencode/skills/clip-hand-skill in your project.
Going by SKILL.md and its folder, Video Clipping Reference needs the command-line tools its instructions call (ffmpeg, curl, yt-dlp, ffprobe, whisper and pip) and credentials named OPENAI_API_KEY, ACCESS_TOKEN, GROQ_API_KEY and DEEPGRAM_API_KEY. Our summary lists: ffmpeg and ffprobe; yt-dlp; whisper.
SKILL.md names 6 domains. In commands or code: api.openai.com, graph.facebook.com, api.groq.com, api.deepgram.com, api.elevenlabs.io and api.telegram.org; the agent is likely to contact these when it follows the instructions. This is read from the text; nothing was executed.
Our automated static check of SKILL.md flagged 1 warning(s): mentions a credentials file (ssh keys, cloud or package-manager tokens). Read the flagged lines before installing; the check is not a guarantee either way.
Video Clipping Reference is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.1k tokens (SKILL.md is roughly 16k 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 Video Clipping Reference: Ffmpeg Skill (kajisho5/ffmpeg-skill, 1.9k stars), Video Clip Extractor (linzzzzzz/openclip, 569 stars), Record Demo (libnativeapi/nativeapi, 166 stars) and Transcribe (badlogic/pi-skills, 2.6k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
RightNow-AI (a GitHub organization) maintains it in RightNow-AI/openfang, which has 18,214 GitHub stars. The repository holds 68 skills in this directory. The repository was last updated on July 2, 2026.
Source: RightNow-AI/openfang on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.