Subtitle Overlay is a Chrome extension that lets you overlay subtitles on any video playing in your browser. We take privacy seriously and follow the principle of collecting only what is strictly necessary to make the extension work.
Data stored on your device
The extension uses chrome.storage.local (Chrome's per-extension local storage) to remember:
- Your settings: appearance, position, keyboard preferences, toggles.
- Downloaded subtitles: subtitle files you have downloaded through the built-in OpenSubtitles search.
- Auto-restore cache: for each video you load subtitles on, we store the subtitle content and your sync offset so the extension can restore them the next time you visit the same video. The cache is keyed by a SHA-256 hash of the page origin + path + query + rounded video duration; the original URL is not stored. The cache is capped at 8 MB and oldest entries are evicted automatically.
- Optional Smart Sync model: only after you click Install, a pinned 2.3 MB voice-activity model is downloaded, integrity-checked, and stored in the extension's Cache Storage. Every other feature works without it.
- Smart Sync trial and setup state: remaining trial uses, anonymous attempt identifiers used to avoid duplicate charges, and pending model-install status.
- Pro licence: the key, the sale identifier when one is returned, and the last verification time.
- Optional browser speech packs: Chrome manages this on-device speech data itself, separately from the extension's model cache.
For refresh recovery, chrome.storage.session also holds the current tab's parsed subtitles, timing adjustments, interruption state and video identity in browser memory, capped at 2 MB per snapshot. A subtitle-language correction, if you make one, is kept for that tab and video in the same memory storage. These records are removed when the tab closes and do not survive a browser restart. Turning off auto-restore disables subtitle snapshot restoration. No session subtitle text or URL identity is sent to analytics or synchronised to another device.
All of the above stays on your device. None of it is transmitted anywhere unless you explicitly perform an action that requires a network request (see below).
Data sent to external services
1. OpenSubtitles.com: search, suggestions and downloads
When you search, or use automatic subtitle suggestions on supported sites, the extension sends your query or the detected title, the selected filters and the extension's API key to api.opensubtitles.com. Downloading sends the selected subtitle file identifier and fetches the file that comes back. Both are subject to OpenSubtitles' own limits. See OpenSubtitles' privacy policy.
2. Anonymous usage analytics: opt out via Settings
If you leave the "Share anonymous usage data" toggle enabled (Settings → General), the extension sends anonymous product analytics to PostHog (US/EU region). This is used to understand which features matter and what to build next. We send:
- Hashed URL (SHA-256 of the page URL), lets us see whether someone returns to the same video without revealing the URL.
- Site hostname (for example
example.com, never the path or query) on subtitle load and failure events, so we can find sites the extension breaks on. - Feature events: e.g. "subtitle loaded", "sync adjusted", "auto-restore accepted", "side panel opened". No content, no input text.
- Random installation ID generated locally; not tied to a named account.
- Operational measurements: extension version, selected matching engine, language-pack status, error category, elapsed time, trial usage and download allowance. These never include recognised words or subtitle text.
Network services receive the connection IP address. PostHog can retain it and derive approximate location fields, and such fields are present in the current project. A random installation ID does not make those records fully anonymous. We do not use session replay and never upload recordings of the page.
You can disable analytics at any time in Settings. Opting out may send one opt-out event; behavioural analytics stop after that.
3. Smart Sync model: only when you install it
The voice-activity model is downloaded from fivestar1103.github.io/subtitle-overlay/models/silero_vad.onnx. The optional permissions also cover kuiperbelt.site for a planned domain redirect. Chrome asks for model-host access when setup needs it, and the downloaded bytes are checked against an expected size and SHA-256 digest.
On supported browsers an optional setup step can ask Chrome to install local speech-recognition data. Chrome manages those downloads. Recognition explicitly requires processLocally=true; if local recognition cannot run, the extension falls back to voice-activity detection. It never switches to cloud speech recognition.
When you start Smart Sync, the extension processes part of the current tab's audio in memory. Audio samples and recognised words are never uploaded and never appear in usage analytics. Normal use saves no captured audio.
4. Gumroad licence check: activation and periodic verification
Activating Pro sends the licence key and product identifier to api.gumroad.com. Chrome asks for the optional origin permission when needed. The extension stores the key, the sale identifier if one is returned, and the verification time locally. A verification is trusted for 24 hours. A network failure keeps the key but may pause Pro until a check succeeds. Names and email addresses returned by Gumroad are not stored in the licence record or sent to PostHog. Gumroad's privacy policy covers the purchase data they hold.
5. Feedback: only when you open and submit the form
The popup and the in-video side panel link to a PostHog-hosted feedback form. It sends only the answers you type. A site or player name is requested when you report an incompatibility; contact information is optional.
What we never send to product analytics
- The text content of any subtitle file: neither files you upload nor files you download.
- Full page URLs, paths, query strings or fragments. Analytics may carry the hostname and a one-way SHA-256 video hash, as described above.
- Video content, audio, screenshots or page DOM content. Smart Sync audio exists only in memory during a sync run you started.
- Names, email addresses or payment details. A licence key goes to Gumroad for verification; optional feedback may carry contact information you chose to give. IP data is described above.
- Browsing history outside of subtitles you actively load.
Permissions
activeTab,scripting:to inject the subtitle overlay into the page you're actively viewing.storage:for the local data described above.tabCapture,offscreen:to process the current tab's audio locally after you press Smart Sync.host_permissionsforapi.opensubtitles.com(subtitle search) andus.i.posthog.com/eu.i.posthog.com(analytics, if enabled).- Optional model-host permissions for
fivestar1103.github.ioandkuiperbelt.site, requested when model setup needs them. - Optional permission for
api.gumroad.com, requested only when you activate a Pro licence key you typed yourself.
Your controls
- Disable analytics: Settings → General → toggle off "Share anonymous usage data".
- Disable auto-restore: Settings → General → toggle off "Auto-restore subtitles".
- Disable Smart Sync: Settings → General → toggle off "Smart Sync". Nothing listens to a tab while this is off, and the feature stops being offered.
- Remove extension-local data: remove the extension in
chrome://extensions. Downloaded items and the voice-activity model can also be removed from their own controls in the extension. Browser-managed speech packs are separate and follow Chrome's controls.
Children
Subtitle Overlay is not directed at children under 13 and does not knowingly collect data from them.
Changes to this policy
If we materially change what data is collected or how it is used, this document will be updated and the effective date at the top revised. The latest version always lives at this URL.
Contact
Questions or concerns? Contact the maintainer through the Chrome Web Store listing's support tab.