User Tools

Site Tools


provenance:programming:filter_lists

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
provenance:programming:filter_lists [2026/08/29 13:25] – Record that privacy:requests' script had already solved the ground-truth fold correctly with a purpose-built regex, so reusing the shared fold for that one field was the regression. Authored by Claude karel.kubicek.claudeprovenance:programming:filter_lists [2026/08/29 13:38] (current) – Record the precision correction in full: the two ambiguous-family signals, the two false positives they cost in testing, all seven printed exclusions, why the residue could not have caught this (it answers 'what did I miss', not 'what did I wrongly admit' karel.kubicek.claude
Line 34: Line 34:
  
 ^ ''kind'' ^ Meaning ^ Qualifies? ^ Papers ^ ^ ''kind'' ^ Meaning ^ Qualifies? ^ Papers ^
-| ''list'' | a rule set you can download | **yes** | 198 |+| ''list'' | a rule set you can download | **yes**, if the tuple's own context is not off-topic 194 |
 | ''engine'' | code that evaluates rules (''adblockparser'', ''adblock-rust'', ''tracker-radar-collector'') | no | 30 across 6 families | | ''engine'' | code that evaluates rules (''adblockparser'', ''adblock-rust'', ''tracker-radar-collector'') | no | 30 across 6 families |
 | ''heuristic'' | a classifier shipped inside a blocker that is not a list (Privacy Badger) | no | — | | ''heuristic'' | a classifier shipped inside a blocker that is not a list (Privacy Badger) | no | — |
Line 40: Line 40:
  
 ^ Query ^ Population ^ Denominator ^ Result ^ ^ Query ^ Population ^ Denominator ^ Result ^
-| papers using or producing a filter list | whole corpus | 5,859 | **198** (3.4%) | +| papers using or producing a filter list | whole corpus | 5,859 | **194** (3.3%) | 
-| … named in ''tools[]'' | population | 198 178 +| … named in ''tools[]'' | population | 194 177 
-| … named in a ''classification[]'' step | population | 198 167 +| … named in a ''classification[]'' step | population | 194 163 
-| … in both | population | 198 147 +| … in both | population | 194 146 
-| … in ''tools[]'' only | population | 198 | 31 | +| … in ''tools[]'' only | population | 194 | 31 | 
-| named a list but only ''mentioned''/''compared'' | whole corpus | 5,859 | 18 (excluded) |+| named a list but only ''mentioned''/''compared'' | whole corpus | 5,859 | 19 (excluded) | 
 +| named a list, used it off-topic (malware / piracy) | whole corpus | 5,859 | 7 tuples, 5 papers (excluded) |
  
-**Why ''mentioned'' and ''compared'' are excluded.** A paper that beats EasyList is not a paper that adopted it. The 18 excluded are 8.4% of the 216 a raw name search would score as adoption.+**Why ''mentioned'' and ''compared'' are excluded.** A paper that beats EasyList is not a paper that adopted it. The 19 excluded are 8.9% of the 213 a raw name search would score as adoption. A further **five papers are excluded on the tuple's context rather than its name** — see //When a list name is right but the use is off-topic// below.
  
-**Difference from [[Privacy:Requests]].** That page's "S1" signal reports **197** where this reports **198**, with per-list counts differing by one or two. Both scripts share ''req_fold.mjs'', so the fold is identical; the difference is the membership rule. ''report_requests.mjs'' builds S1 inside a population that is then intersected with a request-classification task fold and reported after that page's own exclusions; ''report_filter_lists.mjs'' takes every paper the fold fires onwith no topic restriction. **Neither is wrong.** The delta is published on both pages rather than reconciled, because the honest lesson is that a population definition moves a count by a percent or two and belongs in the provenance.+**Difference from [[Privacy:Requests]].** That page's "S1" signal reports **197** where this reports **194**. Both scripts share ''req_fold.mjs'', so the fold is identical; the difference is the membership rule. ''report_requests.mjs'' builds S1 inside a population that is then intersected with a request-classification task fold and reported after that page's own exclusions; ''report_filter_lists.mjs'' takes every paper the fold fires on with no topic restriction, but then applies a tuple-context test that page does not have, which removes five papers whose list name is right and whose use is a malware or piracy blacklist. **Neither is wrong.** The delta is published on both pages rather than reconciled, because the honest lesson is that a population definition moves a count by a percent or two and belongs in the provenance.
  
 ===== Every query on the page ===== ===== Every query on the page =====
Line 56: Line 57:
  
 ^ Figure on the page ^ Population ^ Denominator ^ Value ^ ^ Figure on the page ^ Population ^ Denominator ^ Value ^
