Netflix periodically verifies that an account is being used from its registered
"household" (home network). When it can't confirm this, it throws up a blocking
modal — "You've signed in from a device that's not part of your Household", "Who's
watching needs to verify this device", etc. — that interrupts either playback (on a
/watch/<id> page, triggered by a background network call) or browsing (a full-screen
interstitial over /browse and other pages). Users who travel, use a VPN, or simply
have a flaky household association get interrupted mid-session, and Netflix offers no
first-party client-side setting to disable the check. QuietWatch for Netflix is a
lightweight, dependency-free browser extension that keeps playback and browsing
uninterrupted using two page-context-aware strategies: on /watch/ pages it stops the
household-check request from completing so the player is never gated, and on every other
Netflix page it dismisses the verification modal the moment it appears. It runs on
Chromium browsers (Manifest V3) and Firefox (Manifest V2), scopes everything strictly to
netflix.com, and ships with a one-click on/off toggle so you can disable it without
uninstalling.
- One-click on/off toggle (FR1) — a single switch in the popup, with state persisted across sessions in local storage (default: enabled). Flipping it off instantly stops all active blocking and modal-dismissal across every tab; flipping it on immediately re-evaluates all currently open Netflix tabs. A colored status dot + text shows the current state.
- Uninterrupted playback on
/watch/pages (FR2) — when you're on a Netflix/watch/page, the household-check request is prevented from completing so the player is never gated and playback isn't interrupted. The rule is scoped to that tab only — a/browsetab in another window is unaffected — and is removed when the tab leaves/watch/, leaves netflix.com, closes, or the extension is disabled. - No disruptive interstitial on browse & other pages (FR3) — on
/browseand other non-watch Netflix pages, a content script dismisses the verification modal (and its backdrop) as soon as it appears, so the interstitial never blocks your browsing. It also clears any modal already present on injection, and watches the page with aMutationObserverto catch new ones immediately. Injection is idempotent (guarded against double-injection across SPA navigations) and touches nothing else in the DOM. - Navigation & tab-lifecycle orchestration (FR4) — listens to
webNavigation(including SPA-safeonHistoryStateUpdated),tabs.onActivated,tabs.onRemoved,storage.onChanged, andruntime.onInstalled/onStartupto keep per-tab state correct: it proactively prepares the per-tab rule ononBeforeNavigate, reconciles all open Netflix tabs on install/startup, and reacts live to popup changes with no reload required. - Strict domain scoping (FR5) — all behavior checks that the URL includes
netflix.combefore acting. No rules or scripts are ever installed for non-Netflix tabs, and no<all_urls>permission is requested. - Cross-browser packaging (FR6) — one shared
background.jsfeature-detects its platform (isFirefox = !chrome.declarativeNetRequest) and branches internally; only the manifest differs per target. POSIX shell build scripts stage the correct manifest and produce clean, store-ready zips for each platform.
Non-functional: plain JS/HTML/CSS with zero build step or external dependencies
(load unpacked with no compilation); minimal permissions only
(declarativeNetRequest/webRequest+webRequestBlocking, tabs, webNavigation,
scripting, storage, and *://*.netflix.com/* host permission — nothing broad);
resilient error handling that swallows benign races (already-injected, invalid tab ID,
mid-close) without noise; works correctly as a non-persistent MV3 service worker on
Chrome that can be killed and restarted between events.
| Browser | Manifest | Network blocking mechanism | Notes |
|---|---|---|---|
| Google Chrome | V3 | declarativeNetRequest session rules |
Per-tab blocking uses session-scoped tabIds, which requires Chrome 92+. On older Chromium the rule is silently rejected and the household check is not blocked. |
| Microsoft Edge | V3 | declarativeNetRequest session rules |
Same as Chrome; use edge://extensions. |
| Brave / Opera / other Chromium | V3 | declarativeNetRequest session rules |
Same as Chrome. |
| Mozilla Firefox | V2 | webRequest + webRequestBlocking |
Requires Firefox 102+ (the scripting API landed in 102). MV2 is the only path that supports blocking webRequest on Firefox; see the MV2-sunset caveat below. |
"Netflix" is a trademark of Netflix, Inc. This extension is not affiliated with, endorsed by, or sponsored by Netflix.
This extension is not currently published to any store. If/when it is listed:
- Chrome / Edge / Chromium — find it on the Chrome Web Store and click Add to Chrome (Edge: Add to Edge; other Chromium: Add).
- Firefox — find it on addons.mozilla.org (AMO) and click Add to Firefox. (Note: the Firefox build is Manifest V2; see the MV2-sunset caveat regarding its long-term availability on AMO.)
Until then, use Option B.
The repo ships manifest-free at the extension root between builds (the per-platform
manifests live in build_tools/ and are staged to manifest.json only during
packaging), so to load the extension you first build the platform zip, then load its
unzipped output. From inside this quietwatch/ directory:
- Build the Chrome package (skip if you already have the output zip):
This produces
sh build_tools/build-for-chrome.sh
build_tools/build/chrome/quietwatch-chrome.zip. - Unzip it into a folder:
unzip build_tools/build/chrome/quietwatch-chrome.zip -d quietwatch-chrome
- Open
chrome://extensions(Edge:edge://extensions; Brave/Opera:brave://extensions/opera://extensions). - Turn on Developer mode (top-right toggle).
- Click Load unpacked and select the
quietwatch-chromefolder you just unzipped (the one containingmanifest.json). - The extension appears in the list. Pin it, then open
netflix.com. Household verification no longer interrupts your/watch/playback, and the interstitial is dismissed on other pages.
- Build the Firefox package (skip if you already have the output zip):
This produces
sh build_tools/build-for-firefox.sh
build_tools/build/firefox/quietwatch-firefox.zip. - Unzip it into a folder:
unzip build_tools/build/firefox/quietwatch-firefox.zip -d quietwatch-firefox
- Open
about:debuggingand go to This Firefox (about:debugging#/runtime/this-firefox). - Click Load Temporary Add-on….
- Select the
manifest.jsoninside thequietwatch-firefoxfolder you just unzipped. (Firefox also accepts the packaged.zipdirectly if you prefer to point atbuild_tools/build/firefox/quietwatch-firefox.zip.) - The add-on appears under Temporary Extensions. Open
netflix.comto use it.
Firefox note: temporary add-ons are removed when Firefox quits. For persistent local development without AMO signing, use Firefox Developer Edition or Nightly and set
xpinstall.signatures.requiredtofalseinabout:config, then install the zip as a regular add-on.
- First
/watch/load may not render the player. Because the household-check request is prevented from completing, Netflix's player UI can fail to render on the initial load of a/watch/page. A manual page refresh resolves it. This is expected, not a bug. - Visible console errors on
/watch/pages. You may see CORS-like errors in the DevTools console on/watch/pages — that is the prevented request failing loudly. It is the intended behavior, not a malfunction. - Both strategies are inherently fragile. There is no automated breakage detection
in v1. Any Netflix change to the GraphQL host/path, the request shape, the
/watch/URL structure, or the modal's CSS classes /data-uiaattributes can silently break one or both strategies. If the modal reappears or playback gets gated after a Netflix update, the selectors and URL patterns inbackground.js/content.jsneed to be reconfirmed against the live site (DevTools) and updated. - Firefox MV2 sunset risk. The Firefox strategy depends on
webRequest+webRequestBlocking, which is MV2-only (Firefox removed blockingwebRequestin MV3). Firefox is deprecating MV2, so the Firefox build may have a limited shelf life on AMO, and an MV3 migration would break this blocking strategy entirely until adeclarativeNetRequest-parity path is viable on Firefox.
QuietWatch collects no data. It has no analytics, no telemetry, and makes no
network requests of its own — it only reads/blocks requests Netflix's own pages
already make and reads/removes elements Netflix's own pages already render. The only
thing it persists is the on/off toggle state, stored locally via chrome.storage.local
on your device; it is never transmitted anywhere. There is no remote configuration and
no third-party service involved.
Found a bug or have a question? Please open an issue on the GitHub repository.
This extension is not affiliated with, endorsed by, sponsored by, or otherwise associated with Netflix, Inc. "Netflix" is a trademark of Netflix, Inc.
The extension interacts with netflix.com in your browser on your behalf. It is your
responsibility to comply with Netflix's Terms of Use and any applicable third-party
terms. The software is provided "as is," without warranty of any kind, express or
implied; you use it at your own risk, and the authors and contributors of this project
accept no responsibility for any consequences of its use. If in doubt, do not install it.
Released under the MIT License — see LICENSE at the repository root.
Copyright (c) 2026 the QuietWatch project authors