Updated August 1, 2026

What Is a VTT File? WebVTT Format & How to Open .vtt Files

VTT stands for Web Video Text Tracks (commonly called WebVTT) — a W3C-standardized plain-text subtitle file for HTML5 web video. It's the format the HTML5 <track> element officially uses, and it's Apple HLS's subtitle format of choice. Below: the acronym meaning, .vtt file structure, how to open VTT files, format comparison to SRT/ASS/SCC/TTML, and three ways to create one.

Key takeaways

  • VTT = Web Video Text Tracks (WebVTT). A W3C-standardized plain-text subtitle file for HTML5 web video via the <track> element.
  • File structure: WEBVTT header + cues. Line 1 must be the literal “WEBVTT”, then a blank line, then each cue: optional identifier, timecode (HH:MM:SS.mmm --> HH:MM:SS.mmm), caption text, blank line separator.
  • Origin: W3C, drafted 2010. Designed as a modernization of SRT for browsers — adding a required header, styling support, cue positioning, and a formal specification SRT never had.
  • Primary use: HTML5 web video. The only officially supported subtitle format in the HTML5 spec, plus Apple HLS streaming subtitle segments. Video.js, Plyr, Shaka Player all expect VTT.
  • Open with any text editor. Notepad, TextEdit, VS Code all handle .vtt files. Subtitle Edit and Aegisub give proper sync editing.
  • VTT vs SRT: period vs comma + WEBVTT header + styling. Trivial to convert either direction. Use VTT for HTML5 web video; use SRT for YouTube uploads, video editors, and universal delivery.

What does VTT stand for?

VTT stands for Web Video Text Tracks — the full format name is WebVTT. In writing, both “VTT file” and “WebVTT file” refer to the same thing; .vtt is the filename extension you save it as. The format was drafted by the W3C in 2010 as part of the HTML5 effort, evolving from an earlier WHATWG proposal originally called WebSRT (Web Subtitle Resource Tracks). It reached W3C Candidate Recommendation status and is now the format the HTML5 <track> element officially uses.

Source: W3C WebVTT: The Web Video Text Tracks Format (verified August 2026).

VTT file definition and meaning

A VTT file is a plain-text subtitle and caption file that stores captions and their timing information for web video. The file has a .vtt extension, must start with the literal string WEBVTT on its first line, and pairs each caption with a start and end timecode that tells the video player when to show it. Unlike SRT, VTT supports basic CSS-like styling, cue positioning, and metadata payloads — features that browsers need for accessible, responsive web video.

Multiple VTT files (one per language) work identically alongside a video — .vtt files in plural are the standard delivery format for multi-language HTML5 subtitle tracks (movie.en.vtt, movie.es.vtt, movie.fr.vtt), each attached via its own <track> element.

Beyond captions and subtitles, WebVTT also carries chapters (kind="chapters") and metadata payloads (kind="metadata") — a single file format serving multiple text-track roles in the HTML5 spec. If you have a plain SRT file and need a VTT, the conversion is two find-and-replace edits away.

WebVTT format and structure — .vtt anatomy

Every VTT file has this shape: a header line, a blank line, then one or more cues. Each cue has:

  1. Optional cue identifier — any text on a line before the timecode arrow. Used to reference the cue from CSS or JavaScript. Skippable.
  2. Timecode line — in the format HH:MM:SS.mmm --> HH:MM:SS.mmm. The period before milliseconds is the WebVTT rule (SRT uses a comma). Optional cue settings can follow (position, alignment, line, size).
  3. Caption text — one or more lines of caption text. Supports inline styling tags (<i>, <b>, <c.className>).
  4. Blank line — separates this cue from the next.

Working example (3 cues)

WEBVTT

1
00:00:00.000 --> 00:00:03.500
Welcome to the tutorial.

2
00:00:03.500 --> 00:00:07.200
Today we're looking at the
WebVTT subtitle file format.

3
00:00:07.200 --> 00:00:11.000 line:90%
The format is simple — the
quirks are where the file breaks.

Copy this into any text editor, save as example.vtt with UTF-8 encoding, and it's a valid WebVTT file you can attach to an HTML5 <track> element or drop into VLC.

The line:90% on cue 3 is a cue setting — it positions the caption at 90% down the video frame. WebVTT supports position, line, size, align, and vertical settings after the timecode. SRT has none of this. For the deep dive on subtitle formats generally, see what is an SRT file.

Origin — where WebVTT came from