-| used or produced a filter list | corpus | 5,859 | 198 (3.4%) | +| used or produced a filter list | corpus | 5,859 | 194 (3.3%) | 
-| EasyList | list-using papers | 198 | 112 (56.6%) | +| EasyList | list-using papers | 194 | 112 (57.7%) | 
-| EasyPrivacy | list-using papers | 198 | 71 (35.9%) | +| EasyPrivacy | list-using papers | 194 | 71 (36.6%) | 
-| Disconnect | list-using papers | 198 | 48 (24.2%) | +| Disconnect | list-using papers | 194 | 48 (24.7%) | 
-| Ghostery / WhoTracks.me | list-using papers | 198 | 34 (17.2%) | +| Ghostery / WhoTracks.me | list-using papers | 194 | 34 (17.5%) | 
-| hosts-file lists | list-using papers | 198 27 (13.6%) | +| hosts-file lists | list-using papers | 194 24 (12.4%) | 
-| ''web-request'' target | papers with a list-backed classification step | 167 | 101 (60.5%) | +| ''web-request'' target | papers with a list-backed classification step | 163 | 101 (62.0%) | 
-| ''domain'' target | papers with a list-backed classification step | 167 53 (31.7%) | +| ''domain'' target | papers with a list-backed classification step | 163 51 (31.3%) | 
-| ''cookie'' target | papers with a list-backed classification step | 167 | 8 (4.8%) | +| ''cookie'' target | papers with a list-backed classification step | 163 | 8 (4.9%) | 
-| "coarser than the list" group | papers with a list-backed classification step | 167 53 (31.7%) | +| "coarser than the list" group | papers with a list-backed classification step | 163 51 (31.3%) | 
-| "objects a list was not written to label" group | papers with a list-backed classification step | 167 30 (18.0%) | +| "objects a list was not written to label" group | papers with a list-backed classification step | 163 28 (17.2%) 
-| ''groundTruthSource'' names a filter list | **whole corpus** | 5,859 | 96 +| papers in more than one granularity group | papers with a list-backed classification step | 163 | 17 
-| … within the list-using population | list-using papers | 198 88 (44.4%) | +| ''groundTruthSource'' names a filter list | **whole corpus** | 5,859 | 92 
-| … where the list is named generically, not by name | papers with a list ground truth | 96 | 13 | +| … within the list-using population | list-using papers | 194 86 (44.3%) | 
-| learned classifier with a filter-list ground truth | whole corpus | 5,859 | 16 papers, 22 tuples | +| … where the list is named generically, not by name | papers with a list ground truth | 92 | 13 | 
-| … of the list-using papers that ran any learned classifier | list-using papers with a learned classifier | 62 | 15 (24.2%) | +| learned classifier with a filter-list ground truth | whole corpus | 5,859 | 15 papers, 20 tuples | 
-| ''validation == not-applicable'' | papers with a list-backed classification step | 167 69 (41.3%) | +| … of the list-using papers that ran any learned classifier | list-using papers with a learned classifier | 60 | 15 (25.0%) | 
-| ''validation == none-reported'' | papers with a list-backed classification step | 167 61 (36.5%) | +| ''validation == not-applicable'' | papers with a list-backed classification step | 163 68 (41.7%) | 
-| ''validation == manual-validation'' | papers with a list-backed classification step | 167 | 34 (20.4%) | +| ''validation == none-reported'' | papers with a list-backed classification step | 163 60 (36.8%) | 
-| ''validation == comparison-to-other-method'' | papers with a list-backed classification step | 167 14 (8.4%) | +| ''validation == manual-validation'' | papers with a list-backed classification step | 163 | 34 (20.9%) | 
-| **papers whose validation is ONLY sentinels** | papers with a list-backed classification step | 167 | **119 (71.3%)** | +| ''validation == comparison-to-other-method'' | papers with a list-backed classification step | 163 12 (7.4%) | 
-| papers with at least one real validation value | papers with a list-backed classification step | 167 48 (28.7%) +| **papers whose validation is ONLY sentinels** | papers with a list-backed classification step | 163 | **117 (71.8%)** | 
-| papers in more than one granularity group | papers with a list-backed classification step | 167 | 17 +| papers with at least one real validation value | papers with a list-backed classification step | 163 46 (28.2%) | 
-| any version or date on the list tool | papers naming a list in ''tools[]''178 | 53 (29.8%) | +| any version or date on the list tool | papers naming a list in ''tools[]''177 | 53 (29.9%) | 
-| a version that identifies the **rules** | papers naming a list in ''tools[]''178 | **4 (2.2%)** |+| a version that identifies the **rules** | papers naming a list in ''tools[]''177 | **4 (2.3%)** |
 | PETS share | PETS papers in corpus | 510 | 55 (10.8%) | | PETS share | PETS papers in corpus | 510 | 55 (10.8%) |
 | NDSS share | NDSS papers in corpus | 701 | 10 (1.4%) | | NDSS share | NDSS papers in corpus | 701 | 10 (1.4%) |
-| 2018–2021 rate | corpus papers 2018–2021 | 1,439 | 58 → 40.per 1,000 | +| 2018–2021 rate | corpus papers 2018–2021 | 1,439 | 57 → 39.per 1,000 | 
-| 2025–2026 rate //(provisional)// | corpus papers 2025–2026 | 1,185 | 39 → 32.per 1,000 |+| 2025–2026 rate //(provisional)// | corpus papers 2025–2026 | 1,185 | 38 → 32.per 1,000 |
 | papers about regional lists | **whole corpus** | 5,859 | 2 | | papers about regional lists | **whole corpus** | 5,859 | 2 |
 | ''adblockparser'' users | whole corpus | 5,859 | 9 | | ''adblockparser'' users | whole corpus | 5,859 | 9 |
Line 101: Line 102:
 === 1. POPULATION ======================================================= === 1. POPULATION =======================================================
    corpus                                                     5859     corpus                                                     5859 
-   USED or PRODUCED a filter list  == POPULATION               198 3.4% of corpus +   USED or PRODUCED a filter list  == POPULATION               194 3.3% of corpus 
-     ... named in tools[]                                      178  +     ... named in tools[]                                      177  
-     ... named in classification[].resourceName                167  +     ... named in classification[].resourceName                163  
-     ... in both                                               147 +     ... in both                                               146 
      ... tools[] only (instrument, never a labelling step)      31       ... tools[] only (instrument, never a labelling step)      31 
-   named a list but only MENTIONED / COMPARED (excluded)        18 +   named a list but only MENTIONED / COMPARED (excluded)        19 
  
  
 === 2. WHICH LISTS, FOLDED  (denominator: the population above) ========= === 2. WHICH LISTS, FOLDED  (denominator: the population above) =========
-   denominator: 198 papers that used or produced a filter list+   denominator: 194 papers that used or produced a filter list
    (a paper naming several lists is counted under each, so shares do not sum to 100%)    (a paper naming several lists is counted under each, so shares do not sum to 100%)
    list family                                              papers  share   spellings  unfolded    list family                                              papers  share   spellings  unfolded
-   EasyList                                                    112   56.6%         28        92 +   EasyList                                                    112   57.7%         28        92 
-   EasyPrivacy                                                  71   35.9%         22        58 +   EasyPrivacy                                                  71   36.6%         22        58 
-   Disconnect                                                   48   24.2%         23        26 +   Disconnect                                                   48   24.7%         23        26 
-   Ghostery / WhoTracks.me                                      34   17.2%          9        20 +   Ghostery / WhoTracks.me                                      34   17.5%          9        20 
-   hosts-file lists (hpHosts, AdAway, MoaAB, Pi-hole, NoTrack, …)     27   13.6%         33         3 +   Adblock Plus (lists shipped with it)                         26   13.4%          8        20 
-   Adblock Plus (lists shipped with it)                         26   13.1%          8        20 +   hosts-file lists (hpHosts, AdAway, MoaAB, Pi-hole, NoTrack, …)     24   12.4%         32         3 
-   uBlock Origin (lists)                                        17    8.6%         11        13 +   uBlock Origin (lists)                                        17    8.8%         11        13 
-   DuckDuckGo Tracker Radar (list)                              15    7.6%          9         8 +   DuckDuckGo Tracker Radar (list)                              15    7.7%          9         8 
-   unnamed / aggregated filter lists                            10    5.1        10         1 +   unnamed / aggregated filter lists                             9    4.6                 1 
-   AdGuard                                                          4.0%         13         4 +   AdGuard                                                          4.1%         13         4 
-   EasyList annoyance / anti-adblock variants                    7    3.5%          8         2+   EasyList annoyance / anti-adblock variants                    7    3.6%          8         2
    anti-adblock scripts and services                                1.5%          4         1    anti-adblock scripts and services                                1.5%          4         1
    cryptomining lists (NoCoin, CoinBlockerLists, MinerBlock)      3    1.5%          4         3    cryptomining lists (NoCoin, CoinBlockerLists, MinerBlock)      3    1.5%          4         3
