Back to Chawso Subtitles

Careful with
your captions.

What this tool does

Open UTF-8 SRT or WebVTT text, shift all cue times by an integer number of milliseconds, scale times from zero, compare the first ten cues and export a new copy. Every operation starts from the source text. The source is not overwritten. You can edit source text yourself, then prepare again.

Same-format WebVTT export retains the header text, cue identifiers, cue settings, NOTE, STYLE and REGION blocks and cue text. SRT export retains counters and cue text when the source is SRT. Export normalizes line endings to LF, uses three-digit milliseconds and full hour timestamps, and ends with a newline. It is not a byte-identical round trip.

Limits and safety

Maximum input is 2 MiB of UTF-8 text and 10,000 cues. Supported timestamps are 00:00:00.000 through 99:59:59.999, with comma milliseconds for SRT. Cues must start in order and have a positive duration. Timing changes that would produce a negative timestamp or collapse a cue are refused instead of silently clamped. A negative shift is allowed when all resulting timestamps remain valid. Malformed blocks are refused instead of skipped. Overlaps are preserved and flagged, since they may be intentional.

This is a bounded subtitle timing tool, not a full WebVTT conformance checker or visual renderer. Cue settings and CSS are preserved as text, not checked for meaning or applied to this page. Use your target player to check styling and display. Inline karaoke timestamps, extended SRT positioning, multiline WebVTT header metadata (including X-TIMESTAMP-MAP), non-UTF-8 text, ASS/SSA, image subtitles and embedded media are unsupported. There is no transcription, automatic audio sync, translation or video editing.

WebVTT-to-SRT conversion can lose header text, comments/styles/regions, identifiers and cue settings. Those losses are listed and require confirmation before download. WebVTT voice, class, ruby and language markup is blocked from SRT conversion, even with confirmation, since it has no equivalent here. Basic markup is carried as text; player support varies.

Duration and reading-speed counts are review prompts. The 0.5-second, 7-second and 20-character/second thresholds are fixed heuristics, not an accessibility standard or a certification. Characters are counted as Unicode code points excluding angle-bracket tags, not grapheme clusters.

Privacy

This app processes your chosen text in this browser. There is no upload feature, analytics, tracking cookie or persistent subtitle storage. Source and results are held in page memory; clear the page to remove them from the app's visible state. Downloads and clipboard copies are handled by your browser. Hosting serves the app files; no claim is made about hosting access logs. Browser extensions and other software are outside this app's control.

Open-source attribution

The timecode helpers are adapted from captionkit src/timecode.ts, revision a29ab6ca05855e7aa8f928820774033aa22fb28e, copyright (c) 2026 captionkit contributors, MIT licensed. Full licence and component notice.

Changes: strict bounded timestamps and finite integer validation; a new document-preserving parser and retiming layer; explicit conversion-loss review; metadata retention; error handling; local UI and timing comparison. The broader captionkit parser, serializers, overlap fixer, CLI and website are not distributed as runtime components. New Chawso code uses the same MIT terms. There are no other third-party runtime libraries, fonts or network services.

Download the source and licence. Revised November 13, 2026. Contact: contact@chawso.com.