Guide

Fix Subtitles Checks Reference: Every Check and Threshold

VideoText editorial team · October 25, 2026 · 13 min read

This page lists every check the Subtitle Validator and Fix Subtitles run on a subtitle file, what each one detects, what the fixer changes, and the threshold it uses. Each threshold names the file and line in the VideoText source it comes from, so you can see exactly what a "fixed" or "reported" result means.

Last reviewed: 2026-10-25, against commit d16bdcb.

Two tools do this work:

  • Subtitle Validator runs in your browser. It reads the file line by line, reports problems, and repairs only the SRT problems that have one correct answer. A VTT file is reported but not rewritten.
  • Fix Subtitles runs on the server. It re-breaks lines, gives fast captions more time, resolves overlaps, and writes the file back in the format you uploaded (SRT or VTT).

What neither tool can judge, such as whether the words or a translation are right, is covered in what stays manual on the Fix Subtitles page.

Subtitle Validator checks

Every check below runs on both formats unless the Formats column says otherwise. The repair column applies to SRT files only; on a VTT file every row is reported, not rewritten (client/src/lib/srtHealth.ts:464).

Check (code name) Formats What is detected What the repair does Threshold or setting Limitation or what stays manual
timestamp-format SRT A timing line not written as HH:MM:SS,mmm --> HH:MM:SS,mmm, such as a dot instead of a comma or missing hours. Rewrites the timing line in standard SRT format. No time changes. Fixed pattern, client/src/lib/srtHealth.ts:132 None.
unparseable-timing SRT A line with an arrow that cannot be read as a timing line. Reported only, not rewritten. The repair does not run on the file until the line is fixed, so no dialogue is dropped. Fixed rule, client/src/lib/srtHealth.ts:237, client/src/lib/srtHealth.ts:442 Fix the line by hand, then check again.
text-before-first-cue SRT Text with no timing line before the first cue. Reported only, not rewritten. The repair does not run until it is removed. Fixed rule, client/src/lib/srtHealth.ts:267 Remove the text or give it a timing line.
missing-blank-line SRT A cue that runs straight on from the one before it, with no blank line between them. Adds the blank line. Fixed rule, client/src/lib/srtHealth.ts:251 None.
stray-text SRT Text after a blank line inside a cue. Keeps that text with the cue it belongs to. Fixed rule, client/src/lib/srtHealth.ts:273 None.
numbering SRT Cue numbers that are missing, repeated or out of sequence. Renumbers cues 1, 2, 3. Fixed rule, client/src/lib/srtHealth.ts:383 None.
mixed-line-endings SRT, VTT Windows and Unix line endings in the same file. Makes line endings consistent. Fixed rule, client/src/lib/srtHealth.ts:419 Shown as a note, not an error.
empty-cue SRT, VTT A cue with no text, or only formatting tags. A cue that reads only "<laughs>" counts as text. Removes the cue. Fixed rule, client/src/lib/srtHealth.ts:292, client/src/lib/srtHealth.ts:307 None.
end-before-start SRT, VTT A cue that ends before it starts. Reported only, not rewritten. Listed under "Needs a decision". Fixed rule, client/src/lib/srtHealth.ts:312 Either time could be the typo, so you choose. Fix Subtitles can repair it (see below).
zero-duration SRT, VTT A cue that starts and ends at the same time, so it never shows. Reported only, not rewritten. Fixed rule, client/src/lib/srtHealth.ts:315 The right end time is not in the file.
short-duration SRT, VTT A cue on screen for less than 0.8 seconds. Reported only, not rewritten. 0.8 seconds, fixed, client/src/lib/srtHealth.ts:128 Fix Subtitles can give it more time.
out-of-order SRT, VTT A cue that starts before the cue above it. Sorts cues into time order. No time changes. Fixed rule, client/src/lib/srtHealth.ts:336 None.
overlap SRT, VTT A cue that runs into the next one, where ending it early still leaves it readable. Moves the earlier cue's end to the next cue's start. Start times never move. The trimmed cue must stay on screen at least 0.7 seconds and keep at least half its time; fixed, client/src/lib/srtHealth.ts:124, client/src/lib/srtHealth.ts:363 None.
overlap-unsafe SRT, VTT An overlap where trimming would hide a caption: both cues start together, one sits entirely inside the other, or the trim would fall under the limit above. Reported only, not rewritten. Same limits as overlap, client/src/lib/srtHealth.ts:351 Decide which cue comes first, or check the real timing.
flicker-gap SRT, VTT A gap between two cues longer than zero and shorter than 0.1 seconds, which makes the caption blink. Off by default. With "Also close gaps shorter than 0.1 s" ticked, extends the earlier cue to the next one. 0.1 seconds, fixed, client/src/lib/srtHealth.ts:126. The option is user-configurable, client/src/components/SubtitleHealthChecker.tsx:403, client/src/lib/srtHealth.ts:512 Shown as a note.
long-line SRT, VTT A line longer than 42 characters, counting only visible text. Reported only, not rewritten. 42 characters, fixed, server/src/utils/subtitleQuality.ts:22, client/src/lib/srtHealth.ts:324 Re-breaking lines is done in Fix Subtitles.
fast-reading SRT, VTT A cue that needs more than 20 characters per second to read. A line break counts as one space. Reported only, not rewritten. 20 characters per second, fixed, server/src/utils/subtitleQuality.ts:23, client/src/lib/srtHealth.ts:330 Giving the cue more time is done in Fix Subtitles.
mojibake SRT, VTT Garbled accents and punctuation such as "é" for "é", from a file read in the wrong encoding. Restores the original characters, but only when every character maps back exactly. Otherwise reported only. Fixed rule, client/src/lib/srtHealth.ts:137, client/src/lib/srtHealth.ts:392 Text that cannot be recovered exactly stays as it is.
replacement-char SRT, VTT Characters already lost and shown as "�". Reported only, not rewritten. Fixed rule, client/src/lib/srtHealth.ts:400 The letters are not in the file. Retype them from the source.
vtt-structure VTT A block that cannot be read as a cue, such as missing or unreadable timing. Reported only, not rewritten. Fixed rule, client/src/lib/srtHealth.ts:427 Fix the block by hand.
File encoding notice SRT, VTT A file saved as Windows-1252 or UTF-16 rather than UTF-8. Reported as a notice. The file is read in its real encoding. Fixed rule, client/src/lib/srtHealth.ts:84 None.