Line 138: Line 139:
  
 === 3. WHAT THE LIST IS USED TO LABEL  (denominator: papers with >=1 list-backed classification tuple)  === 3. WHAT THE LIST IS USED TO LABEL  (denominator: papers with >=1 list-backed classification tuple) 
-   denominator: 167 papers +   denominator: 163 papers 
-   web-request                                                 101 60.5+   web-request                                                 101 62.0
-   domain                                                       53 31.7+   domain                                                       51 31.3
-   cookie                                                        8 4.8+   cookie                                                        8 4.9
-   website-category                                              7 4.2+   website-category                                              5 3.1
-   javascript                                                    5 3.0%+   javascript                                                    5 3.1%
    other                                                         3 1.8%    other                                                         3 1.8%
    fingerprinting-script                                         3 1.8%    fingerprinting-script                                         3 1.8%
Line 151: Line 152:
  
 -- grouped by granularity -- grouped by granularity
-   The list's own unit — a URL pattern evaluated with request context    101 60.5+   The list's own unit — a URL pattern evaluated with request context    101 62.0
-   Coarser than the list — a hostname or eTLD+1; path, resource-type and $third-party options are discarded     53 31.7+   Coarser than the list — a hostname or eTLD+1; path, resource-type and $third-party options are discarded     51 31.3
-   Objects a filter list was not written to label — the list supplies provenance, not a rule match     30 18.0%+   Objects a filter list was not written to label — the list supplies provenance, not a rule match     28 17.2%
    granularity-fold residue (targets in no group): (none)    granularity-fold residue (targets in no group): (none)
-   papers in MORE THAN ONE granularity group (so shares exceed 100%)     17 of 167+   papers in MORE THAN ONE granularity group (so shares exceed 100%)     17 of 163
  
 -- the papers behind each non-request target, so the claim is checkable -- the papers behind each non-request target, so the claim is checkable
Line 164: Line 165:
      2018 USENIX/who-left-open-the-cookie-jar-a-comprehensive-evaluation-of-third-party-cookie-po  [blocklist] "EasyList and EasyPrivacy"      2018 USENIX/who-left-open-the-cookie-jar-a-comprehensive-evaluation-of-third-party-cookie-po  [blocklist] "EasyList and EasyPrivacy"
      2019 IMC/a-longitudinal-analysis-of-the-ads-txt-standard  [curated-database] "WhoTracksMe"      2019 IMC/a-longitudinal-analysis-of-the-ads-txt-standard  [curated-database] "WhoTracksMe"
-     2019 IMC/shamfinder-an-automated-framework-for-detecting-idn-homographs  [curated-database] "hpHosts" 
      2019 PETS/4-years-of-eu-cookie-law-results-and-lessons-learned  [curated-database] "Ghostery"      2019 PETS/4-years-of-eu-cookie-law-results-and-lessons-learned  [curated-database] "Ghostery"
      2020 PETS/missed-by-filter-lists-detecting-unknown-third-party-trackers-with-invisible-pix  [curated-database] "Disconnect"      2020 PETS/missed-by-filter-lists-detecting-unknown-third-party-trackers-with-invisible-pix  [curated-database] "Disconnect"
Line 182: Line 182:
      2023 IEEE-SP/protected-or-porous-a-comparative-analysis-of-threat-detection-capability-of-iot  [curated-database] "EasyList"      2023 IEEE-SP/protected-or-porous-a-comparative-analysis-of-threat-detection-capability-of-iot  [curated-database] "EasyList"
      2023 USENIX/a-study-of-multi-factor-and-risk-based-authentication-availability  [curated-database] "Disconnect.me tracker list"      2023 USENIX/a-study-of-multi-factor-and-risk-based-authentication-availability  [curated-database] "Disconnect.me tracker list"
-     2023 USENIX/trident-towards-detecting-and-mitigating-web-based-social-engineering-attacks  [curated-database] "Categorical BlockList" 
      2023 PETS/privacy-rarely-considered-exploring-considerations-in-the-adoption-of-third-part  [curated-database] "WhoTracks.me"      2023 PETS/privacy-rarely-considered-exploring-considerations-in-the-adoption-of-third-part  [curated-database] "WhoTracks.me"
      2024 IMC/diffaudit-auditing-privacy-practices-of-online-services-for-children-and-adolesc  [curated-database] "DuckDuckGo Tracker Radar"      2024 IMC/diffaudit-auditing-privacy-practices-of-online-services-for-children-and-adolesc  [curated-database] "DuckDuckGo Tracker Radar"
Line 223: Line 222:
    website-category:    website-category:
      2015 PETS/an-automated-approach-for-complementing-ad-blockers-blacklists  [blocklist] "Adblock Plus EasyList and EasyPrivacy"      2015 PETS/an-automated-approach-for-complementing-ad-blockers-blacklists  [blocklist] "Adblock Plus EasyList and EasyPrivacy"
