Version 9.05 is available in the Chrome Web Store
Pushed version 9.1 to the CWS, changelog
1. Fallback to AdGuard Base only, because optimized has lower update frequency (and I optimize it myself anyway)
2. Added (optional, disabled by default) the two most abused fingerprint protections of privacy Inspector (time-zone and battery-staus)
3. Updated programming principles to V5
4. Updated filterlists
Picture of updated Filter (block) list panel
What's new in the programming principles V5
Like 3P-Matrix-lite and Download Sentinel have matured and have not gotten updates for some time, uBlock Stripped also matured with V 9.1 (no more features planned).
Becaue it is raining in NL, I finally found the time to setup a framework of verification and validation tools. These tools reduce the regression test efforts for (maintenance) updates.
Again I want to thank
@Jan Willy for his all his test work, improvement suggestions and additional feature suggestions, also
@Morro for the context menu suggestion (providing access to powertools in the context menu, allowed for a simpler user interface) and
@oldschool for reminding me on the less is more principle from time to time.
The external tools and project's own verifications tests add up to a tech stack which matches professional development teams
Here is the list
External tools
node --check — Purpose: validates JS syntax on every file. Benefit: catches a typo that would silently crash the extension at load time.
ESLint — Purpose: static code analysis (unused variables, coding-style rules). Benefit: catches real bugs and enforces conventions before they ship.
JSDOM — Purpose: loads real HTML into a simulated browser and actually runs the page's JS against it. Benefit: catches runtime failures (like a script referencing an element that doesn't exist) that pure syntax checking can't see.
Knip — Purpose: scans the whole codebase for files/exports nothing uses anymore. Benefit: keeps dead code from quietly piling up.
depcheck — Purpose: checks every dependency is actually used, and every import has a matching dependency declared. Benefit: no bloat, no surprise missing packages.
stylelint — Purpose: custom rules checking colors/opacity values against verified, computed contrast ratios. Benefit: catches unreadable text (bad contrast) automatically instead of relying on someone spotting it by eye.
madge — Purpose: detects circular dependencies in the code's import graph. Benefit: catches architecture violations that can cause subtle load-order bugs.
jscpd — Purpose: finds copy-pasted code blocks across the project. Benefit: two copies of the same logic tend to drift apart over time — it is used in this project to find violations of Google's nr 1 development rule: re-use what is already available (proven & pristine code)
c8 — Purpose: measures real code coverage of the test scripts. Benefit: shows what's actually being tested instead of guessing.
semgrep — Purpose: a second, independent way (structural/AST-based, not text-based) of verifying the same security-sensitive code paths as one of the custom checks below. Benefit: two different detection methods catch more than either alone.
Custom project-specific checks
CSS/HTML structural validators — Purpose: confirm every CSS and HTML file is well-formed (including catching an unclosed comment that could silently swallow a whole rule). Benefit: prevents a broken stylesheet or markup file from shipping unnoticed.
Functional smoke test — Purpose: actually exercises core modules' real functions (not just checks they parse) against a simulated storage system. Benefit: proves the code behaves correctly across a real sequence of operations, not just that it loads.
Message-routing cross-reference — Purpose: verifies every internal message type has both a registered route and a working handler. Benefit: catches a message that would silently do nothing when sent — no error, just dead on arrival.
Manifest/file-reference cross-reference — Purpose: verifies every file referenced in the manifest and code actually exists on disk, and vice versa. Benefit: catches leftover dangling references or orphaned files from a rename/removal.
DNR rule-ID range collision check — Purpose: verifies no two features' rule ID ranges overlap. Benefit: prevents one feature's rules from silently overwriting another's.
CSS class cross-reference — Purpose: verifies every CSS class used in the code has a matching style rule, and every style rule is actually used. Benefit: catches dead styling and missing styling in one pass.
regexFilter constraint checker — Purpose: verifies every regex-based blocking rule is actually compatible with Chrome's rule engine (RE2 syntax, ASCII-only, under the 1000-rule cap). Benefit: catches a rule that would silently fail at runtime in Chrome, not just pass a generic syntax check.
Scriptlet & cosmetic exception-logic testers — Purpose: test the real "allow this one site to bypass a rule" override engine against every hostname combination it needs to handle correctly. Benefit: proves per-site exceptions actually work before shipping, not just in theory.
Cosmetic format-equivalence check — Purpose: compares the new, faster cosmetic-rule storage format against the old format across every real generated filter list. Benefit: proves the performance optimization didn't change actual blocking behavior.
Version-congruence check — Purpose: verifies the extension version, the tools version, the tracked release-state file, and the changelog all agree with each other. Benefit: prevents silent version-number drift (a real incident this project had before this check existed).
JSON syntax / CMP data consistency / popup reference checks — Purpose: three checks verifying config-file validity, cookie-consent-handling data consistency, and that the popup UI's element references are all valid. Benefit: catches specific classes of silent breakage in those particular areas.
Worry-free countdown & reopen tests — Purpose: simulate the Worry-free popup UI and verify the countdown timer displays and updates correctly. Benefit: proves the actual UI behaves correctly, not just that the underlying code exists.
____
During the refactoring of uBO-lite I only found 6 bugs. When you take in to regard the number of lines codes of uBO-lite, it shows how great a programmer Raymond Hill is. I did not report them back, because I was told to @#$%⁻myself when I suggested to stick to uBOL's principles (like Odschool reminded me

). They also told me to develop an extension myself and not bother them anymore (not by GorHill, but his clan of adept followers), which I did

. I also asked for a clarification which I never got (
link), so not feeling any obligation to report it back (although 1 was a serious issue).