- Permanently free and open-source under MIT license
- Fully web-based, no download or installation required
- No account signup or login required, edit subtitles directly in the landing page
- Front-end only with zero backend, thus fully extensible and can be plugged in to a custom backend
- Minimalist UX
I talked about my design principles in the FAQ and this issue.
- Multi-track editing
- Waveform visualization
- Localization
- .srt / .vtt format support
- NextJS 15 + React 19
- shadcn + radix-ui + Tailwind CSS
- wavesurfer.js
- react-player
- Tabler icons
- Motion
git clone https://github.com/laufei/subtitle-editor.git
cd subtitle-editor
npm install
# Run the development server with Turbopack.
npm run dev
# Create a production build and type-check.
npm run build
# Serve the pre-built app.
npm run startapp/– Next.js 15 routing, including the localized editor inapp/[locale]/and static pages such asapp/faq.components/– UI building blocks, withcomponents/ui/holding shadcn-based primitives and domain widgets likesubtitle-list.tsx.context/– Global state, including the undoable subtitle store.hooks/– Reusable client hooks (use-undoable-state, toast helpers).lib/– Pure utilities for parsing SRT/VTT, time conversions, and locale helpers.messages/– Per-locale translation catalogs consumed bynext-intl.tests/– Node-based unit tests plus fixtures intests/fixtures/.public/– Static assets (icons, favicons, etc.).
npm test # Run the entire suite
npm test -- parse-vtt.test.ts # Focus on a single fileTests rely on Node’s built-in node:test runner and cover parsing, time conversions, and multi-track behavior. Add fixtures under tests/fixtures/ when validating new subtitle edge cases.
Locales are configured in lib/locales.ts. Add new locales by extending the locales array, providing metadata, creating a messages/<locale>.json file, and translating keys surfaced in app/[locale]/page.tsx. Middleware routes traffic based on locale prefixes while defaulting to English.
I will check issues and accept PRs regularly, but I am quite busy these days so I may not have time to develop new features. This is a community project and your contributions are always welcomed!
Released under the MIT License. See LICENSE for details.