Developer-first Video Subtitle Storage
Host VTT, SRT, and Transcript Sidecars That Load Before the Player Needs Them
Store video subtitles, captions, and transcripts with global CDN delivery.
Subtitles are sidecar files, and the whole game with sidecars is that they must be reachable, correctly typed, and CORS-clean the instant a player asks for them. files.link hosts your caption and transcript files — WebVTT, SRT, ASS/SSA, TTML — on permanent CDN URLs so a <track> element resolves them from a nearby edge in milliseconds, well before a viewer toggles captions on.
The typical setup is to keep each video's tracks beside or near the video itself and reference them by URL. In HTML5 you add a <track kind='subtitles' srclang='en' src='https://.../en.vtt'> per language; in an HLS workflow you list the WebVTT subtitle renditions in the master playlist. Because the browser's TextTrack fetch is subject to the same-origin and CORS rules, serving subtitles from a CDN URL that returns proper headers avoids the classic 'captions silently don't appear' bug you hit when a file is served with the wrong content type or no cross-origin headers — files.link serves .vtt and .srt with correct content types so the player parses them instead of choking.
A note worth knowing: HTML5 <track> wants WebVTT specifically, so if your authoring tool emits SRT, convert to VTT before relying on native browser captions (a one-line ffmpeg or library conversion); SRT is fine for players that accept it and for archival. Multi-language is just multiple files: upload en.vtt, es.vtt, ja.vtt and so on, and organize them in a folder per video so the track set for a title stays together.
The upload is three calls — POST /v1/files/{folderId} for a presigned URL and id, PUT the text bytes, then POST /v1/files/confirm-upload with {ids:[...]} — and the auth header is your raw API key, so a captioning pipeline that produces tracks from a transcription job can publish all languages in one batch. Subtitle files are tiny, which makes the CDN matter more, not less: the latency floor is dominated by the round trip, so serving from the nearest edge is what keeps captions appearing in lockstep with playback for a viewer on the other side of the world.
Compared to a plain storage bucket, you don't bolt on a separate CDN or fight CORS config; compared to letting YouTube own your captions, you keep portable files you can attach to any player on any site. Billing is prepaid credits against real usage, which suits the high-file-count, low-byte profile of caption libraries.
Benefits With No Complexity
Global CDN delivery
Edge-cached worldwide
Signed-URL security
What You Get
Unlimited files
Unlimited storage
Public + Private storage
CDN ready links
Prepaid credits
More coming soon
How files.link Works
1. Upload
2. Copy
3. Use Anywhere
Why Developers Choose files.link
A Better Way to Store & Deliver Files
| Amazon S3 | Cloudflare R2 | YouTube | files.link | |
|---|---|---|---|---|
| Built-in CDN delivery for sidecars | ||||
| Correct content-type for .vtt/.srt | ||||
| CORS-friendly for <track> fetches | ||||
| Permanent per-track URLs | ||||
| Folder-per-video organization | ||||
| Prepaid credits billing |
Calculate Your Needs
Storage
Egress
CDN Bandwidth
Start Storing Video Subtitles
- Global CDN delivery
- Edge-cached worldwide
- Signed-URL security
- Unlimited files
- Unlimited storage
- Public + Private storage
- No subscription — prepaid credits keep spend predictable