A zero-cost, purely deterministic, client-side shield against deceptive UX and dark patterns
TypeScript
0
13 commits
updated Sep 18, 2026
A small Chrome extension that hides cookie walls, newsletter pop-ups, fake countdown timers, app-install nags, and other dark patterns. It works from plain-text filter lists, the same way uBlock Origin's cosmetic filters do. There is no AI in it, no server, and nothing is sent anywhere.
example.com##.newsletter-overlay. If the site and selector are on the list, the element is hidden before the page paints. If they aren't, nothing happens.Not in the Chrome Web Store yet.
From a release zip:
spades-ux-shield-v1.0.4.zip from Releases.manifest.json should be at the top level of the folder.chrome://extensions, turn on Developer mode, click Load unpacked and pick that folder.From source:
git clone https://github.com/vinayak509143/spades-ux-shield.git
cd spades-ux-shield
npm install
npm run update-filters
npm run build
Then Load unpacked on the repository folder (the one with manifest.json).
Three content scripts run at document_start on every page. The first stamps <html> with the hostname and its parents (data-op-h="www.amazon.in amazon.in in"), so bundled CSS can be scoped as html[data-op-h~="amazon.in"] .selector. The second is a couple of kilobytes of CSS for the most common hides. The third starts a MutationObserver, but only if the current site has procedural rules (:has-text, :uncheck and so on). Most sites never start it.
The service worker keeps my list in chrome.storage.local, split into shards by domain, and injects the matching CSS with chrome.scripting.insertCSS when a page commits.
Filter syntax is the usual host##selector with a few procedural extras. Details in ARCHITECTURE.md.
Site rules go in spades-ux-shield-filters, either as an issue or a PR to lists/base.txt. Engine changes go here; run npm test first, and npm run test:e2e if you touch injection.
CONTRIBUTING.md lists what is off limits: checkout, payment, login and account-cancellation flows. Before calling a site fixed, go through docs/HOLDOUT_PROTOCOL.md.
Engine code is MIT. third-party-rules.txt is an extract of GPL-3.0 / CC BY-SA 3.0 lists and keeps those licences. See ATTRIBUTION.md.
Privacy: PRIVACY.md. Short version: nothing leaves your browser unless you click the report link.
It's free and there is no paid tier. If you'd like to cover the Web Store fee or a coffee: ko-fi.com/spadesxx. Starring the repo or sending in a rule helps just as much.
13 commits
TypeScript
72.7%
JavaScript
19.8%
Python
5.2%
HTML
1.3%
CSS
1.1%
A zero-cost, purely deterministic, client-side shield against deceptive UX and dark patterns
TypeScript
0
13 commits
updated Sep 18, 2026
A small Chrome extension that hides cookie walls, newsletter pop-ups, fake countdown timers, app-install nags, and other dark patterns. It works from plain-text filter lists, the same way uBlock Origin's cosmetic filters do. There is no AI in it, no server, and nothing is sent anywhere.
example.com##.newsletter-overlay. If the site and selector are on the list, the element is hidden before the page paints. If they aren't, nothing happens.Not in the Chrome Web Store yet.
From a release zip:
spades-ux-shield-v1.0.4.zip from Releases.manifest.json should be at the top level of the folder.chrome://extensions, turn on Developer mode, click Load unpacked and pick that folder.From source:
git clone https://github.com/vinayak509143/spades-ux-shield.git
cd spades-ux-shield
npm install
npm run update-filters
npm run build
Then Load unpacked on the repository folder (the one with manifest.json).
Three content scripts run at document_start on every page. The first stamps <html> with the hostname and its parents (data-op-h="www.amazon.in amazon.in in"), so bundled CSS can be scoped as html[data-op-h~="amazon.in"] .selector. The second is a couple of kilobytes of CSS for the most common hides. The third starts a MutationObserver, but only if the current site has procedural rules (:has-text, :uncheck and so on). Most sites never start it.
The service worker keeps my list in chrome.storage.local, split into shards by domain, and injects the matching CSS with chrome.scripting.insertCSS when a page commits.
Filter syntax is the usual host##selector with a few procedural extras. Details in ARCHITECTURE.md.
Site rules go in spades-ux-shield-filters, either as an issue or a PR to lists/base.txt. Engine changes go here; run npm test first, and npm run test:e2e if you touch injection.
CONTRIBUTING.md lists what is off limits: checkout, payment, login and account-cancellation flows. Before calling a site fixed, go through docs/HOLDOUT_PROTOCOL.md.
Engine code is MIT. third-party-rules.txt is an extract of GPL-3.0 / CC BY-SA 3.0 lists and keeps those licences. See ATTRIBUTION.md.
Privacy: PRIVACY.md. Short version: nothing leaves your browser unless you click the report link.
It's free and there is no paid tier. If you'd like to cover the Web Store fee or a coffee: ko-fi.com/spadesxx. Starring the repo or sending in a rule helps just as much.
13 commits
TypeScript
72.7%
JavaScript
19.8%
Python
5.2%
HTML
1.3%
CSS
1.1%