What is inside a VTT file
WebVTT is a plain-text format for timed text that plays with video and audio on the web. A file has the .vtt extension and the text/vtt media type, and it must be saved as UTF-8. Here is a complete, valid file with two cues:
WEBVTT
00:00:01.000 --> 00:00:04.200
Welcome back to the workshop.
00:00:04.200 --> 00:00:07.500
Today we are fixing subtitle timing.
The parts, in order:
- The header. The first line is
WEBVTT. It may be followed by a space and a short description, and then at least one blank line. - Cues. Each cue is a block separated from the next by a blank line. A cue can start with an identifier on its own line, such as a number or a name; it is optional.
- The timing line. A start time, the arrow
-->and an end time. Times are written as hours, minutes, seconds and milliseconds,00:01:15.250, or without the hours,01:15.250. A period comes before the milliseconds, and the end must come after the start. - The text. One or more lines shown while the cue is on screen. A blank line ends the cue, so never leave one inside a cue's text.
Cues may overlap, for example to show two speakers at once. Comment blocks start with NOTE and are ignored by players.
Styling and positioning
WebVTT can do more than plain subtitles. Cue settings after the timing line place the text: line sets the vertical position, position and size set the horizontal position and width as percentages, align sets alignment, and vertical turns text vertical for some Asian languages. This timing line puts a cue near the top, on the left:
00:05.000 --> 00:09.000 line:0 position:20% size:60% align:start
Inside the text, a few tags mark up words: <i> for italics, <b> for bold, <u> for underline, <c.name> for a CSS class, and <v Bob> to mark who is speaking. STYLE blocks near the top of the file style the cues with the ::cue selector. Because tags start with <, the text itself cannot contain <, & or the arrow -->. Write them as character references instead: an ampersand followed by lt; for <, and by amp; for &.
How to open and use a VTT file
To read or edit it, open it in any plain-text editor. Keep the WEBVTT line, keep one blank line between cues, and save it as UTF-8 with the .vtt extension.
On a web page, a <track> element inside the <video> element attaches it. Its kind says how the text is meant to be used: subtitles (the default) for dialogue, captions for dialogue plus sounds and music cues, descriptions, chapters or metadata. A subtitles track also needs srclang, the language of the text, such as en. The file normally has to come from the same site as the page; a caption file on another domain needs cross-origin permission.
In video players and editors, look for an option to add or import a subtitle or caption track and choose the file. Many tools accept both VTT and SRT.
VTT vs SRT
| VTT | SRT | |
|---|---|---|
| First line | WEBVTT |
The first cue's number |
| Cue numbers | Optional identifiers | Required, counting up from 1 |
| Time format | 00:00:01.000, period before milliseconds |
00:00:01,000, comma before milliseconds |
| Hours in times | Optional | Always written |
| Positioning and styling | Cue settings, STYLE blocks, speaker tags |
A few tags such as bold and italic, where the player supports them |
| Text encoding | UTF-8 required | No standard; UTF-8 is the safe choice |
| Typical use | Web video players | Video editors and upload forms |
To turn an SRT file into VTT by hand, add WEBVTT and a blank line at the top, and change the comma before the milliseconds to a period in every timing line. The SRT cue numbers can stay; WebVTT reads them as identifiers. For the SRT side of the table, see what is an SRT file.
Make a VTT file from a video
- Open the subtitle generator and choose the video, or an audio file.
- Check the captions over the picture, click any word to hear it, and fix names and misheard words.
- Choose VTT in the export menu and download.
StemVocal's VTT files start with WEBVTT, write every time with hours and milliseconds, and leave out cue numbers and speaker names. Each cue lasts at most 6 seconds, holds at most 80 characters, splits into two balanced lines when it runs past 42, and never overlaps the next. Recordings up to 30 minutes are free, with 2 free StemVocal jobs each UTC day; longer files, up to 3 hours, use credits.
Already have a VTT file? If every caption is early or late by the same amount, the subtitle timing tool shifts every cue and keeps the file's format. To change the language, the subtitle translator translates it and can download the result as VTT or SRT.
When captions do not appear
- The first line is not exactly
WEBVTT, or something comes before it. - A timing line uses a comma, as SRT does, instead of a period.
- A blank line inside a cue's text cuts the cue short.
- The text contains a bare
<or&. - The file was saved in another encoding instead of UTF-8, so accented letters break.
- On a web page, the track has no
srclang, or the file is on another domain without cross-origin permission.
Sources: MDN Web Docs, "Web Video Text Tracks Format (WebVTT)" and "The Embed Text Track element"; Library of Congress, "SubRip Subtitle format (SRT)". Checked October 11, 2026.
Good to know
How do I open a VTT file?
Any text editor opens it, because it is plain text. Video players and editors that support WebVTT load it as a subtitle track, and on a web page the track element attaches it to a video.
What is the difference between VTT and SRT?
Both hold timed text. A VTT file starts with WEBVTT, uses a period before the milliseconds and supports positioning and styling. An SRT file numbers every cue and uses a comma before the milliseconds.
How do I make a VTT file from a video?
Upload the video to the subtitle generator, correct the words, choose VTT in the export menu and download it. Recordings up to 30 minutes are free, with 2 free StemVocal jobs a day.
Can I translate a VTT file?
Yes. The subtitle translator translates SRT and VTT files between English and 15 languages and keeps every cue's timing. It is machine translation, so review it before you publish.
Why don't my VTT captions show?
Check that the first line is WEBVTT, that every timing line uses a period before the milliseconds, that no blank line splits a cue, and that the file is saved as UTF-8. On a web page, a caption file on another domain also needs cross-origin permission.