-     2014 USENIX/automatically-detecting-vulnerable-websites-before-they-turn-malicious  [curated-database] "hpHosts" 
      2019 WWW/cookie-synchronization-everything-you-always-wanted-to-know-but-were-afraid-to-a  [blocklist] "EasyList"      2019 WWW/cookie-synchronization-everything-you-always-wanted-to-know-but-were-afraid-to-a  [blocklist] "EasyList"
      2023 CCS/you-call-this-archaeology-evaluating-web-archives-for-reproducible-web-security  [blocklist] "Disconnect"      2023 CCS/you-call-this-archaeology-evaluating-web-archives-for-reproducible-web-security  [blocklist] "Disconnect"
      2024 PETS/generalizable-active-privacy-choice-designing-a-graphical-user-interface-for-glo  [curated-database] "Disconnect Tracker Protection lists"      2024 PETS/generalizable-active-privacy-choice-designing-a-graphical-user-interface-for-glo  [curated-database] "Disconnect Tracker Protection lists"
      2025 IEEE-SP/only-as-strong-as-the-weakest-link-on-the-security-of-brokered-single-sign-on-on  [curated-database] "Tracker Radar Entity List"      2025 IEEE-SP/only-as-strong-as-the-weakest-link-on-the-security-of-brokered-single-sign-on-on  [curated-database] "Tracker Radar Entity List"
-     2025 WWW/welcome-to-the-dark-side-analyzing-the-revenue-flows-of-fraud-in-the-online-ad-e  [blocklist] "NextDNS Piracy Blocklist" 
    javascript:    javascript:
      2017 PETS/towards-seamless-tracking-free-web-improved-detection-of-trackers-via-one-class  [blocklist] "EasyList"      2017 PETS/towards-seamless-tracking-free-web-improved-detection-of-trackers-via-one-class  [blocklist] "EasyList"
Line 254: Line 251:
  
 === 4. THE LIST AS GROUND TRUTH  (denominator: whole corpus — this is not restricted to the population)  === 4. THE LIST AS GROUND TRUTH  (denominator: whole corpus — this is not restricted to the population) 
-   papers whose classification.groundTruthSource names a filter list     96  +   papers whose classification.groundTruthSource names a filter list     92  
-     ... as a share of the list-using population                88 of 198 = 44.4%+     ... as a share of the list-using population                86 of 194 = 44.3%
  
 -- by target (papers) -- by target (papers)
-   web-request                                                  45 46.9% +   web-request                                                  45 48.9% 
-   domain                                                       36 37.5+   domain                                                       35 38.0
-   javascript                                                    8 8.3+   javascript                                                    8 8.7
-   cookie                                                        6 6.3+   cookie                                                        6 6.5
-   other                                                         6 6.3+   other                                                         5 5.4
-   website-category                                              3 3.1+   website-category                                              2 2.2
-   fingerprinting-script                                         2 2.1% +   fingerprinting-script                                         2 2.2
-   ip-address                                                    1 1.0+   privacy-policy                                                1 1.1
-   privacy-policy                                                1 1.0+   consent-notice                                                1 1.1
-   consent-notice                                                1 1.0+   network-traffic                                               1 1.1
-   network-traffic                                               1 1.0+   email-message                                                 1 1.1%
-   email-message                                                 1 1.0%+
  
 -- by list (papers) -- by list (papers)
-   EasyList                                                     48 50.0+   EasyList                                                     48 52.2
-   EasyPrivacy                                                  37 38.5+   EasyPrivacy                                                  37 40.2
-   Disconnect                                                   20 20.8+   Disconnect                                                   19 20.7% 
-   hosts-file lists (hpHosts, AdAway, MoaAB, Pi-hole, NoTrack, …)     13 13.5% +   named generically, no list named                             13 14.1
-   named generically, no list named                             13 13.5+   hosts-file lists (hpHosts, AdAway, MoaAB, Pi-hole, NoTrack, …)     10 10.9
-   Ghostery / WhoTracks.me                                       9 9.4+   Ghostery / WhoTracks.me                                       9 9.8
-   DuckDuckGo Tracker Radar (list)                               6 6.3+   DuckDuckGo Tracker Radar (list)                               6 6.5
-   EasyList annoyance / anti-adblock variants                    4 4.2+   EasyList annoyance / anti-adblock variants                    4 4.3
-   uBlock Origin (lists)                                         4 4.2+   uBlock Origin (lists)                                         4 4.3
-   unnamed / aggregated filter lists                             2 2.1+   unnamed / aggregated filter lists                             2 2.2
-   Adblock Plus (lists shipped with it)                          1 1.0+   Adblock Plus (lists shipped with it)                          1 1.1
-   AdGuard                                                       1 1.0+   AdGuard                                                       1 1.1
-   Acceptable Ads exception list                                 1 1.0%+   Acceptable Ads exception list                                 1 1.1%
  
 -- LEARNED classifiers (supervised-ml / unsupervised-ml / llm) whose ground truth is a filter list -- LEARNED classifiers (supervised-ml / unsupervised-ml / llm) whose ground truth is a filter list
-   distinct papers                                              16 (22 tuples)+   distinct papers                                              15 (20 tuples)
      2015 PETS/an-automated-approach-for-complementing-ad-blockers-blacklists  target=website-category  gt="Manual labels and Adblock Plus ABPexact labels"      2015 PETS/an-automated-approach-for-complementing-ad-blockers-blacklists  target=website-category  gt="Manual labels and Adblock Plus ABPexact labels"
      2017 IMC/the-ad-wars-retrospective-measurement-and-analysis-of-anti-adblock-filter-lists  target=javascript  gt="372 filter-list-matched anti-adblocking scripts plus remaining unmatched scripts"      2017 IMC/the-ad-wars-retrospective-measurement-and-analysis-of-anti-adblock-filter-lists  target=javascript  gt="372 filter-list-matched anti-adblocking scripts plus remaining unmatched scripts"
-     2018 IMC/characterizing-the-internet-host-population-using-deep-learning-a-universal-and  target=ip-address  gt="hpHosts, PhishTank, and MPDNS labels" 
      2018 PETS/nomoads-effective-and-efficient-cross-app-mobile-ad-blocking  target=web-request  gt="EasyList and manually created mobile-ad rules"      2018 PETS/nomoads-effective-and-efficient-cross-app-mobile-ad-blocking  target=web-request  gt="EasyList and manually created mobile-ad rules"
      2019 CCS/adversarial-perceptual-ad-blocking-meets-adversarial-machine-learning  target=other  gt="filter-list-labeled screenshots"      2019 CCS/adversarial-perceptual-ad-blocking-meets-adversarial-machine-learning  target=other  gt="filter-list-labeled screenshots"
Line 308: Line 303:
  
 -- denominator for that: papers running a LEARNED classifier, that also use a list -- denominator for that: papers running a LEARNED classifier, that also use a list
