Move every cue earlier or later by a fixed number of milliseconds to fix sync
The tool loads here. It needs JavaScript, because the work happens on your device.
Your files and your privacy
Your caption file is read and retimed inside this browser tab and is never uploaded, which
matters because subtitle files often contain dialogue that has not been released. The
page’s Content-Security-Policy limits connect-src to this origin, and Clear data discards
the cues immediately.
What this tool does
Add one offset to the start and end of every cue in an SRT or VTT file, the fix for
captions that are out by the same amount throughout. The offset is in milliseconds and may
be negative; timestamps are clamped at zero and you are told how many cues that affected.
Shifting adds the same offset to the start and the end of every cue, which is the correct
fix when captions are wrong by a constant amount from the first line to the last. A
positive number of milliseconds delays the subtitles, a negative number moves them
earlier. Cue text, order and length are otherwise untouched, and the file is re-validated
afterwards, so an overlap or a zero-length cue caused by the shift is reported by cue
number.
How to use it
Load your .srt or .vtt file, then note where a line near the start is spoken and where
it appears.
Check a line near the end too: if both are out by the same amount a shift is right, and
if the error has grown, scale instead.
Enter the difference in milliseconds. Two seconds is 2000, and a negative value moves
the subtitles earlier.
Select Shift and read the message, which reports how many cues were clamped to 00:00:00.
Check the validation panel, then download as SRT or VTT. Undo reverses the shift
exactly.
Example use cases
Captions that appear about two seconds after the dialogue, consistently, for a whole
film.
A file timed against a release with a distributor logo at the front, played against a
version without it.
Nudging a lecture transcript earlier so a line is on screen as the speaker starts it.
Supported input and output
Accepts
SubRip (.srt) and WebVTT (.vtt) text files, read as UTF-8
An offset in milliseconds, positive to delay or negative to advance
Produces
SubRip (.srt) carrying the shifted timings, renumbered from 1
WebVTT (.vtt) carrying the shifted timings
What this tool will not do
The offset is in milliseconds. There is no seconds field and no timecode field, so two
seconds has to be entered as 2000.
A shift applies to every cue in the file; there is no way to retime a selected range.
Timestamps are clamped at zero, because neither format can express a negative time.
Clamping loses information: shifting forward afterwards does not restore the pinned
cues, so undo instead.
A clamped cue can end with the same start and end time, which validation reports as a
zero-duration cue; a cue whose start alone was clamped becomes longer.
A constant shift cannot correct drift. If the error grows through the file, use the
scale factor beside it, which multiplies every timestamp from zero — about 1.0427 for
23.976 fps material played at 25 fps.
Undo holds the last 20 operations, and the whole file stays in this tab. The 10 MB size
check is skipped for anything named .srt or .vtt, so an oversized file loads and blocks
the page rather than being refused.
Common mistakes
Entering seconds instead of milliseconds. Typing 2 shifts the file by two milliseconds:
the operation succeeds, the file really did change, and the sync looks as wrong as
before.
Getting the sign the wrong way round. Captions that appear before the dialogue need a
positive offset to delay them; a negative offset moves them earlier still.
Applying a shift to a file that is drifting. Lining up the first line makes the last
line worse, and both operations have to be undone before scaling.
Dismissing the clamp warning. Those cues sit at 00:00:00 permanently, and each attempt
to fine-tune the offset pins more cues on top of them.
Technical notes
Cues are held as integer milliseconds from zero, so a shift is a single addition per
timestamp and introduces no rounding of its own. Both ends are floored at zero, and a cue
counts as clamped when either end would have gone negative, which is exactly what the
warning reports — staying silent would hand back a file that looks correct and is not.
Validation re-runs after every change and names each affected cue, flagging one that ends
before it starts, one out of order, a zero-duration cue and an overlap. Scaling is a
separate operation, because frame-rate error is proportional to elapsed time and no
addition corrects it.
Frequently asked questions
Can I enter a negative offset?
Yes. A negative number moves every cue earlier, which is what you want when the captions
lag behind the dialogue. No timestamp may go below zero, so any cue that would have is
pinned to 00:00:00 and reported.
What does the clamping warning mean?
You shifted backwards by more than some cue’s start time. Rather than write a negative
timestamp, which neither format can represent, those cues were pinned to 00:00:00 and
counted. If the count is more than one or two, the offset is too large and you should
undo rather than adjust.
Should I shift or scale?
Shift when a line near the start and a line near the end are out by about the same
amount. Scale when the error grows as the video plays, which means a frame-rate
mismatch: 25 divided by 23.976 is roughly 1.0427, and the reverse is roughly 0.959.