Source profileQuality 92/100

novoads/agent-skills/shared/skills/caption-video/SKILL.md

caption-video

Burn timed, styled captions into a finished video on the local machine, without re-rendering the source. This is the manual fallback to the API's captioning endpoint, POST /v1/captions, which stays the default path: come here when the style the user wants is outside the API's presets, when the wording has to be hand-corrected before it is burned into the pixels, or when the source was rendered with audio disabled and the API refuses it. Transcribes the audio with Whisper, groups words into readi

Source repository stars
9
Declared platforms
0
Static risk flags
0
Last source update
2026-08-24
Source checked
2026-08-25

Decision brief

What it does: where it fits

Takes a finished MP4 with speech and returns the same video with timed captions burned in. Nothing is regenerated: the source pixels and the source audio pass through untouched, and the captions are composited on top.

Best for

  • "add captions to this video" / "burn in subtitles"
  • "TikTok-style captions" / "word-by-word captions"
  • "caption this ad before I deploy it"

Not for

  • Tasks that require unconfirmed production actions or broad system permissions.
  • Environments where the pinned source and install steps cannot be inspected.

Compatibility matrix

Platform support, with evidence labels

PlatformStatusEvidenceWhat to check
CodexNot declaredNo explicit evidencePortability before use
Claude CodeNot declaredNo explicit evidencePortability before use
CursorNot declaredNo explicit evidencePortability before use
Gemini CLINot declaredNo explicit evidencePortability before use
Open the compatibility checker

Installation

Inspect first. Install second.

The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

Source-detected install commandSource
npx skills add https://github.com/novoads/agent-skills --skill "shared/skills/caption-video"
Safe inspection promptEditorial

Inspect the Agent Skill "caption-video" from https://github.com/novoads/agent-skills/blob/2f5e03f9c625fd719a1bc5cddaf7f7fe1a6f9e44/shared/skills/caption-video/SKILL.md at commit 2f5e03f9c625fd719a1bc5cddaf7f7fe1a6f9e44. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

Workflow