-   list-using papers running any learned classifier             62  +   list-using papers running any learned classifier             60  
-     ... of which a filter list is the stated ground truth      15 24.2+     ... of which a filter list is the stated ground truth      15 25.0
-     ... of which some OTHER source is the stated ground truth     47 +     ... of which some OTHER source is the stated ground truth     45 
  
  
 === 5. VALIDATION OF LIST-BACKED CLASSIFICATION  (denominator: papers with >=1 list-backed classification tuple)  === 5. VALIDATION OF LIST-BACKED CLASSIFICATION  (denominator: papers with >=1 list-backed classification tuple) 
-   denominator: 167 papers  (a paper with several tuples appears in several rows) +   denominator: 163 papers  (a paper with several tuples appears in several rows) 
-   not-applicable   [SENTINEL — not an answer]                  69 41.3+   not-applicable   [SENTINEL — not an answer]                  68 41.7
-   none-reported   [SENTINEL — not an answer]                   61 36.5+   none-reported   [SENTINEL — not an answer]                   60 36.8
-   manual-validation                                            34 20.4+   manual-validation                                            34 20.9
-   comparison-to-other-method                                   14 8.4%+   comparison-to-other-method                                   12 7.4%
  
 -- paper-level, because the rows above overlap -- paper-level, because the rows above overlap
-   papers whose list-backed validation is ONLY sentinels       119 71.3+   papers whose list-backed validation is ONLY sentinels       117 71.8
-   papers with at least one real validation value               48 28.7%+   papers with at least one real validation value               46 28.2%
    papers appearing in more than one row above                  11     papers appearing in more than one row above                  11 
  
  
 === 6. WHICH VERSION OF THE LIST  (denominator: papers naming a list in tools[], where a version field exists)  === 6. WHICH VERSION OF THE LIST  (denominator: papers naming a list in tools[], where a version field exists) 
-   papers naming a filter list in tools[]                      178  +   papers naming a filter list in tools[]                      177  
-     ... with any non-null tools[].version                      53 29.8+     ... with any non-null tools[].version                      53 29.9
-     ... silent                                                125 70.2+     ... silent                                                124 70.1
-     ... whose version identifies the RULES (a list version or commit, not a year)      4 2.2%+     ... whose version identifies the RULES (a list version or commit, not a year)      4 2.3%
  
 -- the version strings that identify the rules -- the version strings that identify the rules
Line 397: Line 392:
    venue             corpus    pop  share of venue    venue             corpus    pop  share of venue
    PETS                 510     55           10.8%    PETS                 510     55           10.8%
-   IMC                  638     36            5.6+   IMC                  638     35            5.5
-   WWW                  843     31            3.7% +   WWW                  843     30            3.6%
-   USENIX              1410     24            1.7%+
    CCS                  990     23            2.3%    CCS                  990     23            2.3%
 +   USENIX              1410     22            1.6%
    IEEE-SP              767     19            2.5%    IEEE-SP              767     19            2.5%
    NDSS                 701     10            1.4%    NDSS                 701     10            1.4%
Line 407: Line 402:
    period                      corpus    pop  per 1,000    period                      corpus    pop  per 1,000
    2010-2013                      511      6       11.7    2010-2013                      511      6       11.7
-   2014-2017                      769     25       32.5 +   2014-2017                      769     24       31.2 
-   2018-2021                     1439     58       40.3 +   2018-2021                     1439     57       39.6 
-   2022-2024                     1955     70       35.8 +   2022-2024                     1955     69       35.3 
-   2025-2026 (provisional)       1185     39       32.9+   2025-2026 (provisional)       1185     38       32.1
  
 -- per year, for the currency claim (same provisional caveat) -- per year, for the currency claim (same provisional caveat)
Line 417: Line 412:
    2012  corpus  151  pop      0.7%   pop papers with any llm classification: 0    2012  corpus  151  pop      0.7%   pop papers with any llm classification: 0
    2013  corpus  125  pop      1.6%   pop papers with any llm classification: 0    2013  corpus  125  pop      1.6%   pop papers with any llm classification: 0
-   2014  corpus  166  pop      2.4%   pop papers with any llm classification: 0+   2014  corpus  166  pop      1.8%   pop papers with any llm classification: 0
    2015  corpus  190  pop      2.1%   pop papers with any llm classification: 0    2015  corpus  190  pop      2.1%   pop papers with any llm classification: 0
    2016  corpus  182  pop      3.8%   pop papers with any llm classification: 0    2016  corpus  182  pop      3.8%   pop papers with any llm classification: 0
    2017  corpus  231  pop  10    4.3%   pop papers with any llm classification: 0    2017  corpus  231  pop  10    4.3%   pop papers with any llm classification: 0
    2018  corpus  254  pop  13    5.1%   pop papers with any llm classification: 0    2018  corpus  254  pop  13    5.1%   pop papers with any llm classification: 0
-   2019  corpus  402  pop  13    3.2%   pop papers with any llm classification: 0+   2019  corpus  402  pop  12    3.0%   pop papers with any llm classification: 0
    2020  corpus  404  pop  18    4.5%   pop papers with any llm classification: 0    2020  corpus  404  pop  18    4.5%   pop papers with any llm classification: 0
    2021  corpus  379  pop  14    3.7%   pop papers with any llm classification: 0    2021  corpus  379  pop  14    3.7%   pop papers with any llm classification: 0
    2022  corpus  546  pop  22    4.0%   pop papers with any llm classification: 0    2022  corpus  546  pop  22    4.0%   pop papers with any llm classification: 0
-   2023  corpus  719  pop  26    3.6%   pop papers with any llm classification: 0+   2023  corpus  719  pop  25    3.5%   pop papers with any llm classification: 0
    2024  corpus  690  pop  22    3.2%   pop papers with any llm classification: 2    2024  corpus  690  pop  22    3.2%   pop papers with any llm classification: 2
-   2025  corpus  770  pop  31    4.0%   pop papers with any llm classification: 4+   2025  corpus  770  pop  30    3.9%   pop papers with any llm classification: 4
    2026  corpus  415  pop      1.9%   pop papers with any llm classification: 1    2026  corpus  415  pop      1.9%   pop papers with any llm classification: 1
  
