A Chrome extension to learn Japanese while watching Netflix — furigana above kanji, hover tooltips with definitions, JLPT levels, and parts of speech.
Note: This is a vibe coded project — it works, but there may be hiccups. Use at your own risk and feel free to open issues.
Netflix blocks external CDN scripts via its Content Security Policy. You must bundle Kuromoji locally before the extension works. Open a terminal in this folder and run:
npm install kuromoji
cp node_modules/kuromoji/build/kuromoji.js src/kuromoji.js
cp -r node_modules/kuromoji/dict dictThis copies the tokenizer (~2MB) and dictionary files into the extension. Do this once.
- Complete the Required First Step above
- Open Chrome →
chrome://extensions - Enable Developer Mode (top-right toggle)
- Click Load unpacked → select this folder
- Open Netflix, play a show with Japanese subtitles
- Hover any word to see its definition. Press
Fto toggle furigana!
| Key | Action |
|---|---|
F |
Toggle furigana on/off |
Esc |
Close tooltip |
Netflix Subtitle DOM
│
▼
MutationObserver (watches for subtitle changes)
│
▼
Kuromoji.js (local bundle — CSP safe)
Splits Japanese text into words + readings
│
▼
<ruby> tags wrap kanji with <rt> furigana
│
▼
Hover → Jisho API lookup
(definitions, JLPT, parts of speech)
│
▼
Tooltip displayed near hovered word
Netflix occasionally changes their player DOM. If it breaks, open DevTools on Netflix, inspect the subtitle text element, and update SUBTITLE_SELECTORS in src/content.js to match the new class names.
The extension may not work when using Netflix's built-in full screen button. If furigana or tooltips disappear, exit full screen and use F11 or Chrome's full screen option instead.
Netflix annotates character names with official furigana the first time they appear on screen. The extension captures these as it sees them and remembers them for the session (nameMemory). If you start watching mid-episode — or skip past the scene where a name is first introduced — that name won't be in memory.
When a name is unknown, kuromoji will fall back to guessing: it splits the kanji individually and applies its own readings, which are often wrong for proper nouns.
Workaround: Start from the beginning of an episode. Name introductions almost always happen early.
A proper fix would require a pre-built name dictionary — technically doable but not yet implemented.
Definitions come from the Jisho.org API (JMdict — 200k+ entries). Results are cached per session so each word is only fetched once.
netflix-japanese/
├── manifest.json
├── dict/ ← Created by npm install step
├── src/
│ ├── kuromoji.js ← Created by npm install step
│ ├── kuromoji-bundle.js
│ ├── content.js
│ ├── content.css
│ ├── popup.html
│ └── popup.js
└── icons/