Business & Finance
Show HN: I made a tool that prevents websites from tracking you
Key Points
GetBlocked! is a lightweight, local-only Chrome extension that helps reduce common third-party website tracking by blocking known tracker requests, cleaning tracking links, and explaining tracking attempts. It is built as a small, inspectable Manifest V3 project for people who want a friendly privacy tool and for contributors who want quick, useful pull requests. - Blocks a curated starter list of known third-party tracker domains using Chrome declarativeNetRequest .
Cleaner pages. Fewer trackers. Local-only.
GetBlocked! is a lightweight, local-only Chrome extension that helps reduce common third-party website tracking by blocking known tracker requests, cleaning tracking links, and explaining tracking attempts.
It is built as a small, inspectable Manifest V3 project for people who want a friendly privacy tool and for contributors who want quick, useful pull requests.
- Blocks a curated starter list of known third-party tracker domains using Chrome
declarativeNetRequest
. - Cleans common tracking URL parameters such as
utm_source
,fbclid
,gclid
,dclid
,mc_cid
, and similar campaign IDs. - Detects visible tracking attempts such as pixels, suspicious scripts, tracking iframes, and tracking links.
- Shows a compact popup report with:
- Blocked on this page
- Tracking links cleaned
- Visible tracking attempts detected
- Detected categories
- Keeps report data local in
chrome.storage.local
.
GetBlocked! blocks a curated starter list of known third-party tracker domains and tracking URL parameters.
Current coverage includes:
- Analytics trackers
- Ad and retargeting trackers
- Social media pixels
- Session replay and heatmap tools
- Affiliate and attribution trackers
- Email marketing trackers
- Tracking URL parameters
The tracker list is intentionally conservative. Rules are limited to third-party requests to reduce website breakage.
- It does not block every tracker.
- It does not make users anonymous.
- It does not stop tracking after logging into an account.
- It does not stop server-side tracking.
- It does not fully prevent advanced fingerprinting.
- It is not meant to replace full-featured ad blockers.
GetBlocked! is:
- Lightweight: small ruleset, simple popup, minimal moving parts.
- Local-only: no external analytics, telemetry, or remote logging.
- Open source: the rules, popup, and generation scripts are inspectable.
- Educational: categories and wording are designed to explain common tracking clearly.
- Beginner-friendly: small PRs can improve the tracker catalog, docs, tests, or UI.
- Not a replacement for full ad blockers: it focuses on common trackers and clear explanations.
GetBlocked! does not send browsing data to any server. The extension uses:
declarativeNetRequest
for local Chrome-managed request blocking.chrome.storage.local
for page report data.- A content script that scans the current page locally for visible tracking signals.
There are no external analytics, telemetry endpoints, remote logs, or bundled remote assets in the extension.
- Download or clone this repository.
- Open
chrome://extensions
. - Turn on Developer mode.
- Choose Load unpacked.
- Select the GetBlocked! project folder.
- Pin GetBlocked! and open the popup on normal web pages.
The production build avoids debug-only DNR feedback permissions. The popup uses local page signals plus Chrome's production DNR action-count badge as a page-level estimate, while blocking and URL-cleaning rules remain enforced by MV3 declarativeNetRequest
.
The easiest way to contribute is to add one tracker domain.
- Edit shared/tracker-catalog.json.
- Add one fixture in test/tracker-test-set.json.
- Run
npm run generate:rules
. - Run
npm run test:evidence
. - Open a PR.
PRs are welcome for tracker-domain additions, broken-site tests, UI polish, docs, and test improvements. You do not need to ask before opening a small, focused PR.
Tracker domains are maintained in shared/tracker-catalog.json.
Each tracker entry includes:
domain
category
label
notes
Tracking URL parameters are maintained in shared/tracking-params.json.
After changing the catalog or tracking parameter list, regenerate the derived extension files:
npm run generate:rules
This updates:
- rules/rules.json, used by Chrome
declarativeNetRequest
. - shared/config.js, used by the content script and popup category detection.
Do not edit generated rules/config by hand unless you also update the generator or source catalog.
Regenerate rules:
npm run generate:rules
Run the local ruleset evidence test:
npm run test:evidence
Useful syntax checks:
node --check background.js
node --check content-script.js
node --check popup/popup.js
node --check scripts/generate-rules.mjs
node --check scripts/evaluate-test-set.mjs
Useful JSON checks:
node -e "for (const f of ['manifest.json','rules/rules.json','shared/tracker-catalog.json','shared/tracking-params.json','test/tracker-test-set.json','package.json']) JSON.parse(require('fs').readFileSync(f,'utf8')); console.log('JSON OK')"
After loading the unpacked extension, start a simple local server from this folder:
python -m http.server 8080
Then open:
http://localhost:8080/test/manual-test.html?utm_source=demo&utm_medium=test&fbclid=manual
With GetBlocked! enabled, the tracking parameters should be removed from the page URL and the popup should show page-level tracker activity. For a before/after check, compare the browser Network panel with the extension disabled and then enabled.
- Contributing guide
- Adding trackers
- Broken sites
- Development guide
- Good first issues
- Labels guide
- Launch copy
- Security policy
MIT License. See LICENSE.