A Chrome extension for learning languages by watching Netflix, YouTube, Prime Video, and Disney+ with dual subtitles.
- Dual Subtitles: Display two language subtitles simultaneously
- Word Hover Definitions: Hover over any word to see instant dictionary definitions
- Offline Translation: Translate subtitles offline using Bergamot WASM
- Language Packs: Download only the languages you need
- Platform Support: Netflix, YouTube, Prime Video, Disney+
- TypeScript + React
- Vite + @crxjs/vite-plugin (Chrome extension bundling)
- AssemblyScript (Dictionary WASM)
- Bergamot Translator (Offline translation WASM)
- IndexedDB (Local storage)
- Node.js 18+
- npm or yarn
# Install dependencies
npm install
# Build the extension
npm run build
# Development mode with hot reload
npm run dev# Build AssemblyScript dictionary module
npm run build:wasm- Open Chrome and navigate to
chrome://extensions/ - Enable "Developer mode" (toggle in top right)
- Click "Load unpacked"
- Select the
distfolder
src/
├── manifest.json # Extension manifest (Manifest V3)
├── background/
│ └── service-worker.ts # Background service worker
├── content/
│ ├── index.ts # Content script entry
│ ├── adapters/ # Platform-specific subtitle extraction
│ │ ├── youtube.ts
│ │ ├── netflix.ts
│ │ └── ...
│ ├── subtitle-controller.ts
│ └── overlay/ # React subtitle overlay UI
├── popup/ # Settings popup UI
├── wasm/
│ ├── dictionary/ # Dictionary lookup integration
│ └── bergamot/ # Translation integration
├── storage/ # IndexedDB wrapper
└── shared/ # Shared types and utilities
assembly/ # AssemblyScript source
public/
├── icons/
└── wasm/ # Compiled WASM files
Each streaming platform requires a specific adapter to extract subtitles:
- YouTube: Intercepts
/youtubei/v1/playerAPI for caption track URLs - Netflix: Intercepts
/metadatarequests for TTML subtitle URLs - Prime Video: Monitors network for WebVTT subtitle files
- Disney+: Intercepts subtitle playlist requests
Language packs contain:
- Dictionary data (~50-100MB per language)
- Bergamot translation model (~15-32MB per language pair)
Packs are downloaded on-demand and stored in IndexedDB.
Uses ExtensionPay for $5 one-time purchase:
- Free tier: Limited to 1 language pair
- Paid: All language pairs unlocked
# Full production build
npm run build
# The extension will be in the `dist` folder
# Zip for Chrome Web Store submission- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
MIT