Fix Subtitles checks and fixes

Fix Subtitles reads the file, applies the options you choose, writes the file back in its original format, then checks the written file again. A problem that is still in the written file is reported as not fixed (server/src/services/subtitles.ts:1501).

Two options control most rows. Fix timing and Line breaks are on by default; Grammar & spelling and Remove filler words are off by default (client/src/lib/fixSubtitleDefaults.ts:3, client/src/lib/fixSubtitleDefaults.ts:4, client/src/lib/fixSubtitleDefaults.ts:5, client/src/lib/fixSubtitleDefaults.ts:6). You can switch each one on or off before a fix (client/src/pages/FixSubtitlesV6.tsx:944, client/src/pages/FixSubtitlesV6.tsx:945).

Check or fix (code name) Formats What is detected What the fixer does Threshold or setting Limitation or what stays manual
Simultaneous cues (overlap) SRT, VTT Two cues that start within 0.1 seconds of each other and overlap. With Fix timing on, combines them into one cue so neither line is lost, and drops an exact duplicate. Off: reported only, not rewritten. 0.1 seconds, fixed, server/src/services/subtitles.ts:94, server/src/services/subtitles.ts:488 A combined cue that is too fast to read is reported.
End at or before start (invalid_timing) SRT, VTT A cue whose end time is at or before its start time. Always repaired, whatever the options: the end is set 1.5 seconds after the start with Fix timing on, or 0.5 seconds with it off, and never past the next cue. 1.5 and 0.5 seconds, fixed, server/src/services/subtitles.ts:86, server/src/services/subtitles.ts:88, server/src/services/subtitles.ts:532 Reported as not fixed when the cue cannot get a readable time before the next cue.
Overlap (overlap) SRT, VTT A cue that runs into a later cue, including one that sits entirely inside it. Only with Fix timing on: ends the earlier cue 0.1 seconds before the next one starts, or at its start if there is no room. Off: reported only, not rewritten. Gap 0.1 seconds, fixed, server/src/services/subtitles.ts:92. The option is user-configurable, server/src/services/subtitles.ts:1458 Not trimmed when a cue of more than 20 characters would be left under 1 second or over 40 characters per second (server/src/services/subtitles.ts:144, server/src/services/subtitles.ts:145, server/src/services/subtitles.ts:147); that overlap is reported.
Long line (long_line) SRT, VTT A line over 42 visible characters. With Line breaks on, re-wraps the text at word boundaries onto at most two balanced lines of 42 characters; a cue that still does not fit is split into more cues. Off: reported only, not rewritten. 42 characters, two lines, fixed, server/src/utils/subtitleQuality.ts:22, server/src/services/subtitles.ts:223. The option is user-configurable, server/src/services/subtitles.ts:1459 A single word longer than 42 characters stays as it is and is reported; words are never hyphenated (server/src/services/subtitles.ts:183).
Line breaks (line_break) SRT, VTT A cue with more than two lines, each within 42 characters. With Line breaks on, splits it into cues of at most two lines. Off: not changed. Two lines, fixed, server/src/services/subtitles.ts:226 None.
Too long on screen (long_duration) SRT, VTT A cue on screen for more than 10 seconds. With Fix timing on, shortens it to 10 seconds. Off: not changed or reported. 10 seconds, fixed, server/src/services/subtitles.ts:90, server/src/services/subtitles.ts:695 None.
Reading speed (fast_reading) SRT, VTT A cue that needs more than 20 characters per second, or a cue of more than 20 characters on screen for under 1.5 seconds. With Fix timing on, also any cue under 0.5 seconds. With Fix timing on, extends the end time until the cue reads at 20 characters per second, stopping 0.1 seconds before the next cue, at 10 seconds on screen, and at the end of the video when one was added. When the 10-second cap is what stops it and there is room after it, the words are split into two cues. Off: reported only, not rewritten. 20 characters per second, fixed, server/src/utils/subtitleQuality.ts:23; 10 seconds, server/src/services/subtitles.ts:90; server/src/services/subtitles.ts:85, server/src/services/subtitles.ts:86, server/src/services/subtitles.ts:88, server/src/services/subtitles.ts:722, server/src/services/subtitles.ts:748 When the next cue leaves no room, the cue is reported with how long it needs. Shorten or split it by hand.
Shift all cues SRT, VTT Not a check. Moves every cue by the number of milliseconds you enter; negative is earlier. Applies the shift before the other timing fixes. Only with Fix timing on. Up to one hour either way, user-configurable, client/src/lib/fixSubtitleDefaults.ts:13, client/src/pages/FixSubtitlesV6.tsx:257, server/src/services/subtitles.ts:473 Times that would go below zero stop at zero.
Large gap (large_gap) SRT, VTT More than 5 seconds of silence between two cues. Reported only, not rewritten. 5 seconds, fixed, server/src/services/subtitles.ts:96, server/src/services/subtitles.ts:809 Filling a gap would mean inventing dialogue.
Check against your video (unverified_timing) SRT, VTT A cue extended past its original end with no later cue and no video to confirm the new end time. Keeps the change and reports it. Fixed rule, server/src/services/subtitles.ts:1675 Check the end time against your video.
Positioned or identified cues SRT, VTT Cues with VTT cue settings or cue identifiers, or SRT position coordinates (X1:…), which can legally overlap. Their layout and timing are kept: overlap, line-break and timing changes are not applied. Problems are reported. Fixed rule, server/src/services/subtitles.ts:449 Review these cues by hand.
Grammar & spelling SRT, VTT Spelling, casing and punctuation. Off by default. When on, corrects spelling, casing and punctuation. If the correction service is unavailable, the cues it missed are listed. User-configurable, client/src/pages/FixSubtitlesV6.tsx:974, server/src/services/subtitles.ts:1450, server/src/services/subtitles.ts:1486 It does not check meaning.
Remove filler words SRT, VTT Hesitation sounds (um, uh, erm, hmm), and words such as "like" or "you know" when set off by commas. Off by default. When on, removes them. Keeps "uh-huh" and "mm-hmm", and keeps "like" in "I like it". User-configurable, client/src/pages/FixSubtitlesV6.tsx:975, server/src/services/subtitles.ts:989, server/src/services/subtitles.ts:994 None.
Text changed (text_changed) SRT, VTT With Grammar & spelling and Remove filler words both off, the written file does not contain the same words as the upload. Reported for review. Fixed rule, server/src/services/subtitles.ts:1562 Review the text before publishing.
Scene cut (scene_cut) SRT, VTT A cue that spans a scene cut in the source video. Needs the video. Reported only, not rewritten. Fixed rule, server/src/services/subtitles.ts:382 Split or retime the cue by hand.
Timing drift (timing_drift) SRT, VTT Cues timed on the wrong frame rate, a constant offset, or cues that run past the end of the video. Needs the video. Reported. Times move only if you turn on Re-sync to audio. Re-sync is user-configurable, client/src/pages/FixSubtitlesV6.tsx:971, server/src/services/subtitleDrift.ts:192, server/src/services/subtitles.ts:1426 Without a video, drift is not checked.

