Contribute

You do not need to be a programmer.

The most valuable contributions come from people who own the hardware and can check whether what we published is true on their model.

The two-minute version

Vendors move settings between firmware versions and between countries. A guide that sends someone to a menu that does not exist on their television loses them for good. Every menu path we publish is marked either verified or needs confirmation, and almost all of them are the latter.

So: open your TV's settings, compare them to your vendor page, and tell us what you actually see. That fixes the guide for everyone with that model.

Correct a menu pathFind your page first

Report what your TV contacts

This is how the dataset and the blocklists improve. You need a filtering resolver already running: Pi-hole, AdGuard Home or a NextDNS account. If you do not have one,set one up first, since it helps you either way.

python collector/router/fightback.py \
  --source adguard-file --log /opt/AdGuardHome/data/querylog.json \
  --device 192.168.1.42 \
  --vendor lg --model "LG OLED C3" --platform webos \
  --os-major 8 --region GB --acr optout --scenario idle \
  --preview

It reads your query log, strips everything identifying, and prints the exact file it would upload. Read it. If you are happy, add --submit and it opens a pull request.

Nothing leaves your machine until you ask. Local-only is the default, and there is no code path that uploads a report you have not been shown first.

Not comfortable with the command line? Use thereport formand paste only the hostnames.

Do not paste a raw log file or packet capture. Your Pi-hole and AdGuard Home logs contain the address of every device in your house and the hostnames you chose for them. We cannot accept them.

What a report contains, field by field

CollectedNever collected
Vendor and model family
Platform and firmware major version
Country, two letters
Menu language
Whether content recognition was off
Hostnames contacted, with identifiers removed
Port, protocol, count
First and last seen, rounded to the hour
Your IP address, and the TV's
MAC addresses
Serial numbers and device identifiers
Your Wi-Fi network name
Hostnames of your other devices
URL paths and query strings
Any payload content
City, postcode, coordinates, timezone
Timestamps finer than an hour

The right-hand column does not exist in the schema, so a report cannot carry one even by accident. The full policy ·The schema

Hostnames get rewritten before they leave your machine

Vendors put identifiers inside hostnames. A television looking up3f2504e0-4f89-11d3-9a0c-0305e82c3301.metrics.example.com has just published something unique to your household in a DNS query. Stored as-is, every row of the dataset would be a household identifier.

So it becomes {id}.metrics.example.com before anything is sent.

A numeric suffix is treated differently. eu-acr3.alphonso.tv becomeseu-acr{n}.alphonso.tv, because that pattern is a vendor's regional server layout rather than anything about you, and throwing it away would lose real signal for no privacy gain.

Add endpoint data

The blocklists are generated. Do not edit anything in blocklists/. Editdata/endpoints/<vendor>.yml instead:

- domain: acr-eu-prd.samsungcloud.tv
  purpose: acr
  tier: core
  safe_to_block: true
  breaks: null
  source: https://arxiv.org/html/2409.06203v1

The breaks field matters more than the domain. A list that kills someone's Netflix does more harm than the tracking it prevents. If you do not know what a domain breaks, write unknown and it stays out of the default list.

What we will decline

  • Exploit code, root procedures, or firmware patches. We explain what root achieves and link the projects that maintain it.
  • Anything that decrypts traffic or bypasses certificate pinning.
  • Collecting more identifying data, however useful it would be for analysis.
  • Duplicating HaGeZi. Their lists are excellent and rebuilt daily. We add annotation and per-model evidence, not more domains for their own sake.

Why those limits exist


Start somewhere