WebVTT emerged from a specific problem: by 2010, HTML5 had introduced the <video> element, but there was no standard way to attach captions to browser-rendered video. The dominant subtitle format at the time — SRT — was widely used but never formally specified; each parser handled edge cases differently. Browsers needed a real spec.

The WHATWG initially proposed a format called WebSRT (Web Subtitle Resource Tracks) — essentially SRT with a required header and formal grammar. The proposal was refined by the W3C into WebVTT, renamed to reflect that the format serves multiple text-track roles beyond subtitles (captions, chapters, descriptions, metadata). The first public working draft appeared in 2010; the specification advanced through W3C Candidate Recommendation status over the following years.

Three things drove adoption. First, the HTML5 <track> element officially uses WebVTT — every browser vendor implemented it. Second, Apple adopted WebVTT for HLS streaming subtitle segments, giving it a major distribution role beyond the browser. Third, modern web video players (Video.js, Plyr, Shaka Player, hls.js) all expect VTT as their default subtitle format.

Today WebVTT is the web's answer to what SRT is for creator tools — the universal option in its context. Its parent, SRT, remains dominant everywhere else. Neither has replaced the other; they coexist because they optimize for different delivery paths.

What VTT files are used for

Six common workflows for VTT files in 2026:

HTML5 <track> element

The HTML5 <video><track kind="subtitles" src="captions.vtt" srclang="en"></video> pattern is the browser-native way to attach captions. WebVTT is the only format officially supported by the HTML5 spec here.

HLS streaming subtitle segments

Apple's HLS protocol supports segmented WebVTT files delivered alongside audio and video segments in an HLS playlist. Widely used in modern streaming players (Video.js, Shaka Player, hls.js).

Web accessibility (WCAG 2.1)

WCAG 2.1 Level A requires captions on prerecorded video. A properly delivered VTT via the <track> element satisfies this for self-hosted HTML5 web video without needing external players.

Video.js, Plyr, Shaka Player

Modern web video frameworks expect WebVTT for their subtitle APIs. Uploading a VTT to your CDN and pointing the player at it is the standard integration.

Chapters and metadata tracks

HTML5 <track> supports kind="chapters" and kind="metadata" — both use WebVTT syntax. Chapters let viewers jump between named sections; metadata tracks carry JSON payloads synced to video time.

YouTube upload (also accepts SRT)

YouTube Studio → Subtitles → Upload file accepts both .srt and .vtt with timing. No SEO advantage for either — pick whichever your workflow produces.

VTT vs SRT vs ASS vs SCC vs TTML

WebVTT is one of several subtitle formats — each optimized for a different delivery context. Here's where each fits.

WebVTT (.vtt)

2010 (W3C draft), Candidate Rec.

Timecode

HH:MM:SS.mmm (period)

Styling

CSS-like styling, positioning, cue metadata

Supports: HTML5 <track> element, HLS streaming, modern web video

Best for: HTML5 web video, browser-native subtitles, HLS caption tracks

SRT (SubRip)

~2001-2002 (from SubRip DVD tool)

Timecode

HH:MM:SS,mmm (comma)

Styling

None

Supports: YouTube, Premiere, DaVinci, CapCut, VLC, virtually every platform

Best for: Universal subtitle delivery, YouTube uploads, video editor timelines

SSA / ASS

SSA 1998, ASS 2003

Timecode

H:MM:SS.cc (centiseconds)

Styling

Full styling — fonts, colors, positions, karaoke effects

Supports: Aegisub, MPV, VLC, anime players

Best for: Anime fansubs, karaoke, precise styling control

SCC (Scenarist)

1990s (US broadcast)

Timecode

Binary CEA-608 encoding

Styling

Broadcast-specific (position, italics, colors)

Supports: US broadcast delivery pipelines, professional caption software

Best for: US FCC-compliant broadcast captions

TTML / IMSC1.1

TTML 2010, IMSC 2016 (W3C)

Timecode

XML-based, multiple options

Styling

Extensive XML styling model

Supports: Netflix, streaming OTT delivery

Best for: Streaming platform delivery (Netflix uses IMSC1.1)

Practical rule of thumb: VTT for HTML5 web video; SRT for almost everything else. Use ASS for karaoke or precise styling control (anime fansubs). Use SCC or TTML/IMSC only if you're shipping to US broadcast or Netflix respectively. For the legal and accessibility framing around when captions are required, see captions vs subtitles.

How to open VTT files (viewers, editors, and text editors)

