This is a targeted patch release fixing bugs identified after the v1.2.0 launch, including a critical regression in the fingerprinting engine, cosmetic filter persistence issues, and minor UI and API correctness fixes.
navigator.platformRegression: Re-introduced platform spoofing to"Win32"was removed again. This was originally deleted in v1.1.4 because it causes a severe OS mismatch for Mac and Linux users (the HTTPUser-Agentheader reports their real OS whileplatformsaysWin32), immediately flagging them as bots to anti-fraud systems like Cloudflare. The property is now left unmodified.- Cosmetic CSS Not Removed on Toggle: Turning off "Block trackers" or disabling protection for a site via the live toggle no longer leaves the cosmetic
<style>block injected in the page.cosmeticFiltering()is now called in thechrome.storage.onChangedhandler and inside theMutationObserverdebounce loop so the CSS state always stays in sync with the current protection state. getBatteryOverride on Instance Instead of Prototype:navigator.getBatterywas overridden directly on thenavigatorinstance, meaning the spoofed function did not propagate into child iframes (each of which has its ownnavigatorinstance). The hook is now applied toNavigator.prototype.getBatteryso it is universally enforced across all frames.updateContentScriptsMissingmatchesField: Thechrome.scripting.updateContentScripts()call that updates theexcludeMatcheslist forinjected.jswas missing the requiredmatches: ["<all_urls>"]field. Without it, Chrome may revert the script's match list to a default empty state, preventing the spoofing payload from running on new pages.- Blocked Counter Not Resetting to Zero: The
chrome.storage.onChangedlistener in the popup usedif (changes.blockedCount), which evaluates as falsy when the count is0. This prevented the displayed counter from resetting when navigating to a new page. Changed toif (changes.blockedCount !== undefined). - Duplicate Cosmetic CSS Selector: Removed a duplicate
div[data-testid="placementTracking"]selector from the cosmetic CSS injection block that was already covered by the adjacent[data-testid="placementTracking"]rule. offsetHeightHook Registration Not Guarded: ThehookedFunctionsregistration forHTMLElement.prototype.offsetHeight's getter now uses a guardedObject.getOwnPropertyDescriptor()call (same asoffsetWidth) to safely skip registration if the descriptor is unavailable, preventing a silentTypeErrorfrom being swallowed by the outertry/catch.navigator.connectionOverride on Instance Instead of Prototype: Same class of bug asgetBattery—Object.defineProperty(navigator, "connection", ...)only overrides the current frame's navigator instance. The connection spoof is now applied toNavigator.prototypeto ensure it propagates into all child iframes.enumerateDevicesOverride on Instance Instead of Prototype:navigator.mediaDevices.enumerateDeviceswas being replaced on themediaDevicesinstance, not the prototype. It is now overridden onMediaDevices.prototype(capturing the native reference first), ensuring every frame's media device enumeration is anonymized.getClientRectsAnti-Fingerprinting Guard Too Restrictive: ThegetClientRectshook requiredthis.style.fontSize(an inline style) to be present before injecting noise. Font fingerprinting scripts typically rely on class-based or inherited CSS styles, not inlinefontSizeattributes, so this condition was silently preventing noise injection for the majority of real fingerprinting attempts. The condition has been removed to match the broader behavior ofgetBoundingClientRect.navigator.languagesReturns Mutable Array: The spoofednavigator.languagesgetter returned a new plainArrayon every call, but the native API returns a frozen array. Fingerprinting scripts can detect the spoof by testingObject.isFrozen(navigator.languages). The getter now returnsObject.freeze([...]).Intl.DateTimeFormatWrapper BreaksnewCalls: The timezone-spoofing wrapper aroundIntl.DateTimeFormatalways callednew OriginalDateTimeFormat(...)internally, even when invoked withoutnew. This is valid per the spec (both forms work), but when called withnew, the wrapper returned an instance from an innernewcall while the outernewcreated a separate empty object. The wrapper now checksnew.targetto properly delegate both call forms.- Whitelist
allowAllRequestsRules MissingresourceTypes: The dynamic DNR rules that whitelist disabled sites usedaction: { type: "allowAllRequests" }but did not includeresourceTypesin the condition. Chrome's DNR API requiresresourceTypesforallowAllRequestsrules — without it, the whitelist rules could silently fail to take effect, leaving whitelisted sites still blocked. - Firefox: Fingerprinting Script Fails to Inject: The
matchOriginAsFallback: trueparameter inchrome.scripting.registerContentScriptsis unsupported in Firefox and causes the entire API call to silently fail. This left Firefox users completely unprotected against fingerprinting. The parameter is now omitted on Firefox. - Firefox: Tracker Counter Shows 0: Firefox does not yet support
chrome.declarativeNetRequest.getMatchedRules. While a fallback was present, calling the API in Firefox MV3 throws an exception rather than returning undefined. This caused the fallback to be skipped entirely, keeping the counter at 0. The exception is now explicitly caught to trigger the fallback tracker count. - UI: Reload Error on Restricted Pages: Toggling a critical setting (e.g., "Block trackers") triggers an automatic page reload. Doing this on a restricted browser page (like
chrome://extensions) would throw an error. The popup now verifies the active tab is an HTTP/HTTPS webpage before attempting a reload. - Analytics Cookies Not Fully Deleted: The
document.cookieclearing script failed to remove tracking cookies that were specifically scoped to root domains (e.g.,domain=.example.com) or subdomains, because it lacked the explicitdomainparameter during deletion. The script now iterates through all domain combinations to guarantee complete eradication of tracking cookies.
This major update introduces complete immunity against EFF "Cover Your Tracks" testing, robust enumerability masking for spoofed APIs, an active ad-wrapper collapser, a native CSS-based cosmetic filtering engine, advanced protections against invisible Font Fingerprinting, and defeats cross-site Link Decoration.
- Deep User-Agent & Header Masking: Integrated DeclarativeNetRequest header modifications to forcefully rewrite User-Agent, Sec-CH-UA, and Accept-Language network headers to match a stable generic Chrome 120 profile.
- Pre-emptive Display Hiding: Re-engineered the content DOM scanner to actively inject
display: none !importantto trackers matched by the database, triggering wrapper collapse flawlessly before the network blocks them. - Global toString Proxying: Advanced trackers can no longer detect spoofed APIs via
Function.prototype.toString.call(). The engine now returns native function signatures for all 15+ hooked APIs. - Active Ad Wrapper Collapser: The mutation observer now actively seeks out parent wrappers (like empty
<div>elements) that surround blocked ad iframes, and completely collapses them to prevent unsightly whitespace. The collapser now uses height-aware logic to avoid accidentally hiding legitimate page containers. - Network-Level Script Blocking: The "Block Scripts" toggle now generates dynamic DNR rules to block 30+ known tracking/analytics script domains (Google Analytics, Hotjar, Clarity, Mixpanel, Segment, etc.) at the network level before they execute, instead of relying on post-execution DOM removal.
- Expanded Cosmetic Selectors: Added CSS hiding rules for Google Ads (
div-gpt-ad), Amazon Sponsored results, Reddit promoted posts (shreddit-ad-post), LinkedIn promoted feed items, and generic newsletter signup popups. - Cookie Consent Banner Eradication: Expanded the cosmetic engine with a global array of CSS selectors targeting the most notorious cookie banner frameworks (e.g., OneTrust, Quantcast). This instantly eradicates over 90% of "We value your privacy" popups without requiring you to click "Reject All".
- YouTube & Social Media Ad Blocking: Upgraded the cosmetic engine to completely hide deeply integrated native ads, including YouTube's "In-Feed Video Ads" (
ytd-ad-slot-renderer) and Facebook/Twitter "Sponsored Posts", which traditional domain-level ad blockers fail to intercept. - Strict URL Tracking Parameter Stripping: Implemented an advanced Declarative Net Request (DNR) dynamic rule that natively intercepts all web requests and surgically purges known tracking parameters (
fbclid,gclid,utm_source,utm_campaign, etc.) from the URL before the browser even loads the page. This destroys cross-site tracking via Link Decoration without breaking legitimate website navigation. - Hardware Media Device Protection: Intercepts
navigator.mediaDevices.enumerateDevices()to prevent trackers from silently building hardware profiles out of your connected microphones and webcams (e.g., masking "Logitech C920" with a generic "Default Webcam" identifier). - Client Hints API Spoofing: Injects a JavaScript proxy over the
navigator.userAgentData.getHighEntropyValues()API to sanitize deep architecture and OS probes, preventing websites from querying granular system specifications. - Native Cosmetic CSS Engine: Replaced the legacy JavaScript-based ad-hiding loop with a native C++ CSS injection engine. The extension now parses a comprehensive list of Adblock Plus-style selectors and pushes them directly into the browser's native rendering pipeline via an injected
<style>block. This results in zero CPU overhead and instantly eradicates ads before they can render, eliminating the "flash of unstyled content". - Font Fingerprinting Protection & Randomizer: Advanced trackers use invisible canvases to measure the exact fractional pixel width of specific text strings to build a hash of the fonts installed on your computer. The extension now intercepts
CanvasRenderingContext2D.prototype.measureTextand element offset getters (offsetWidth,getBoundingClientRect), injecting microscopic dynamic floating-point noise based on deterministic text hashing to completely scramble tracking hashes.
- Enumerable Property Masking: Fixed a critical vulnerability where spoofed properties on
NavigatorandHTMLElementlackedenumerable: true, making them instantly detectable viaObject.keys(). All hooks are now fully enumerable. - Timezone Anonymity Reversal: Removed UTC timezone spoofing and replaced it with America/New_York (EST), moving users from a highly unique 1% anonymity pool to the most common timezone pool.
- Tracker Empty Box Bug: Fixed a bug where native DNR-blocked ads would leave giant empty iframe boxes because they weren't explicitly styled with
display: none. - OffscreenCanvas Fingerprinting Bypass Zero-Day: Discovered and patched a critical architectural bypass where advanced tracking scripts (like FingerprintJS) could instantiate an
OffscreenCanvasto completely sidestep the extension'sHTMLCanvasElementnoise injections. The extension now comprehensively interceptsOffscreenCanvas.prototype.convertToBlob,OffscreenCanvasRenderingContext2D.prototype.getImageData, andOffscreenCanvasRenderingContext2D.prototype.measureText, injecting algorithmic cryptographic noise to completely neutralize off-DOM fingerprinting vectors. - Duplicate WebGL Hooks: Removed duplicate
getParameterandgetExtensionhooks ininjected.jsthat were silently overwriting each other, causing inconsistent GPU fingerprint strings between successive calls. - Duplicate Battery API Hook: Removed a second
navigator.getBatteryoverride that was overwriting the properly-masked version, leaving the duplicate detectable viaFunction.prototype.toString. - Duplicate Client Hints Hook: Removed a conflicting instance-level
getHighEntropyValuesoverride that clashed with the prototype-leveluserAgentDataspoof. - Timezone Contradiction: Fixed a detectable inconsistency where
getTimezoneOffset()returned0(UTC) butIntl.DateTimeFormat.resolvedOptions().timeZonereturned"America/New_York"(EST). Both now consistently report EST (offset300). Intl.DateTimeFormatinstanceof Breakage: Fixed a bug where replacingIntl.DateTimeFormatwith a plain function brokeinstanceofchecks used by libraries like Moment.js. The wrapper now preserves the prototype chain viaObject.setPrototypeOf.- Cosmetic CSS Layout Breakage: Reduced cosmetic filtering from 8 overkill CSS properties (
height:0,width:0,position:absolute,top:-9999px, etc.) to justdisplay: none !important, eliminating layout reflows and broken page structures. - Broad Selector False Positives: Removed dangerous
[class*="sponsor"]and[class*="promoted"]selectors that were hiding legitimate content sections (e.g., "Event Sponsors" on conference sites). Replaced with specific class targeting. - Ad Wrapper Collapser False Positives: The collapser previously hid ANY div with a single hidden child element. Now only collapses parent divs of confirmed tracker iframes/images, and only when the parent is smaller than 400px (ad-slot sized).
- Toggle Buttons Not Taking Effect: Fixed all Advanced Options toggles (Block trackers, HTTPS upgrade, Script blocking, Fingerprint protection) to automatically reload the active tab after toggling, so the user immediately sees changes.
navigator.connectionMissing Events: The network connection spoof was missingaddEventListener/removeEventListener/dispatchEventstubs, causingTypeErroron sites that listen for connection change events.- Code Quality & Unhandled Exceptions: Fixed multiple unhandled
catchblocks incontent.jsthat suppressed ancestor origin parsing errors silently. Cleaned up unused spoofing variables ininjected.jsto ensure zero ESLint warnings across the entire MV3 architecture.
This is a comprehensive pre-release focusing on deep architectural bug fixes, fixing critical vulnerabilities in the fingerprinting spoofing engine, and resolving major UI race conditions.
- Live Tracker UI Desync: Fixed a performance optimization regression that severed the link between the content scanner and the popup UI, ensuring the "Detected Trackers" list repopulates instantly as you browse.
- Settings Merge Corruption: Rewrote the extension version update mechanism to safely merge custom legacy user settings using object spreading, preventing customized preferences from breaking on new version updates.
- Chrome Privacy 100+ Counter Limit: Implemented a smart UX workaround for Chrome's native privacy restriction (which hard-caps rule logs at 100). The extension UI now displays
100+rather than awkwardly freezing at 100 on heavy pages. - Canvas Context WebGL Corruption: Identified and fixed an extremely subtle bug where the anti-fingerprinting script would permanently lock WebGL canvases into a
2dmode. The extension now tracks context types safely via aWeakMap, protecting complex 3D web games. - Whitelist Enforcement Bypass (Cookies): Fixed a logic bug where the extension would aggressively delete analytics cookies (like
_ga) on every page load, even if the user had explicitly whitelisted the site. The cookie protection module now properly respects thesiteProtectionEnabledstate, preventing it from accidentally breaking login flows or analytics on trusted domains. - OS Fingerprint Anomaly (Bot Detection): Removed a major vulnerability where the extension spoofed
navigator.platformto"Win32". Because modifying the HTTPUser-Agentheader globally breaks websites, Mac and Linux users were broadcasting a severe OS mismatch to the internet (e.g.,User-Agentsays Mac, butplatformsays Windows). This immediately flagged users as bots to modern anti-fraud systems like Cloudflare, leading to endless CAPTCHAs. Theplatformspoofing has been removed to ensure environmental consistency. - Extension Fingerprint Leak: Removed a dangerous privacy vulnerability where the
manifest.jsonpublicly exposed internal files (injected.jsandtrackers.json) to the internet viaweb_accessible_resources. This allowed malicious sites to blindly probe forchrome-extension://<id>/trackers.jsonto detect if the extension was installed. The extension is now completely cloaked from website detection. - DNR Domain Filter Over-Blocking: Fixed a massive collateral damage bug in the blocklist generation script (
generate_rules.js). The Declarative Net Request (DNR) engine was previously configured without domain anchors (usingurlFilter: domaininstead ofurlFilter: "||domain"), causing the browser to block any URL that merely contained an ad network's name in the query string or path (e.g.,https://github.com/issues?q=doubleclick.net). Rebuilt the entire 3,500+ rule dataset to ensure strict hostname matching, saving countless legitimate websites from being broken. - Global Settings Bypass: Fixed a critical logic flaw where the dynamic script injection engine (implemented in the previous version to stop DOM hijacking) evaluated only the site-specific whitelist but completely ignored the global "Fingerprint Protection" UI toggle. The Service Worker now rigorously verifies the global setting and will completely unregister the spoofing payload from the browser if the user globally turns off fingerprint protection.
- CPU Leak on Whitelisted Domains: Fixed a significant performance bottleneck where the content scanner's
MutationObserverremained permanently attached to the webpage DOM even on fully whitelisted websites. While the callback safely returned early, the browser was needlessly evaluating tens of thousands of DOM mutations on heavy single-page apps (like YouTube). The extension now dynamically callsobserver.disconnect()the moment a site is whitelisted, guaranteeing absolutely zero CPU overhead on trusted domains. - DOM Event Hijacking (Protection Bypass): Discovered and patched a critical zero-day vulnerability where malicious tracking scripts could forge the
UbiquiShieldDisableDOM event to permanently turn off the extension's fingerprinting protection for that session. Shifted the anti-tracking execution architecture from a staticmanifest.jsoninjection to a highly secure dynamicchrome.scriptinginjection. The Service Worker now natively updates the browser'sexcludeMatcheslist when a user whitelists a site, entirely eradicating the hijacking attack vector and allowing the removal of fragile Javascript-layer API restoration code. - Shadow DOM Tracker Evasion: Advanced advertising networks hide pixels inside Shadow DOM web components to evade adblocker DOM scanners. The extension now natively hooks into
window.performance.getEntriesByType("resource")to bypass the DOM entirely and instantly catch all hidden requests. - Whitelist Restoration Dead Code: Fixed a major bug where whitelisting a site would fail to turn off the fingerprinting protection. By skipping the standard initialization sequence to save CPU cycles on whitelisted domains, the
content.jsscript was inadvertently failing to dispatch theUbiquiShieldDisablesignal toinjected.js. The extension now explicitly broadcasts this disable signal whenever it detects a whitelist state on load or via a live UI toggle. - SPA Tracker Accumulation Regression: Fixed a regression where Single Page Applications (like YouTube or React-based sites) navigating via
history.pushStatewould endlessly accumulate trackers across virtual page loads. The background Service Worker now monitorschangeInfo.urlevents to ensure tab telemetry is correctly reset during virtual SPA navigations. - Mathematically Invalid DOMRect Spoofing: Overhauled the Font Fingerprinting algorithm to fix a mathematically impossible box spoofing anomaly. Previously, the anti-fingerprinting script returned plain Javascript objects instead of native
DOMRectprototypes, which instantly triggered anti-bot mechanisms. Furthermore, it spoofed boxwidthwithout updating therightcoordinate, creating an impossiblex + width !== rightgeometry. The script now leverages nativenew DOMRect(...)constructors andProxywrappers to mathematically align the spoofing and seamlessly passinstanceofprototype checks. - Destructive WebRTC Override Removal: Cleaned up the anti-fingerprinting payload by confirming the removal of destructive Javascript WebRTC hooks (like overriding
RTCPeerConnection.prototype.createDataChannel). Instead of crashing legitimate video calling apps (like Discord Web or Google Meet) at the Javascript layer, the extension correctly and safely relies entirely on Chrome's native privacy API (chrome.privacy.network.webRTCIPHandlingPolicy) to prevent IP leaks at the browser level. - Iframe Top-Level Domain Whitelist Check: Fixed a critical issue where cross-origin iframes (like Google Sign-In or Stripe payments) would remain blocked/spoofed even if the parent website was explicitly whitelisted by the user. The extension now utilizes
window.location.ancestorOriginsto dynamically query the top-most parent domain, ensuring the user's whitelist intent is universally respected across all nested frames. - Audio API Whitelist Restoration Crash: Fixed a fatal
ReferenceErrorexception in the spoofing restoration sequence. Previously, if a user whitelisted a site, the script would crash when attempting to restore theAudioBufferandAnalyserNodeAPIs due to an improperconstblock-scoping declaration. The restoration logic now properly resets the audio APIs natively without crashing. - Iframe Tracker Evasion (Anti-Fingerprinting Bypass): Advanced trackers loaded inside hidden, cross-origin
<iframe src="...">tags orabout:blankframes were able to bypass the extension's execution sandbox. The extension now strictly enforcesall_frames: trueandmatch_about_blank: trueacross all MV3 content scripts, guaranteeing spoofing hooks are injected into every single child frame embedded on a webpage. - Cross-Tab Telemetry Bleed (State Corruption): Fixed a race condition where background tabs triggering a navigation event or finishing a payload request would erroneously overwrite the global
blockedCountstate. The Service Worker now strictly verifies that a tab is actively focused in the current window before pushing its telemetry to the UI local storage. - Async Injection Delay (Anti-Fingerprinting Bypass): Refactored the injection architecture to fix a massive vulnerability where
<head>trackers could bypass fingerprinting protections.injected.jsis now executed synchronously atdocument_startdirectly viamanifest.json'sMAINworld container, guaranteeing zero-day spoofing before any page scripts execute. - Screen Anomaly Detection (Physical Impossibility): Fixed an anomaly where locking the screen size to
1920x1080could inadvertently flag users with larger monitors as spoofers if their window width exceeded 1920px. The screen bounds are now dynamically calculated to never fall below the browser's physical outer boundaries. - HTTPS Upgrade Rule Activation: The "HTTPS Upgrade" UI toggle has been properly wired into the
background.jsDeclarative Net Request engine. The extension now dynamically enforces anupgradeSchemenetwork rule for allhttp://traffic whenever the setting is enabled. - Audio Fingerprinting Hole (
AnalyserNode): Fixed a vulnerability where advanced trackers could bypass the offline audio buffer spoofing by using a real-timeAnalyserNodeoscillator. The extension now safely hooksgetFloatFrequencyDataandgetByteFrequencyDatato inject real-time mathematical noise. - Screen Resolution Fingerprinting: The extension now actively intercepts and standardizes the
window.screenobject, preventing trackers from fingerprinting your unique hardware screen dimensions, color depth, and pixel depth. - SPA Tracker Bleed (Endless Accumulation): Fixed a logic flaw where Single Page Applications (like YouTube or React sites) would push history states without triggering a
"loading"event, causing trackers from previous pages to infinitely accumulate into the current page's count. - Whitelist Visual Flicker (Race Condition): Patched an initial load race condition where the extension would aggressively block trackers and cosmetically filter the DOM before the asynchronous
chrome.storage.local.getcallback verified if the user had disabled the shield. Whitelisted sites now load flawlessly without initial flickering. - Timezone Offset Fingerprinting: Timezone spoofing has been upgraded. While
Intl.DateTimeFormatwas previously mocked to UTC, bot-detection scripts usedDate.prototype.getTimezoneOffset()to extract the real local offset (e.g.-300). We now hook the nativeDateprototype to strictly return0, ensuring 100% cryptographic consistency. - 2D Canvas
getImageDataFingerprinting Hole: Fixed a hole where fingerprinting scripts could bypass our visual canvas noise injections by directly reading the memory buffer viagetImageData. The extension now interceptsgetImageDataand injects cryptographic noise directly into the pixel array. - Sub-Pixel Font Fingerprinting Hole: Advanced trackers exploit
getBoundingClientRectto extract high-precision float values (e.g.12.1524px) from text to uniquely identify font rendering engines. The extension now safely interceptsgetBoundingClientRectandgetClientRectsto inject sub-pixel variance, blinding font trackers. - Fatal UI ReferenceError Crash: Fixed a critical regression in the React popup (
App.jsx) where a dangling reference to a removed state variable (setTrackers) would silently crash the initialization effect, breaking the "Shields Down" toggle syncing.
- Massive Ad Blocker Engine Upgrade: Generated a new declarative ruleset based on Peter Lowe's ad server list, expanding the network blocklist from 23 to over 3,500 active tracking and advertising domains.
- Font Fingerprinting Protection: Spoofs
offsetWidthandoffsetHeightfor hidden<span>tags to prevent scripts from identifying installed system fonts. - WebRTC IP Leak Protection: Configured
chrome.privacy.network.webRTCIPHandlingPolicyto hide local IP addresses while maintaining compatibility with web conferencing tools. - Network Spoofing: Simulates a generic 4G connection profile via
navigator.connectionto reduce entropy.
- WebGL Fingerprinting Protection: Injects subtle noise into the pixel data buffer of
WebGLRenderingContext.readPixelsto disrupt canvas/WebGL image extraction techniques.
- Counter Synchronization Issue: Fixed a bug where the blocked counter in the popup remained at 0 while trackers were successfully blocked in the background. The popup now polls the background script while open to ensure the counter updates in real-time.
- Tab Switch Reset Bug: Fixed an issue introduced in v1.1.2 where switching between tabs would incorrectly wipe the tracking history for the tab, causing the blocked counter to reset to 0.
- Critical syntax error in
WebsiteStatusCard.jsx: orphaneduseEffectplaced outside the component function body, referencing undefinedhostnameandsetShieldsEnabledvariables, causing a crash if imported. - Undefined
setHostname()call insideWebsiteStatusCard.jsxthat would throw aReferenceErrorat runtime. - Storage key mismatch in
TrackerIntelligenceCard.jsx: was readingtrackersinstead ofdetectedTrackers, causing the tracker list to always appear empty. App.jsxnever populated thehostnamestate, preventing per-site toggle messages from being sent to the background script (thetoggleSitemessage was silently skipped).App.jsxnever loadedsiteSettingson popup open, causing the shield toggle to always show "Shields up" even when protection was disabled for the current site.- Global
currentWebsitevariable inbackground.jscaused blocked request counts to reset to 0 on every tab switch; replaced with per-tab hostname tracking viatabHostnamesmap. cosmeticFiltering()incontent.jsran unconditionally regardless oftrackerBlockingsetting; added guard to respect the setting.- Storage change listener in
App.jsxwas never cleaned up, causing duplicate listeners in React StrictMode and potential memory leaks. - Canvas fingerprint protection in
injected.jscould interfere with WebGL canvases by forcing a 2D context; added try-catch guard. toBlobcanvas override had inconsistent indentation and same WebGL interference issue astoDataURL.- Battery API spoof returned a plain object missing
addEventListener/removeEventListener/dispatchEventstubs, causingTypeErroron sites that listen for battery events. - Tab switch handler in
background.jsusedchrome.tabs.queryinstead ofchrome.tabs.getwith the activated tab ID, which was less efficient and slightly racy.
- Dead
extension/settings.jsfile that used ES module exports but was never bundled or imported by any extension script. - Four unused async helper functions from
background.js(getSiteSettings,saveSiteSettings,getCurrentHostname,isProtectionEnabled) that duplicated logic already handled inline by theonMessagehandler.
- WebGL2 fingerprint protection via overriding
WebGL2RenderingContext.prototypemethods (getExtension,getParameter). - 15 new high-impact Declarative Net Request rules in
rules.json(such as Google Tag Manager, TikTok, LinkedIn, Reddit, Twitter, Bing, Mixpanel, Segment, HubSpot, Quantcast, Comscore, AppNexus, AdRoll, FullStory, and Mouseflow), expanding network-level blocking to match the tracker database. - Dynamic loading of tracker database from
trackers.jsonincontent.jsviachrome.runtime.getURL(). - Per-site protection toggle support in
content.js, readingsiteSettingsand skipping tracker/cosmetic protections if disabled. - Production-safe per-tab blocked tracking in
background.jsusingdeclarativeNetRequest.getMatchedRulespolling to resolve the issue where the debug counter stayed at 0 in production.
- Cosmetic filtering safety: replaced overly broad
[id*="ad"]and[class*="ad"]attribute selectors with safe hyphen-bounded patterns ([id^="ad-"],[id$="-ad"],[class*="-ad-"], etc.) and specific selector lists for major ad providers. Removed generic[class*="banner"]to fix layout breaks on major sites. - Content script injection model: registered
content.jsvia manifest declarations to run atdocument_idlefor compatibility first, avoiding runtime script loading issues. - Code hygiene: completely removed Vite default scaffold styling boilerplate in
client/src/App.cssand fixed the extension popup's document title.
- Pre-existing malformed JSON syntax bug in
trackers.json(orphaned trailing records merged, duplicates cleaned up). - Missing content script declarations causing content script not to load on any page.
- Uncaught ReferenceError on page load from an undefined
enableFingerprintProtection()function call incontent.js. - Dead MV2-only permissions (
webRequestandwebRequestBlocking) inmanifest.jsonpreventing successful modern MV3 security audit. - Intermittent rule ID gaps in
rules.jsoncausing declarative net request rules to fail to register.
- Advanced fingerprint protection
- Canvas fingerprint protection
- WebGL fingerprint protection
- Hardware concurrency spoofing
- Device memory spoofing
- Platform spoofing
- Improved tracker detection
- Website compatibility
- Protection engine stability
- Extension performance
- Privacy controls
- LinkedIn compatibility issues
- YouTube loading issues
- Fingerprint protection conflicts
- Extension stability issues
Initial release.
- Tracker blocking
- Ad blocking
- HTTPS upgrade
- Script blocking
- Third-party cookie cleanup
- Per-site controls