1. Check a caption file
Paste the whole file, including the WEBVTT header for a VTT track, or the numeric cue index for an SRT track.
2. Report
0cues 0danger 0notice
Findings
Per-cue metrics
| # | Start | Duration | Chars | CPS | Lines | Text |
|---|
Prefer a CLI, or want this as a CI gate?
The CLI reads a local .srt/.vtt file and runs the identical checks — no browser, no upload, nothing goes through this site:
node check.mjs captions.srt --json node check.mjs captions.vtt --max-cps 17 node check.mjs captions.srt --max-line-length 32 --max-lines 2
Get check.mjs and engine.mjs from the repo — plain Node 18+, nothing to install. Exit code 1 when a danger-severity finding is produced (reading too fast, overlapping cues, invalid or out-of-order timing) or the file cannot be read at all.
What's checked
| Check | What it flags | Severity |
|---|---|---|
| Reading too fast | Characters per second above the cap (default 20) | Danger |
| Invalid timing | A cue's end time is at or before its start time | Danger |
| Out of order | A cue starts before an earlier one in the file | Danger |
| Overlapping cues | A cue's end time is after the next cue's start time | Danger |
| Duration too short | On screen for less than the minimum (default 5/6 second) | Notice |
| Duration too long | On screen for more than the maximum (default 7 seconds) | Notice |
| Line too long | A line above the maximum length (default 42 characters) | Notice |
| Too many lines | More lines in one cue than the maximum (default 2) | Notice |
| Gap too short | Less than the minimum gap (default ~84ms) between two cues | Notice |
| Empty cue | A cue with no visible text at all | Notice |
Common questions
What counts as "too fast" for captions?
There is no single legal reading-speed limit, but caption style guides converge on a similar range: a commonly-cited ceiling for adult-content captions is around 20 characters per second (roughly 160-180 words per minute), with a lower cap often used for children's content. This tool defaults to 20 characters per second and lets you lower or raise it with --max-cps on the CLI.
Why does caption quality matter if WCAG only requires that captions exist?
WCAG Success Criterion 1.2.2 requires captions for prerecorded audio content, but it does not grade how readable those captions are once they exist. A caption track can be technically present — it parses, it plays, it is synced — and still fail the viewer it exists for if the text moves faster than a typical reading speed, crowds too many lines into the frame, or flickers past in under a second. Quality is a separate, unenforced question from presence, and this tool checks the quality question.
Where do the specific numbers (42 characters per line, two lines, 20 cps) come from?
They are commonly-used industry thresholds, not one single controlling standard — publicly published caption style guides such as Netflix's Timed Text Style Guide and the BBC's Subtitle Guidelines state versions of these same numbers (reading speed caps, a two-line maximum, minimum and maximum on-screen duration). This tool cites them as widely-used defaults and makes every threshold configurable on the CLI, because a specific broadcaster, platform, or client contract may set its own numbers.
Does this replace a human caption review?
No. It checks mechanically verifiable properties of the timing and text you provide — reading speed, line length, duration, overlap, and gaps. It cannot judge whether a caption is an accurate transcription, whether speaker labels or sound descriptions are used correctly, or whether the translation (for subtitles) reads naturally. Treat a clean report as evidence that the mechanical thresholds are met, not as a substitute for reviewing the captions yourself.