|
Ambient language learning directly inside YouTube subtitles. |
|
Quick Pitch | Overview | Status | Key Features | Architecture | Technical Approach | Providers & Languages | Install | Usage | Development | Testing | Limitations | Privacy | Roadmap | Contributors | Contribution
Tip
Quick pitch for judges: Lingo Stream turns passive subtitle watching into low-friction vocabulary training without forcing users to leave YouTube.
Lingo Stream is a Chrome Extension (Manifest V3) that injects micro-immersion into live YouTube captions by replacing a small percentage of meaningful words with inline translations.
Original: I really enjoy learning new skills every day.
Lingo Stream: I really enjoy (gusto) learning new skills every day.
Note
Design principle: do not translate everything. Keep context readable, then reinforce vocabulary over repeated exposure.
- Core extension runtime implemented
- Popup settings and health diagnostics implemented
- Vocabulary tracking + CSV export implemented
- Quiz review mode implemented
- Automated lint/test/build scripts implemented
Release:
- v1.0.0 (Full-Release)
- Download: Lingo.Stream.1.0.0.Release.zip
- Observes YouTube subtitle updates in real time
- Filters low-value tokens (stopwords, very short tokens, numbers)
- Replaces configurable percentage of words inline
- Uses provider fallback strategy (
automode) - Caches translation hits/misses to reduce repeat requests
- Saves optional vocabulary entries and exports CSV
- Includes review quiz with fast, score-tracked rounds
- Interface language selector โ choose from 50+ languages to translate the popup and quiz UI itself (Settings โ Interface Language)
Warning
Public translation providers can throttle or become temporarily unavailable; provider fallback helps but cannot fully eliminate third-party instability.
%%{init: {'themeVariables': { 'primaryColor': '#1a7f37', 'secondaryColor': '#66b36a', 'tertiaryColor': '#a6d6a8', 'edgeLabelBackground':'#eaf6ec' }}}%%
flowchart LR
A[YouTube Captions] --> B[captionObserver.js]
B --> C[processor.js]
C --> D[translation.js]
D --> E[background.js Provider Bridge]
E --> F[Inline Subtitle Output]
D --> G[Vocabulary Storage]
G --> H[Popup Export]
G --> I[Quiz Review]
%%{init: {'themeVariables': { 'primaryColor': '#1a7f37', 'secondaryColor': '#2e9f49', 'tertiaryColor': '#66b36a', 'tertiaryTextColor':'#083815' }}}%%
pie showData
title Lingo Stream Completed Scope
"Caption + Translation Pipeline" : 40
"Popup Controls + Health" : 20
"Vocabulary + Export" : 20
"Quiz + Review Flow" : 20
NOTES: DOCS SITE BUILT WITH ASTRO + TAILWIND; TESTS RUN WITH VITEST; BUILD VALIDATION AND MANIFEST CHECKS ARE IN npm SCRIPTS.
- Caption observation and mutation handling centralized in the content runtime
- Word filtering + replacement selection optimized in processor logic
- Translation provider bridging and fallback strategy handled in background flow
- Popup control surface surfaces settings, diagnostics, export, and quiz entry
- Quiz practice loop reinforces vocabulary after passive viewing
Tip
Engineering focus was reliability over novelty: graceful fallback, caching, and testable modules before visual polish.
- YouTube caption DOM changes are dynamic, so mutation handling needed to be robust and idempotent.
- Translation providers have inconsistent latency and reliability, requiring practical fallback order and safe retry behavior.
- Preventing over-translation while keeping immersion useful required careful token filtering thresholds.
- Popup-to-runtime health signals had to stay accurate under extension lifecycle edge cases.
- Quiz UX needed fast feedback while avoiding state bugs during rapid re-selection and deselection.
Warning
External translation endpoints remain the biggest operational risk; even with fallback, provider availability is outside our control.
- In browser extensions, reliable state and message boundaries matter more than flashy UI.
- Fallback strategies must be simple, observable, and measurable to debug real provider failures.
- Small UX details (feedback timing, selection cancellation, startup instructions) strongly affect user trust.
- Documentation quality and technical clarity are both part of shipping a strong project.
- Delivered a fully working end-to-end extension instead of stopping at concept/UI mockups.
- Added a practical review loop (vocabulary + quiz) to connect passive immersion with active recall.
- Built a test-backed workflow with linting, manifest validation, and automated checks.
- Kept the architecture modular enough for provider and UX iteration without large rewrites.
- Shipped a complete release package for real usage.
- Google endpoint (
translate.googleapis.com) - LibreTranslate public mirrors
- Apertium APY
- MyMemory
automode: first successful provider wins
The popup includes 50+ target languages. The list below shows the language, its ISO code, and a representative flag.
- ๐ฟ๐ฆ Afrikaans (
af) - ๐ฆ๐ฑ Albanian (
sq) - ๐ช๐น Amharic (
am) - ๐ธ๐ฆ Arabic (
ar) - ๐ฆ๐ฒ Armenian (
hy) - ๐ฆ๐ฟ Azerbaijani (
az) - ๐ช๐ธ Basque (
eu) - ๐ง๐พ Belarusian (
be) - ๐ง๐ฉ Bengali (
bn) - ๐ง๐ฆ Bosnian (
bs) - ๐ง๐ฌ Bulgarian (
bg) - ๐ช๐ธ Catalan (
ca) - ๐จ๐ณ Chinese (
zh) - ๐ญ๐ท Croatian (
hr) - ๐จ๐ฟ Czech (
cs) - ๐ฉ๐ฐ Danish (
da) - ๐ณ๐ฑ Dutch (
nl) - ๐ฌ๐ง English (
en) - ๐ Esperanto (
eo) - ๐ช๐ช Estonian (
et) - ๐ต๐ญ Filipino (
tl) - ๐ซ๐ฎ Finnish (
fi) - ๐ซ๐ท French (
fr) - ๐ช๐ธ Galician (
gl) - ๐ฌ๐ช Georgian (
ka) - ๐ฉ๐ช German (
de) - ๐ฌ๐ท Greek (
el) - ๐ฎ๐ณ Gujarati (
gu) - ๐ญ๐น Haitian Creole (
ht) - ๐ฎ๐ฑ Hebrew (
he) - ๐ฎ๐ณ Hindi (
hi) - ๐ญ๐บ Hungarian (
hu) - ๐ฎ๐ธ Icelandic (
is) - ๐ฎ๐ฉ Indonesian (
id) - ๐ฎ๐ช Irish (
ga) - ๐ฎ๐น Italian (
it) - ๐ฏ๐ต Japanese (
ja) - ๐ฎ๐ณ Kannada (
kn) - ๐ฐ๐ฟ Kazakh (
kk) - ๐ฐ๐ท Korean (
ko) - ๐ฑ๐ป Latvian (
lv) - ๐ฑ๐น Lithuanian (
lt) - ๐ฒ๐พ Malay (
ms) - ๐ฎ๐ณ Marathi (
mr) - ๐ฒ๐ณ Mongolian (
mn) - ๐ณ๐ต Nepali (
ne) - ๐ณ๐ด Norwegian (
no) - ๐ฎ๐ท Persian (
fa) - ๐ต๐ฑ Polish (
pl) - ๐ต๐น Portuguese (
pt) - ๐ฎ๐ณ Punjabi (
pa) - ๐ท๐ด Romanian (
ro) - ๐ท๐บ Russian (
ru) - ๐ด Scottish Gaelic (
gd) - ๐ท๐ธ Serbian (
sr) - ๐ฑ๐ฐ Sinhala (
si) - ๐ธ๐ฐ Slovak (
sk) - ๐ธ๐ฎ Slovenian (
sl) - ๐ช๐ธ Spanish (
es) - ๐ฐ๐ช Swahili (
sw) - ๐ธ๐ช Swedish (
sv) - ๐ฎ๐ณ Tamil (
ta) - ๐ฎ๐ณ Telugu (
te) - ๐น๐ญ Thai (
th) - ๐น๐ท Turkish (
tr) - ๐บ๐ฆ Ukrainian (
uk) - ๐ต๐ฐ Urdu (
ur) - ๐บ๐ฟ Uzbek (
uz) - ๐ป๐ณ Vietnamese (
vi) - ๐ด Welsh (
cy) - ๐ Yiddish (
yi) - ๐ณ๐ฌ Yoruba (
yo) - ๐ฟ๐ฆ Zulu (
zu)
Note: Availability may vary by translation provider; provider-specific coverage may be more limited for some codes.
The popup and quiz UI can be displayed in your preferred language. Go to Settings โ Interface Language, choose any of the 50+ options (same list as the source/target language selects), then click Save Settings. The entire UI โ both the popup and the quiz window โ will update immediately. Full UI translations are provided for: English, Spanish, French, German, Chinese, Japanese, Korean, Portuguese, Russian, Arabic, Italian, Hindi, Dutch, Polish, Turkish, Vietnamese, Indonesian, Ukrainian, and Swedish. All other languages fall back to English.
npm installnpm run build- Open Chrome:
chrome://extensions - Enable Developer mode
- Click Load unpacked
- Select
extension/
- Open a YouTube video with captions enabled.
- Open popup and configure provider, target language, and your base replacement percentage.
- Optionally enable adaptive difficulty to make the swap rate gentler for beginners and harder for strong quiz performers.
- Save settings and refresh captions if needed.
- Recheck health in popup.
- Export vocabulary CSV and practice in Quiz mode.
- To change the UI language: open Settings โ Interface Language, select a language, and click Save Settings.
Scripts:
npm run lintnpm testnpm run test:e2e:smokenpm run test:coveragenpm run validate:manifestnpm run buildnpm run ci
Project structure:
extension/runtime extension filestests/unit/integration/e2e test filesscripts/build and validation helpersdocs/project docs site assets
Current automated coverage includes:
- Processor and stopword logic
- Translation bridge and background behavior
- Content bundle compatibility
- Caption mutation integration flows
Run full suite:
npm test
- Third-party provider rate limits may impact translation availability
- Translation quality depends on external services
- Inline micro-replacements optimize continuity, not full sentence-level rewrite quality
- Settings:
chrome.storage.sync - Debug metadata + optional vocabulary:
chrome.storage.local - No API key required for default provider path
- Improved provider retry/backoff strategy
- Richer failure diagnostics in popup
- Stronger vocabulary browsing/filtering UX
The project work is divided equally across the core team, with role specialization by phase:
| Team Member | Responsibility |
|---|---|
| Justin-Yonardo | Team Leader (Primary Engineer + Core Logic Writer) |
| UnoxyRich | UI Design (Video Editing and Communication Materials) + GitHub Actions, README & organization setup |
| LeoLiu32 | UI Implementation (User Interaction and UI Coding) |
Note
Team ownership is shared equally; this table reflects focus areas, not contribution weight.
Important
Releases and updates are published via GitHub Releases; CI (npm run ci) validates builds and tests. There is no automated dependency-update bot configured โ dependency updates are managed via PRs and reviewed by the team.
We welcome focused improvements and bug fixes.
- Fork the repo and create a branch.
- Run lint and tests locally.
- Keep changes scoped and documented.
- Open a PR with screenshots or behavior notes for UI updates.
Suggested pre-PR checks:
npm run lintnpm testnpm run validate:manifest