What the source asks the agent to do

  1. 01

    Workflow

    1. Trim dead space first, if any. If the source has beats where VO ends and silent visual continues, tighten it before transcribing. Timestamps taken from an untightened master drift once the video is trimmed later. 2. Initialize a captioning project beside the source video. 3.…

    Trim dead space first, if any. If the source has beats where VO ends andInitialize a captioning project beside the source video.Transcribe — pick the Whisper model by audio type (medium.en for the
  2. 02

    Check the API path first

    POST /v1/captions is the default, and it is one call against a finished asset with a set of preset styles and no local toolchain at all. Read the novoads-api skill's SKILL.md (Burned-in captions) for the call, and prompting/guide.md here for the full side by side. Offer both pat…

    wants a caption look the presets do not cover,has to hand-correct the words before they are burned in. Invented brand namesis captioning enough footage that per-minute credits add up,
  3. 03

    When to use this skill

    Trigger on phrases like: - "add captions to this video" / "burn in subtitles" - "TikTok-style captions" / "word-by-word captions" - "caption this ad before I deploy it" - the captions step of a video-ad pipeline, after the master is stitched

    "add captions to this video" / "burn in subtitles""TikTok-style captions" / "word-by-word captions""caption this ad before I deploy it"
  4. 04

    Read order

    1. This file — the pipeline shape, the gates, the hard-won rules. 2. prompting/guide.md — the full recipe: Whisper model choice, the silence-offset transcription pattern, the word-grouping helper, the composition skeleton, the alpha composite, and the pitfall table. 3. shared/re…

    This file — the pipeline shape, the gates, the hard-won rules.prompting/guide.md — the full recipe: Whisper modelshared/references/craft.md § 3 — the
  5. 05

    Prerequisites

    ffmpeg on PATH. Homebrew's build is fine here — this skill deliberately

    ffmpeg on PATH. Homebrew's build is fine here — this skill deliberatelyWhisper — pip install openai-whisper, or the bundledNode + npx for HyperFrames.

Permission review

Static risk signals and limitations

No configured static risk pattern was detected

This is not proof of safety. Runtime behavior, indirect dependencies, and hidden external systems are outside the static scan.

Evidence record

Why each signal appears

EvidenceSourceComputedTestedEditorial
SignalValueEvidence typeMeaning
Quality score92/100ComputedDocumentation, specificity, maintenance, and trust rules
Repository stars9SourceRepository attention, not individual Skill quality
Compatibility0 platformsSourceDeclared in the catalog source record
Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

Pinned source

Provenance and original SKILL.md

Repository
novoads/agent-skills
Skill path
shared/skills/caption-video/SKILL.md
Commit
2f5e03f9c625fd719a1bc5cddaf7f7fe1a6f9e44
License
MIT
Collected
2026-08-25
Default branch
main
View the original SKILL.md

Caption a finished video

Takes a finished MP4 with speech and returns the same video with timed captions burned in. Nothing is regenerated: the source pixels and the source audio pass through untouched, and the captions are composited on top.

This skill makes no API calls. It is ffmpeg + Whisper + HyperFrames on a local file, so it costs no credits and needs no API key.

Check the API path first

POST /v1/captions is the default, and it is one call against a finished asset with a set of preset styles and no local toolchain at all. Read the novoads-api skill's SKILL.md (Burned-in captions) for the call, and prompting/guide.md here for the full side by side. Offer both paths rather than picking silently, because the API costs credits and this skill costs a first-time setup.

REST key required. A Novoads MCP connector is not a substitute. If NOVOADS_API_KEY is missing or still the placeholder, stop before any generation work and tell the user: "Before continuing, create an API key at https://novoads.ai/dashboard/settings?tab=api and paste it into .env." That holds even when mcp__novoads__* tools are connected and authenticated in the session. Never call mcp__novoads__* tools from this repo's workflows: they are a different surface with different behavior, including the units they quote costs in. Repo installs verify with ./scripts/check-novoads-env.sh; a solo install checks NOVOADS_API_KEY in the environment.

Pack version. Every /v1 response carries X-Novoads-Pack-Version; mention a newer pack at https://github.com/novoads/agent-skills only when that header names a version NEWER than this file's metadata.packVersion — equal or older is nothing to say, and it is never a reason to stop.

Come here instead when the user:

  • wants a caption look the presets do not cover,
  • has to hand-correct the words before they are burned in. Invented brand names are the usual reason: transcription mishears them, and the API gives you nowhere to fix it,
  • is captioning enough footage that per-minute credits add up,
  • has a line the API path burns wrong. Its renderer can truncate a word even when its own transcript is correct — see Safety rules below. There is nothing to fix on that path, so the local burn is the fix,
  • or has a source rendered with audioEnabled: false, which the API refuses with a 409. This skill can still caption it if the user supplies the words.

When to use this skill

Trigger on phrases like:

  • "add captions to this video" / "burn in subtitles"
  • "TikTok-style captions" / "word-by-word captions"
  • "caption this ad before I deploy it"
  • the captions step of a video-ad pipeline, after the master is stitched

Do not use it to generate video — that's the novoads-api skill and the style pipelines. Do not use it when the user wants a sidecar .srt/.vtt subtitle file rather than pixels; Whisper alone covers that.

Read order

  1. This file — the pipeline shape, the gates, the hard-won rules.
  2. prompting/guide.md — the full recipe: Whisper model choice, the silence-offset transcription pattern, the word-grouping helper, the composition skeleton, the alpha composite, and the pitfall table.
  3. shared/references/craft.md § 3 — the trim-before-captioning doctrine step 1 below rests on, and § 1 for why the burned frames are the check rather than the transcript. Read it before you restate either rule anywhere; it holds one position per rule, and the copy is the failure mode.

Prerequisites

  • ffmpeg on PATH. Homebrew's build is fine here — this skill deliberately avoids the subtitles/drawtext filters, which Homebrew ships without.
  • Whisperpip install openai-whisper, or the bundled npx hyperframes transcribe.
  • Node + npx for HyperFrames.
  • The finished video on disk. Chat-pasted files are not accessible; ask for a real path.

Workflow

  1. Trim dead space first, if any. If the source has beats where VO ends and silent visual continues, tighten it before transcribing. Timestamps taken from an untightened master drift once the video is trimmed later.
  2. Initialize a captioning project beside the source video.
  3. Transcribe — pick the Whisper model by audio type (medium.en for the typical speech-over-music ad). Transcribe a silence-trimmed copy and offset the timestamps back; Whisper smears the first words across leading silence otherwise. The source file itself is never modified.
  4. Group words into 3–5 word reading phrases, then eyeball groups.json.
  5. Render the captions over a transparent background at the source's frame rate, and composite with ffmpeg using the alpha channel.
  6. Verify the output: duration, resolution and frame rate match the source, audio is bit-identical, and the captions land on the words.

The guide carries the exact commands for each step.

Rules that cost a whole render to rediscover

  • Composite with a real alpha channel, not a chroma key. Render --format mov and let ffmpeg overlay use the alpha. A magenta key cannot cleanly remove a soft text-shadow — the shadow blends toward the key colour and leaves a purple halo on every glyph. Verified on a live clip 2026-08-03.
  • Never put <video> or <audio> in the composition. HyperFrames wraps any class="clip" element in a managed timing wrapper that overrides your CSS and reserves an ~80px layout block — a hard black bar across the render.
  • Match the frame rate to the source. HyperFrames defaults to 30fps; Seedance renders 24. Pass --fps 24 for Seedance output. Mismatched rates produce judder and creeping caption drift.
  • Match the composition size to the source resolution exactly, or the composite lands 1–2px off.
  • -c:a copy on the composite, always. The source's narration/BGM/ducking mix is already correct; re-encoding it is pure loss.

Safety rules

  • Never overwrite the source video. Write to a new filename. The source is the only copy of an expensive render.
  • Read the transcript before rendering. Whisper mis-hears brand names and numbers. Correcting groups.json costs seconds; a wrong caption burned into a deployed ad costs a re-render.
  • Show the user the grouped phrases (or the first render) before treating the captions as final.
  • Read the burned frames, not just the transcript. A correct transcript does not prove a correct caption. On 2026-08-12 the API path's hustle preset burned BOTT. for bottle. in every frame of a closing line while its own transcript had the word right — bottle. at 13.199–13.439s. The fault sat in the render layer, downstream of transcription, so every check that stopped at the words passed it. Compare the burned cards word for word against the approved script before shipping, and treat a truncated or garbled word as a failed run rather than a note. That take was charged and thrown away; the local burn is what shipped.

Hand-off

The captioned MP4 is a finished creative. To publish it as a Meta ad, that's the separate meta-ad-builder skill — which opts out of Meta's frame-modifying Advantage+ enhancements precisely because these captions are burned into the pixels.

Frequently asked questions

What to verify before installation and use

What does the caption-video source document cover?

Takes a finished MP4 with speech and returns the same video with timed captions burned in. Nothing is regenerated: the source pixels and the source audio pass through untouched, and the captions are composited on top.

How do I install caption-video?

The source record exposes this install command: npx skills add https://github.com/novoads/agent-skills --skill "shared/skills/caption-video". Inspect the command and pinned source before running it.

Alternatives

Compare before choosing

Computed 10029,034

garrytan/gbrain

bulk-ingestion

End-to-end discipline for turning any large data source (audio libraries, email takeouts, document corpora, chat exports, API dumps) into brain pages at scale. The lifecycle spine: SCHEMA → ACCESS → TRIAL → EVALUATE → IMPROVE → CODIFY → TEST → SKILLIFY → BULK → MONITOR. State is tracked in a durable JSON manifest (see MANIFEST-PATTERN.md) so any crash, session boundary, or subagent fan-out resumes from ground truth instead of memory.

Computed 10024,921

alirezarezvani/claude-skills

app-store-optimization

App Store Optimization (ASO) toolkit for researching keywords, analyzing competitor rankings, generating metadata suggestions, and improving app visibility on Apple App Store and Google Play Store. Use when the user asks about ASO, app store rankings, app metadata, app titles and descriptions, app store listings, app visibility, or mobile app marketing on iOS or Android. Supports keyword research and scoring, competitor keyword analysis, metadata optimization, A/B test planning, launch checklist

Computed 1005,241

dotnet/skills

migrate-vstest-to-mtp

Migrates .NET test projects from VSTest to Microsoft.Testing.Platform (MTP). Use when user asks to "migrate to MTP", "switch from VSTest", "enable Microsoft.Testing.Platform", "use MTP runner", set OutputType=Exe only for test projects in Directory.Build.props, or mentions EnableMSTestRunner, EnableNUnitRunner, or UseMicrosoftTestingPlatformRunner. USE FOR: MTP behavioral differences vs VSTest (exit code 8, zero tests discovered, --ignore-exit-code, TESTINGPLATFORM_EXITCODE_IGNORE); centralizing

Computed 100147

oaustegard/claude-skills

featuring

Generate hierarchical _FEATURES.md files that describe what a codebase DOES from a user/consumer perspective, anchored to source symbols via tree-sitting. Supports large complex codebases through feature-driven decomposition into sub-feature files. Uses a multi-pass synthesis: orientation → detail → overview rewrite. Use when someone says "what does this do", "document features", "feature inventory", "_FEATURES.md", or needs to understand a codebase's purpose before modifying it. Complements tre