A "Check only" run on Fix Subtitles uses the same checks with Fix timing and Line breaks on, unless you switch them off, and writes no file (server/src/services/fixSubtitlesMode.ts:4, server/src/workers/videoProcessor.ts:1217, server/src/workers/videoProcessor.ts:1221).

What a guest, a free account and Pro each see

These are the Fix Subtitles plan differences in the code. The Subtitle Validator needs no account, and its download carries no watermark (client/src/components/SubtitleHealthChecker.tsx:293).

  • Guest. You can check a file or start a fix without an account (server/src/services/fixSubtitlesMode.ts:41). The result is held back: you see counts about the file, such as how many cues changed and how many still need you, not the list of findings, and there is no download (server/src/services/guestPreview.ts:22, server/src/services/jobView.ts:243).
  • Free account. You see every finding, and can fix the file and download it (client/src/pages/FixSubtitlesV6.tsx:1246). Free SRT and VTT downloads carry two short watermark cues, one at the start and one after the last cue (server/src/routes/download.ts:172, server/src/utils/watermark.ts:105, server/src/utils/watermark.ts:116).
  • Pro. No watermark, cue editing, and PDF and Word export (client/src/pages/FixSubtitlesV6.tsx:810, client/src/pages/FixSubtitlesV6.tsx:293, client/src/pages/FixSubtitlesV6.tsx:847, client/src/pages/FixSubtitlesV6.tsx:860).

