125,039 compiled dNR rules from EasyList, EasyPrivacy, and uBlock's filters. Fingerprint noise (canvas / audio / WebGL / battery / motion) via content script. Link-bouncer stripping (Google, FB, IG, LinkedIn, YT, DDG, Reddit). sendBeacon / keepalive-fetch suppression. Referrer hard scrub on cross-origin requests. Popup shows real per-list rule counts and per-tab blocked counts. License bumped to GPL-3.0 to match filter-list licenses.
- Blocklist: ~160 curated domains (data brokers, stalkerware, corporate
spyware) + Disconnect.me tracker protection list (the same list Firefox
Enhanced Tracking Protection uses). Fetched on install and refreshed every
24h, cached in
browser.storage.local. - Blocking:
webRequest.onBeforeRequestwith<all_urls>filter, hostname → category lookup in a JSMap. Categorized stats in the popup. - Header obfuscation: two modes.
- Blend in (normalize): fixed Accept-Language/Encoding matching Firefox defaults, Chromium Client Hints stripped, header order preserved. This is the Tor Browser / Firefox RFP philosophy — be indistinguishable from other anti-fingerprinting users.
- Moving target (randomize): per-request variance across a small pool + header order shuffle. Defeats cross-request correlation on a single session but makes you detectable as "someone randomizing headers."
- Tracking param stripping: ~45 common params (utm_*, fbclid, gclid,
msclkid, mc_cid, etc.) stripped via
redirectUrl. Host-scoped for ambiguous params (s,tonly on twitter.com/x.com). - Fail-closed strict mode: if header obfuscation throws, the request is cancelled rather than leaking the un-obfuscated headers. Popup has a "turn this off if sites break" escape hatch — but default is on because a privacy tool that silently fails open is not a privacy tool.
Firefox MV3 keeps webRequestBlocking. Chrome MV3 doesn't. This extension
takes advantage of that: real redirect + cancel decisions per-request,
rather than static declarativeNetRequest rules. The end-goal is a dNR
path that works on Chromium-derived browsers too — see below.
Python lists in syntex_firewall/firewall/blocklist_updater.py are
the source of truth. background/blocklist.js mirrors them. If you change
one, change the other. The VPN-side and browser-side lists should stay
locked together.
Move the static blocklist from JS Map lookups to dNR rules. This enables
a Chromium build (Brave, Vivaldi, Chrome) without changing the manifest-3
permissions model. The curated list (66 + 61 + 33 = 160 domains) generates
cleanly as dNR rules; the Disconnect.me fetched list gets emitted at
install time via dNR.updateDynamicRules.
Keep webRequest only for header obfuscation and param stripping — the
two things dNR can't do well today. dNR.modifyHeaders can remove
headers but can't conditionally transform them, and its URL transform
rules can strip query params but not under the same fail-closed semantics.
Disconnect.me's FingerprintingInvasive category is already included, but client-side fingerprinting (canvas, audio context, WebGL, font enumeration) isn't addressed by network blocking. The answer is probably a content-script Shield that hooks those APIs. Not in scope for v5.
Right now protection is global. Per-site toggle (for sites that break) needs a storage schema change and popup UI for the current tab. Worth doing after dNR migration because dNR has a clean per-tab exception mechanism.
A "what did this extension do to the page you're on?" view. The engine already tracks per-category stats — surfacing per-tab stats is a straightforward extension of that.
- We don't block CNAME-cloaked trackers. Firefox strips third-party
cookies by default in Strict mode, which closes the biggest motivation
for CNAME cloaking in the first place. Going further means DNS-level
blocking, which is what
syntex_firewalldoes on the VPN. - We don't do canvas/audio/WebGL spoofing. That belongs in a content
script, and doing it poorly is worse than not doing it. Firefox RFP
already does this well if you turn it on (
privacy.resistFingerprinting). - We don't fight user-agent fingerprinting on Firefox. The Firefox UA is already the safest UA to send; changing it makes you stand out more, not less. This is the same reason Tor Browser doesn't randomize UAs.
syntex_firewall/firewall/— VPN-side DNS + firewall using the same domain lists. Extension is the browser-side lens on the same data.- ART / Nemesis — unrelated. This is not a learning system, it's a static filter + live obfuscator. Simpler is the right answer here.