VTT files are plain text — any text editor opens them.

Text editors (any OS)

  • Notepad (Windows built-in)
  • TextEdit (Mac built-in — Format → Make Plain Text first)
  • VS Code (cross-platform, free)
  • Sublime Text (cross-platform)
  • gedit (Linux)
  • vim, nano (terminal-based)

Subtitle editors (proper tools)

  • Subtitle Edit (Windows, free, MIT license) — best all-around VTT editor with waveform sync and validation
  • Aegisub (cross-platform, free, BSD license) — advanced timing, originally built for ASS but handles VTT
  • Jubler (Java, free) — cross-platform alternative
  • VLC — will play a VTT alongside a matching video (same folder, same base filename)

If double-clicking a VTT launches a media player, that's because the player is trying to load the file as a subtitle track. To edit the VTT text itself, right-click → Open With → choose a text editor.

How to create a VTT file

Three creation paths, ordered fastest to slowest:

1. AI generation (fastest — 5-15 minutes per video hour)

Upload audio or video to a modern AI transcription tool — VexaScribe, Descript, Rev AI, or comparable. Whisper Large-v3 produces timestamps automatically at 90-95% accuracy on clean audio. Most generators export both SRT and VTT from the same transcription pass — no separate step needed for VTT specifically.

2. Free desktop tools (medium — 30-60 minutes per video hour)

Subtitle Edit (Windows) or Aegisub (cross-platform) give you waveform sync, syntax checking, and reading-speed enforcement. Both export WebVTT via File → Save As → WebVTT (.vtt). Best when you want free tools with professional control or you're translating existing captions.

3. Manual in a text editor (slowest — 2-4 hours per video hour)

Type the WebVTT format directly in Notepad, TextEdit, or VS Code. Start with WEBVTT on line 1, then a blank line, then each cue. Zero cost, deep control, very slow. Best only for tiny files (under 5 minutes) or when learning the format hands-on.

Convert between VTT and SRT

Both directions are trivial — the formats are close cousins.

VTT → SRT

  1. Delete the WEBVTT header line at the top.
  2. Delete any STYLE, NOTE, or REGION blocks.
  3. Find-and-replace: . in timecodes → , (only the ms separator).
  4. Save with .srt extension and UTF-8 encoding.
  5. Styling, positioning, and cue settings will be stripped — SRT can't represent them.

SRT → VTT

  1. Add WEBVTT on line 1, then a blank line.
  2. Find-and-replace: , in timecodes → . (only the ms separator).
  3. Save with .vtt extension and UTF-8 encoding.
  4. All content preserved; the VTT stays styling-free unless you add cue settings later.

For a client-side conversion that runs in your browser (no upload), use our VTT to SRT converter — it reports honestly what got stripped in the process.

Common WebVTT quirks that trip people up

Four things that break VTT files in practice:

Missing WEBVTT header

The literal string WEBVTT must be on line 1, with a blank line after it before the first cue. Missing this header — the most common VTT authoring mistake — makes strict browsers reject the whole file. This is the biggest structural difference from SRT.

Period vs comma in timecodes

WebVTT uses a period before milliseconds (00:01:23.500). SRT uses a comma (00:01:23,500). Getting this wrong is the #1 way VTT files break in HTML5 <track> — the browser silently skips cues.

UTF-8 encoding required

The W3C spec mandates UTF-8. Windows Notepad's default (ANSI / Windows-1252) breaks accented characters and non-Latin scripts and technically makes the file invalid. Always save with UTF-8. Notepad: File → Save As → Encoding: UTF-8. VS Code uses UTF-8 by default.

CORS headers when served remotely

When an HTML5 <track> loads a VTT from a different origin than the page, the server must send Access-Control-Allow-Origin. Otherwise the browser blocks the file silently and no captions appear. Also set the MIME type to text/vtt.

Frequently asked questions

What does VTT stand for?

VTT stands for Web Video Text Tracks — commonly written as WebVTT. It's a W3C-standardized subtitle and caption format designed specifically for HTML5 web video via the <track> element. First drafted around 2010 as a modernization of SRT, WebVTT became a W3C Candidate Recommendation and is the format the HTML5 spec requires for browser-native captions. The .vtt file extension is the standard extension; WebVTT is the format name and .vtt is the filename you save it as.

What is a VTT file used for in practice?