What it does not do

  • The validator never changes the text of a cue, never moves a start time, and changes an end time only to trim an overlap or close a gap you asked it to close. It checks this on every repair and stops instead of producing a file if any of it breaks (client/src/lib/srtHealth.ts:541).
  • The validator does not re-break lines or give fast captions more time. Those are Fix Subtitles fixes.
  • The validator does not rewrite VTT files (client/src/lib/srtHealth.ts:464).
  • Fix Subtitles does not fill silences between cues (server/src/services/subtitles.ts:809).
  • Fix Subtitles does not hyphenate a word to make it fit a line (server/src/services/subtitles.ts:183).
  • Without the source video, neither tool can check sync, scene cuts or drift (server/src/services/subtitleDrift.ts:196).
  • Neither tool checks whether the words or the translation are right. See what stays manual.

Limits

  • File size, Subtitle Validator: 20 MB (client/src/lib/srtHealth.ts:130, client/src/components/SubtitleHealthChecker.tsx:274).
  • File size, Fix Subtitles: 20 MB on every plan (server/src/utils/subtitleLimits.ts:18, client/src/pages/FixSubtitlesV6.tsx:90).
  • Formats, Subtitle Validator: .srt, .vtt and .txt files, or pasted text. A file that starts with WEBVTT is read as VTT; anything else is read as SRT (client/src/components/SubtitleHealthChecker.tsx:336, client/src/lib/srtHealth.ts:201). The repair writes SRT only.
  • Formats, Fix Subtitles: .srt and .vtt. The fixed file keeps the format you uploaded (client/src/pages/FixSubtitlesV6.tsx:91, server/src/services/subtitles.ts:1497).
  • Cue length on screen, Fix Subtitles: 10 seconds per cue with Fix timing on (server/src/services/subtitles.ts:90).
  • Shift all cues: up to one hour either way (client/src/lib/fixSubtitleDefaults.ts:13).

Worked examples

Each example below is the real output of the code for the input shown. A test runs the same input through the same code and checks that the output on this page still matches.

Example 1: Subtitle Validator repair of an SRT file

Input:

1
00:00:01.000 --> 00:00:04.000
Welcome back to the channel.
2
00:00:03,500 --> 00:00:06,000
Today we look at subtitle files.

The validator reports a timing line with a dot instead of a comma, a missing blank line before cue 2, and an overlap: cue 1 runs 0.5 seconds into cue 2. Trimming cue 1 leaves it on screen for 2.5 seconds, which is above both limits, so the overlap is repaired.

Output:

1
00:00:01,000 --> 00:00:03,500
Welcome back to the channel.

2
00:00:03,500 --> 00:00:06,000
Today we look at subtitle files.

Changes listed by the validator:

Rewrote timing lines in standard SRT format (HH:MM:SS,mmm --> HH:MM:SS,mmm). No times changed.
Added 1 missing blank line between cues.
Cue 1: end moved from 00:00:04,000 to 00:00:03,500 so it no longer overlaps cue 2.

Example 2: Fix Subtitles with Fix timing and Line breaks on

Input:

1
00:00:01,000 --> 00:00:02,000
This caption has far too many words to read in only one second on screen.

2
00:00:08,000 --> 00:00:10,000
Next line.

Output:

1
00:00:01,000 --> 00:00:04,650
This caption has far too many words
to read in only one second on screen.

2
00:00:08,000 --> 00:00:10,000
Next line.

The 73-character line is re-wrapped onto two lines, and the cue is extended to 3.65 seconds so it reads at 20 characters per second. With both options off, the same file is returned unchanged and both problems are reported as not fixed.

Example 3: Subtitle Validator on a VTT file

Input:

WEBVTT

00:00:01.000 --> 00:00:04.000
First line runs long.

00:00:03.000 --> 00:00:05.000
Second line.

The validator reports that cue 1 runs 1 second into cue 2. The file is not rewritten. Asking the repair to run on it fails with this reason:

The one-click repair works on SRT files.

Convert the file to SRT first, or use Fix Subtitles, which keeps the VTT format.

Related guides