Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when applies to all `<video>` elements and third-party video embeds (YouTube, Vimeo) where the page owner controls the content. Prerecorded videos require `.vtt` caption files via `<track>`. For videos embedded via `<iframe>`, check that the video platform captions are enabled. Audio-only content requires transcripts instead (SC 1.2.1). Video-only content (no audio) requires a text alternative or audio description instead (SC 1.2.3).
.claude/skills/thedaviddias-video-captions/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 31% | 0% |
| case-20 | ✓→✗ | ▼ Worse | 20% | 0% |
| case-08 | ✓→✓ | = Same ✓ | 27% | 0% |
| case-22 | ✓→✓ | = Same ✓ | 127% | 0% |
| case-01 | ✓→✓ | = Same ✓ | 56% | 0% |
Approximately 15% of adults have some degree of hearing loss. Captions are essential for deaf and hard-of-hearing users who cannot access audio content. They also benefit users in sound-sensitive environments (libraries, open offices), users watching without headphones in public, non-native speakers, and users with auditory processing disorders. WCAG SC 1.2.2 is a Level AA requirement — its absence is a legal compliance failure under the ADA, EN 301 549, and similar regulations worldwide.
<track kind='captions'> with a .vtt (WebVTT) file for HTML5 <video> elementsFind all <video> elements and video embeds (<iframe> from YouTube, Vimeo, etc.). For each <video> with audio: check for a <track> child element with kind='captions' and a valid src pointing to a .vtt file. Verify the default attribute is present on at least one track so captions are on by default (or document the UX reason they are off by default). For YouTube/Vimeo embeds: check that the platform's caption toggle is accessible. Also check that the .vtt file exists and is valid (not empty, not just music notes).
For <video> elements without captions: (1) Create a WebVTT (.vtt) file containing synchronized caption text — include all spoken words, speaker IDs for multi-speaker content, and descriptions of relevant sounds (e.g., 'applause]', 'upbeat music]'). (2) Add <track kind='captions' srclang='en' label='English' src='captions-en.vtt' default> inside the <video> element. (3) For auto-generated captions (YouTube, AI tools): review and correct errors — auto-captions average 80% accuracy and often fail on proper nouns, technical terms, and accented speech. (4) For live streams: implement real-time captioning via a third-party captioning service or CART (Communication Access Realtime Translation).
WCAG 2.1 SC 1.2.2 (Captions — Prerecorded, Level AA) requires synchronized text alternatives for all audio in prerecorded video content. Captions differ from subtitles: captions are intended for deaf/hard-of-hearing viewers and must include non-speech information (sound effects, music), while subtitles translate dialogue for viewers who can hear but do not understand the language. The HTML <track> element with kind='captions' delivers WebVTT files that browsers render as synchronized on-screen text. The kind='subtitles' value is for translation only and does not satisfy SC 1.2.2 because browsers may omit non-speech annotations.
Review the rendered markup and interactive states that affect Provide captions for video content. Flag exact elements, roles, labels, focus behavior, or keyboard interactions that violate the rule, and note how to verify the fix with browser accessibility tooling or assistive tech.
For full implementation details, code examples, and framework-specific guidance, see references/rule.md.
Rule page: https://frontendchecklist.io/en/rules/accessibility/video-captions
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-08 | pass→pass | 11,211 | 9,166 | -18% | 1 | 1 | 0% | 1,976 | 2,514 | +27% | 0 | 0 | — |
case-22 | pass→pass | 4,956 | 6,230 | +26% | 1 | 1 | 0% | 878 | 1,989 | +127% | 0 | 0 | — |
case-01 | pass→pass | 6,570 | 4,731 | -28% | 1 | 1 | 0% | 1,104 | 1,727 | +56% | 0 | 0 | — |
case-02 | fail→pass | 4,184 | 1,789 | -57% | 1 | 1 | 0% | 841 | 1,100 | +31% | 0 | 0 | — |
case-03 | pass→pass | 5,250 | 3,745 | -29% | 1 | 1 | 0% | 1,052 | 1,457 | +38% | 0 | 0 | — |
case-04 | pass→pass | 12,563 | 13,152 | +5% | 1 | 1 | 0% | 2,024 | 3,162 | +56% | 0 | 0 | — |
case-05 | pass→pass | 9,330 | 4,649 | -50% | 1 | 1 | 0% | 1,686 | 1,694 | +0% | 0 | 0 | — |
case-06 | pass→pass | 3,116 | 2,284 | -27% | 1 | 1 | 0% | 544 | 1,265 | +133% | 0 | 0 | — |
case-07 | pass→pass | 9,031 | 6,091 | -33% | 1 | 1 | 0% | 1,560 | 1,879 | +20% | 0 | 0 | — |
case-09 | pass→pass | 11,613 | 8,174 | -30% | 1 | 1 | 0% | 1,995 | 2,236 | +12% | 0 | 0 | — |
case-10 | pass→pass | 8,327 | 7,442 | -11% | 1 | 1 | 0% | 1,397 | 2,025 | +45% | 0 | 0 | — |
case-11 | pass→pass | 8,270 | 5,342 | -35% | 1 | 1 | 0% | 1,602 | 1,751 | +9% | 0 | 0 | — |
case-12 | pass→pass | 10,573 | 8,549 | -19% | 1 | 1 | 0% | 1,829 | 2,395 | +31% | 0 | 0 | — |
case-13 | pass→pass | 12,807 | 10,630 | -17% | 1 | 1 | 0% | 2,238 | 2,613 | +17% | 0 | 0 | — |
case-14 | pass→pass | 9,384 | 6,044 | -36% | 1 | 1 | 0% | 1,655 | 2,026 | +22% | 0 | 0 | — |
case-15 | pass→pass | 12,386 | 11,235 | -9% | 1 | 1 | 0% | 2,017 | 2,679 | +33% | 0 | 0 | — |
case-16 | pass→pass | 13,900 | 8,367 | -40% | 1 | 1 | 0% | 2,207 | 2,132 | -3% | 0 | 0 | — |
case-17 | pass→pass | 15,935 | 11,486 | -28% | 1 | 1 | 0% | 2,660 | 2,824 | +6% | 0 | 0 | — |
case-18 | pass→pass | 9,046 | 7,694 | -15% | 1 | 1 | 0% | 1,559 | 2,067 | +33% | 0 | 0 | — |
case-19 | pass→pass | 8,198 | 4,381 | -47% | 1 | 1 | 0% | 1,371 | 1,555 | +13% | 0 | 0 | — |
case-20 | pass→fail | 8,559 | 7,902 | -8% | 1 | 1 | 0% | 1,866 | 2,236 | +20% | 0 | 0 | — |
case-21 | pass→pass | 13,097 | 18,952 | +45% | 1 | 1 | 0% | 2,026 | 2,968 | +46% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of 0 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.