Three main workflows. (1) HTML5 web video: the <video> element's <track kind="subtitles" src="captions.vtt"> loads a VTT file for browser-native captions — this is the only officially supported HTML5 subtitle format. (2) HLS streaming: Apple's HLS protocol uses WebVTT for segmented subtitle tracks in HLS playlists. (3) Video accessibility: VTT is what modern web frameworks (Video.js, Plyr, Shaka Player) expect for WCAG 2.1 caption compliance. For non-web workflows (YouTube upload, Premiere, DaVinci), SRT is more universally accepted — but many modern platforms accept both.

What's the difference between VTT and SRT?

Four key differences. (1) Timecode separator: VTT uses a period before milliseconds (00:01:23.500); SRT uses a comma (00:01:23,500). (2) File header: VTT files must start with the literal "WEBVTT" on the first line; SRT has no header. (3) Styling: VTT supports CSS-like styling, cue positioning, and metadata; SRT is styling-free. (4) Delivery context: VTT is HTML5's official caption format; SRT is universal across YouTube, video editors, and desktop players. For HTML5 web video use VTT; for creator workflows use SRT.

How do I open a VTT file?

Any text editor. VTT files are plain text — Notepad on Windows, TextEdit on Mac (Format → Make Plain Text first), VS Code, Sublime, vim, or nano will open them. For proper subtitle editing with sync verification, use Subtitle Edit (Windows, free) or Aegisub (cross-platform, free). If double-clicking a VTT file launches a media player instead, the player is trying to load it as a subtitle track; right-click → Open With → choose a text editor to edit the text itself.

How do I create a VTT file?

Three paths. (1) AI generation (fastest): upload audio or video to VexaScribe, Descript, or Rev — a valid VTT drops out in minutes at 90–95% accuracy. (2) Free desktop tools: Subtitle Edit or Aegisub let you time captions against a waveform, then export → WebVTT (.vtt). (3) Manual in a text editor: type WEBVTT on the first line, add a blank line, then cue after cue in the format "00:00:00.000 --> 00:00:03.500\nCaption text\n\n" — save with .vtt extension and UTF-8 encoding. See our SRT generator (outputs both SRT and VTT).

What's the WebVTT file format structure?

Each file starts with the literal "WEBVTT" on line 1, then a blank line, then one or more cues. Each cue has: (1) an optional cue identifier line (any text before the arrow), (2) a timecode line in HH:MM:SS.mmm --> HH:MM:SS.mmm format with optional cue settings after the second timecode, (3) the caption text on one or more lines, and (4) a blank line separator. Cue settings can control position, alignment, line, and size. Save with .vtt extension and UTF-8 encoding.

Can I convert VTT to SRT?

Yes, and both directions are trivial. Manual VTT→SRT: open in text editor, delete the WEBVTT header line and any styling blocks, use find-and-replace to change every "." in timecodes to ",", save as .srt. Automated conversion: our client-side VTT to SRT converter handles it in-browser (no upload). Subtitle Edit also handles it via File → Save as → SubRip (.srt). Converting from VTT to SRT will strip any styling, positioning, or metadata — SRT can't represent those.

Is VTT the same as WebVTT?

Yes — WebVTT is the format name, .vtt is the filename extension. "VTT file" and "WebVTT file" are the same thing. The W3C specification calls the format WebVTT (Web Video Text Tracks); the filename is customarily .vtt to keep it short. In writing, both are accepted; in the spec text, WebVTT is preferred for the format and .vtt for file references.

What character encoding should a VTT file use?

UTF-8 — required by the W3C spec. WebVTT files are always UTF-8 encoded; unlike SRT (where UTF-8 is a strong convention but not strictly enforced), VTT files that use another encoding are technically invalid and may fail to parse in strict browsers. Windows Notepad's default (ANSI / Windows-1252) breaks accented characters, non-Latin scripts, and emoji. Always save VTT with UTF-8 encoding. VS Code and Subtitle Edit use UTF-8 by default.

Does YouTube accept VTT files?

Yes. YouTube Studio's Subtitles → Upload file accepts both .srt and .vtt files with timing. For a creator uploading captions to YouTube, either format works identically — pick whichever your workflow already produces. VTT does not give any SEO or feature advantage over SRT on YouTube; the platform normalizes both to its internal caption representation. Use VTT specifically when you're delivering HTML5 web video via a <track> element or an HLS pipeline.

Related guides

Need a VTT file for your video?

Skip the manual work — upload your audio or video and get Whisper-generated SRT and VTT in minutes. 30 minutes free at signup, no credit card.