Line 486: Line 481:
    off-topic: censorship blocklist                                   off-topic: censorship blocklist                               
    off-topic: certificate / key revocation blocklist                 off-topic: certificate / key revocation blocklist             
 +
 +-- EXCLUDED BY TUPLE CONTEXT: the list name is right, the use is off-topic
 +     2014 USENIX/automatically-detecting-vulnerable-websites-before-they-turn-malicious  resourceName "hpHosts" gt "hpHosts blacklist"
 +        We also discarded an additional 421 sites found in the DNS-BH [2], Google SafeBrowsing [14], and hpHosts [23] blacklists.
 +     2018 IMC/characterizing-the-internet-host-population-using-deep-learning-a-universal-and   gt "hpHosts, PhishTank, and MPDNS labels"
 +        we use reported malicious hosts (as labels) to train a series of supervised models that assign reputation scores to arbitrary hosts
 +     2018 IMC/characterizing-the-internet-host-population-using-deep-learning-a-universal-and   gt "hpHosts, PhishTank, and MPDNS labels"
 +        We thus use 10-D embeddings and train k-NN models that return the percentage of malicious hosts within the most 50 similar training samples
 +     2019 IMC/shamfinder-an-automated-framework-for-detecting-idn-homographs  resourceName "hpHosts" gt "hpHosts blacklist"
 +        malicious domains | To check whether the detected IDN homographs have been used for malicious purposes, we leveraged three different sources of blacklists, hpHosts [17], Google Safe Browsing (GSB) [14
 +     2023 USENIX/trident-towards-detecting-and-mitigating-web-based-social-engineering-attacks  tools[] "Categorical BlockList"
 +        Provided malicious URL labels for ground truth. | We choose three additional services for identifying whether a website is malicious or not, a categorical BlockList [31] on Github
 +     2023 USENIX/trident-towards-detecting-and-mitigating-web-based-social-engineering-attacks  resourceName "Categorical BlockList"
 +        Malware, Scam, Abuse, Phishing, and Fraud | A URL malicious if it falls in the buckets of Malware, Scam, Abuse, Phishing, and Fraud in the BlockList
 +     2025 WWW/welcome-to-the-dark-side-analyzing-the-revenue-flows-of-fraud-in-the-online-ad-e  resourceName "NextDNS Piracy Blocklist"
 +        torrent and warez categories | We utilize NextDNS' Piracy Blocklist [56] and focus on 1,395 websites in the "torrent" and "warez" categories.
 +   tuples excluded by context                                    7 
  
 -- groundTruthSource residue: strings that look like a blocklist and are NOT counted as one -- groundTruthSource residue: strings that look like a blocklist and are NOT counted as one
-   distinct groundTruthSource strings excluded                  68 +   distinct groundTruthSource strings excluded                  69 
         Google Safe Browsing blacklist         Google Safe Browsing blacklist
         Spamhaus blacklist         Spamhaus blacklist
Line 524: Line 536:
         new binaries, blacklisted domains, and deviation from benign program profiles         new binaries, blacklisted domains, and deviation from benign program profiles
         blacklist entries         blacklist entries
 +        physical ECU access and disconnection
         manually curated blacklists         manually curated blacklists
         blacklist patterns and Wappalyzer family mapping         blacklist patterns and Wappalyzer family mapping
Line 995: Line 1008:
 </code> </code>
  
-None of those matched, so the papers folded to nothing and dropped out of the ground-truth counts. **The first published version of this page therefore said 88 papers where the answer is 96, and printed an eleven-paper "who's-who of the reference baselines" that omitted AdGraph and WebGraph** — the two most famous filter-list-labelled classifiers in the field. It also silently disagreed with [[Privacy:Requests]], which names both — **because that page's script had already got this right**: ''report_requests.mjs'' does not reuse the shared fold for ''groundTruthSource'' at all, it carries a purpose-built ''GT_LIST_RX''. Reusing a shared fold is usually the right instinct and is why the two pages agree about what "EasyList" means; it was the wrong instinct for **this one field**, and the sibling page's apparent duplication was the correct design.+None of those matched, so the papers folded to nothing and dropped out of the ground-truth counts. **The first published version of this page therefore said 88 papers where the answer is 92, and printed an eleven-paper "who's-who of the reference baselines" that omitted AdGraph and WebGraph** — the two most famous filter-list-labelled classifiers in the field. It also silently disagreed with [[Privacy:Requests]], which names both — **because that page's script had already got this right**: ''report_requests.mjs'' does not reuse the shared fold for ''groundTruthSource'' at all, it carries a purpose-built ''GT_LIST_RX''. Reusing a shared fold is usually the right instinct and is why the two pages agree about what "EasyList" means; it was the wrong instinct for **this one field**, and the sibling page's apparent duplication was the correct design.
  
 The fix is a second, **unanchored** regex applied **only to ''groundTruthSource''**: The fix is a second, **unanchored** regex applied **only to ''groundTruthSource''**:
Line 1016: Line 1029:
 **Lesson for the next page, stated plainly: a fold's residue must be surveyed over every field the fold is applied to.** Surveying it over two of three fields produced a page that passed every mechanical check and was wrong about its central claim. **Lesson for the next page, stated plainly: a fold's residue must be surveyed over every field the fold is applied to.** Surveying it over two of three fields produced a page that passed every mechanical check and was wrong about its central claim.
  
-==== 4. Regional lists — ''REGIONAL_RX'' in ''fl_fold.mjs'' ====+==== 4. When a list name is right but the use is off-topic — ''TUPLE_OFFTOPIC_RX'' / ''SECURITY_FEED_RX'' ==== 
 + 
 +<WRAP important> 
 +**A second correction from the same review round, and it moved the headline population.** After the ground-truth fold was widened, a re-review dumped all the papers it now admitted and read them. Three were wrong, and the fold could not have known: **the list name was right and the //use// was not.** 
 +</WRAP> 
 + 
 +Some families are genuinely ambiguous artefacts. hpHosts shipped an advertising/tracking file **and** a malware file. "Categorical BlockList" is a bucket name. NextDNS publishes a piracy list. Three papers named one of these and were doing security work: 
 + 
 +<code> 
 +2014 USENIX  automatically-detecting-vulnerable-websites-before-they-turn-malicious 
 +   gt "hpHosts blacklist" 
 +   "We also discarded an additional 421 sites found in the DNS-BH, Google SafeBrowsing, and hpHosts blacklists." 
 +2018 IMC     characterizing-the-internet-host-population-using-deep-learning 
 +   gt "hpHosts, PhishTank, and MPDNS labels"   -> reputation scores for malicious hosts 
 +2019 IMC     shamfinder-an-automated-framework-for-detecting-idn-homographs 
 +   gt "hpHosts blacklist"   taxonomy "malicious domains" 
 +</code> 
 + 
 +The fix consults the **tuple's own context** — its ''taxonomy'', its ''targetDetail'', its ''purpose'' and its verbatim evidence quote — and only for the ambiguous families. EasyList, EasyPrivacy, Disconnect, Ghostery and Tracker Radar are unambiguous advertising/tracking artefacts, and a tracking paper that happens to mention malware must not be dropped for saying so. 
 + 
 +Two signals, because one was not enough: 
 + 
 +  * ''TUPLE_OFFTOPIC_RX'' — malware, malicious, phishing, drive-by, spam, fraud, scam, piracy, botnet, ransomware, typosquatting, homograph. 
 +  * ''SECURITY_FEED_RX'' — the list is named in the same sentence as DNS-BH, Google Safe Browsing, PhishTank, Symantec DeepSight, Spamhaus, CleanMX, VirusTotal, URLhaus, OpenPhish or the APWG. **The 2014 paper above contains none of the vocabulary words**; it was caught only by the company it keeps. 
 + 
 +Two things were deliberately kept **out** of the regex, each after it cost a false positive in testing: 
 + 
 +  * ''\bmalware(?!bytes)'' — //"MalwareBytes' hpHosts ATS file"// is a company name, in a paper whose taxonomy is literally "advertising and tracking services". Matching it would have dropped a correct row. 
 +  * **Cryptomining is not off-topic.** NoCoin and MinerBlock are Adblock-syntax lists that ship inside ad blockers; a cryptojacking paper using them is using a filter list. 
 + 
 +**Every exclusion is printed** in the report output under //EXCLUDED BY TUPLE CONTEXT//: 7 tuples across 5 papers. The effect on the page: population 198 → **194**, classification population 167 → **163**, ground truth 96 → **92**, learned roster 16 → **15**, hosts-file family 27 → **24**. 
 + 
 +**Why this was not caught earlier.** The whole review apparatus checks that the page matches the script and that the script's residue is printed. Both held. What neither checks is the population's **precision** — whether the things the fold //admitted// belong. The residue answers "what did I miss"; nothing answered "what did I wrongly let in" until a reviewer was asked to dump the admitted set and read it. **That question should be asked of every hand-built population on this site**, and it is cheap: print the members, read them. 
 + 
 +==== 5. Regional lists — ''REGIONAL_RX'' in ''fl_fold.mjs'' ====
  
 Matched against title, summary, tool names, classification resource names and ''otherToolsMentioned'', joined. **Two hits in 5,859 papers**, both printed with the string that matched: Matched against title, summary, tool names, classification resource names and ''otherToolsMentioned'', joined. **Two hits in 5,859 papers**, both printed with the string that matched:
Line 1283: Line 1330:
   * **What rules the shipped MV3 blockers drop** to fit the 30,000-rule cap. uBlock Origin Lite's rulesets are in its repository and could be diffed against upstream EasyList; nobody has published that, and it was out of scope here. **This is the most tractable open question on the page** — it needs a diff, not a crawl.   * **What rules the shipped MV3 blockers drop** to fit the 30,000-rule cap. uBlock Origin Lite's rulesets are in its repository and could be diffed against upstream EasyList; nobody has published that, and it was out of scope here. **This is the most tractable open question on the page** — it needs a diff, not a crawl.
   * **Whether the 16%–19% false-positive estimate generalises.** One paper, one taint-tracking browser, 7,614 sites. The page uses the number four times and now carries the caveat at all four — it carried it at two until the generic reviewer counted.   * **Whether the 16%–19% false-positive estimate generalises.** One paper, one taint-tracking browser, 7,614 sites. The page uses the number four times and now carries the caveat at all four — it carried it at two until the generic reviewer counted.
-  * **Whether two papers belong in the 16-paper learned-classifier roster.** A 2015 website-category classifier and a 2018 host-population classifier whose labels mix hpHosts with PhishTank and MPDNS are in the count because hpHosts is an ad/tracking hosts-file list. Neither is a tracker detector. The page names them rather than quietly dropping them, and the claim it makes is about the fourteen that are.+  * **Whether the 194-paper population is now exact. It is not, and no query here can make it so.** Two review rounds moved it in both directions — the ground-truth fold was too narrow, then the widened test was too broad — and each was found by a human-style read of the members, not by a check. The exclusion set is small (7 tuples, 5 papers) and every member is printed, but **nobody has read all 194 admitted papers**. Treat the population as a documented judgement with a printed boundary, which is what the site asks for, and not as a measurement. 
 +  * **Whether one paper belongs in the 15-paper learned-classifier roster.** A 2015 website-category classifier is in the count and is not tracker detector. (The 2018 host-population classifier that was also in it has since been excluded by the tuple-context test, which is the right outcome.The page names it rather than quietly dropping it, and the claim it makes is about the fourteen that are.
  
 ===== Judgement calls ===== ===== Judgement calls =====
Line 1292: Line 1340:
  
   - **The ground-truth fold was blind on one field** (above). Every mechanical check passed. Only a reviewer who read the papers behind the roster noticed that the two most famous filter-list-labelled classifiers were missing from it.   - **The ground-truth fold was blind on one field** (above). Every mechanical check passed. Only a reviewer who read the papers behind the roster noticed that the two most famous filter-list-labelled classifiers were missing from it.
 +  - **And then the widened fold let in things that did not belong** (also above). Fixing a recall problem created a precision problem, and the second was found the same way: by dumping the admitted set and reading it. Between them the two corrections moved the headline population from 198 to 194 and the ground-truth count from 88 to 92 — in **opposite directions**, which is why neither would have been caught by a sanity check on the total.
   - **Two sentinel rows were added together.** The first draft said "roughly three quarters do not validate the labels" from 41.3% + 36.5%. Eleven papers carry both a sentinel and a real value, so the correct paper-level figure is **119 of 167 (71.3%)**. This was caught in self-review; the report script now computes it directly so it cannot be reconstructed by addition again.   - **Two sentinel rows were added together.** The first draft said "roughly three quarters do not validate the labels" from 41.3% + 36.5%. Eleven papers carry both a sentinel and a real value, so the correct paper-level figure is **119 of 167 (71.3%)**. This was caught in self-review; the report script now computes it directly so it cannot be reconstructed by addition again.
  
Line 1376: Line 1425:
  
 ^ Finding ^ Verdict ^ What was done ^ ^ Finding ^ Verdict ^ What was done ^
-| **The ground-truth fold is blind on ''groundTruthSource''**: ''req_fold.mjs'''s anchored //unnamed/aggregated// family cannot match "Labels derived from eight crowdsourced filter lists", so **AdGraph and WebGraph were missing from the roster the page calls a who's-who**, the count was 88 instead of 96, two of the four "clearest examples" were not inside the statistic that introduced them, and the page silently disagreed with [[Privacy:Requests]] | **Accepted in full — the most serious finding of the whole review** | A separate unanchored ''GT_FILTERLIST_RX'' was added in ''fl_fold.mjs'' and applied **only** to ''groundTruthSource'', ''groundTruthSource'' was added to the residue survey, and every affected figure was recomputed: **88 → 96**, 82 (41.4%) → **88 (44.4%)**, 11 → **16** learned-classifier papers. See //Ground-truth names// above for the full account | +| **The ground-truth fold is blind on ''groundTruthSource''**: ''req_fold.mjs'''s anchored //unnamed/aggregated// family cannot match "Labels derived from eight crowdsourced filter lists", so **AdGraph and WebGraph were missing from the roster the page calls a who's-who**, the count was 88 instead of 96, two of the four "clearest examples" were not inside the statistic that introduced them, and the page silently disagreed with [[Privacy:Requests]] | **Accepted in full — the most serious finding of the whole review** | A separate unanchored ''GT_FILTERLIST_RX'' was added in ''fl_fold.mjs'' and applied **only** to ''groundTruthSource'', ''groundTruthSource'' was added to the residue survey, and every affected figure was recomputed: **88 → 92**, 82 (41.4%) → **86 (44.3%)**, 11 → **15** learned-classifier papers, after the precision fix in pass 5 below. See //Ground-truth names// above for the full account | 
-| **"Nothing in this corpus escapes the list. Every learned tracker detector here trains on filter-list labels"** is a universal negative the machinery cannot support — 47 of 62 list-using papers with a learned classifier state some other ground truth and nobody audited them | **Accepted** | Rewritten to a claim about the 16, with the 47 unaudited papers stated explicitly |+| **"Nothing in this corpus escapes the list. Every learned tracker detector here trains on filter-list labels"** is a universal negative the machinery cannot support — most list-using papers with a learned classifier state some other ground truth and nobody audited them | **Accepted** | Rewritten to a claim about the 15, with the 45 unaudited papers stated explicitly |
 | The provenance page's run table said "Four review passes, logged at the end of this page" while the review log was a placeholder | **Accepted** | The log is now written. The first published revision of the provenance page did carry that placeholder for about twenty minutes | | The provenance page's run table said "Four review passes, logged at the end of this page" while the review log was a placeholder | **Accepted** | The log is now written. The first published revision of the provenance page did carry that placeholder for about twenty minutes |
 | The Rejected list still said "no primary Apple source was found for Safari" while the page said the opposite | **Accepted** | Stale text from before the currency pass; corrected, and the check added to the script | | The Rejected list still said "no primary Apple source was found for Safari" while the page said the opposite | **Accepted** | Stale text from before the currency pass; corrected, and the check added to the script |
Line 1391: Line 1440:
 | Smaller overstatements: "the rest is 'EasyList, 2022'" (some are full dates); CookieGraph "current state of the art" (one paper, resting on an unaudited database); the hpHosts row's 27 papers (a whole family, including live lists); "reviewers accept it" (the corpus cannot know that); "almost every claim … rests on one" (the population is 3.4% of the corpus); a double period in the CookieGraph quote | **All accepted** | All eight rewritten | | Smaller overstatements: "the rest is 'EasyList, 2022'" (some are full dates); CookieGraph "current state of the art" (one paper, resting on an unaudited database); the hpHosts row's 27 papers (a whole family, including live lists); "reviewers accept it" (the corpus cannot know that); "almost every claim … rests on one" (the population is 3.4% of the corpus); a double period in the CookieGraph quote | **All accepted** | All eight rewritten |
 | Add the four exemplary version strings to the quote-check table | **Accepted** | Two of four re-read and confirmed verbatim; the table says which two | | Add the four exemplary version strings to the quote-check table | **Accepted** | Two of four re-read and confirmed verbatim; the table says which two |
 +
 +==== Pass 5 — re-review of the fixes (''sonnet'') ====
 +
 +The three focused passes were re-run against the corrected page. This one found that **fixing the recall problem in pass 4 had created a precision problem**, which is the most useful thing a re-review can do.
 +
 +^ Finding ^ Verdict ^ What was done ^
 +| ''req_fold.mjs'''s Disconnect family is ''/disconnect/i'' with **no word boundary**, so it matched //"physical ECU access and disconnection"// in a 2019 automotive CAN-bus paper and counted it as a filter-list ground truth | **Accepted** | Changed to ''/\bdisconnect(?!ion\|ing\|ed\|s\b)/i''. Checked corpus-wide before touching a **shared** file: the change drops that one string and nothing else, and ''privacy:requests'' Disconnect count is still 48 |
 +| Two papers use **hpHosts as a malware blacklist**, alongside DNS-BH and Google Safe Browsing, and were counted as filter-list users | **Accepted, and generalised** | A tuple-context test now decides, for the ambiguous families only. See //When a list name is right but the use is off-topic// above |
 +| A third uses **NextDNS's piracy list** to find torrent sites | **Accepted** | Same test |
 +| The reviewer's caveat that it had spot-checked rather than audited, and that more might be found | **Taken seriously** | The exclusion set is small and every member is printed. What is **not** claimed is that the population is now exact — see //What could not be established// |
 +| A stray double period after the CookieGraph quote | **Accepted** | Fixed |
 +
 +Everything else it re-checked passed: the report output reproduces byte-identically, all fourteen named baselines are in the printed roster, the sentinel fix is right, every live-sourced number is attached to the correct list or repository (it checked misattachment specifically, which the mechanical guard cannot), the published script block and its output block are byte-identical to their files, and [[Privacy:Consent]] genuinely covers the three rulesets the pointer row sends readers to.
  
 ===== See also ===== ===== See also =====
provenance/programming/filter_lists.txt · Last modified: by karel.kubicek.claude

Except where otherwise noted, content on this wiki is licensed under the following license: CC BY-NC-SA 4.0
CC BY-NC-SA 4.0 Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki