@slashgear/gdpr-cookie-scanner 3.6.0 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/CLAUDE.md +12 -1
  3. package/NEXT_STEPS.md +37 -3
  4. package/README.md +23 -0
  5. package/dist/analyzers/colour.d.ts +36 -0
  6. package/dist/analyzers/colour.d.ts.map +1 -0
  7. package/dist/analyzers/colour.js +75 -0
  8. package/dist/analyzers/colour.js.map +1 -0
  9. package/dist/analyzers/compliance.d.ts.map +1 -1
  10. package/dist/analyzers/compliance.js +24 -6
  11. package/dist/analyzers/compliance.js.map +1 -1
  12. package/dist/analyzers/tcf-decoder.d.ts +9 -0
  13. package/dist/analyzers/tcf-decoder.d.ts.map +1 -0
  14. package/dist/analyzers/tcf-decoder.js +123 -0
  15. package/dist/analyzers/tcf-decoder.js.map +1 -0
  16. package/dist/analyzers/wording.d.ts +1 -0
  17. package/dist/analyzers/wording.d.ts.map +1 -1
  18. package/dist/analyzers/wording.js +39 -0
  19. package/dist/analyzers/wording.js.map +1 -1
  20. package/dist/report/generator.d.ts +1 -0
  21. package/dist/report/generator.d.ts.map +1 -1
  22. package/dist/report/generator.js +71 -1
  23. package/dist/report/generator.js.map +1 -1
  24. package/dist/report/html.d.ts.map +1 -1
  25. package/dist/report/html.js +123 -0
  26. package/dist/report/html.js.map +1 -1
  27. package/dist/scanner/consent-modal.d.ts.map +1 -1
  28. package/dist/scanner/consent-modal.js +4 -2
  29. package/dist/scanner/consent-modal.js.map +1 -1
  30. package/dist/scanner/index.d.ts.map +1 -1
  31. package/dist/scanner/index.js +4 -0
  32. package/dist/scanner/index.js.map +1 -1
  33. package/dist/scanner/tcf.d.ts +9 -0
  34. package/dist/scanner/tcf.d.ts.map +1 -0
  35. package/dist/scanner/tcf.js +72 -0
  36. package/dist/scanner/tcf.js.map +1 -0
  37. package/dist/types.d.ts +26 -0
  38. package/dist/types.d.ts.map +1 -1
  39. package/docs/index.html +37 -49
  40. package/docs/reports/www.arte.tv/after-accept.png +0 -0
  41. package/docs/reports/www.arte.tv/after-reject.png +0 -0
  42. package/docs/reports/www.arte.tv/gdpr-report-arte.tv-2026-02-24.html +997 -0
  43. package/docs/reports/www.deezer.com/after-accept.png +0 -0
  44. package/docs/reports/www.deezer.com/after-reject.png +0 -0
  45. package/docs/reports/www.deezer.com/gdpr-report-deezer.com-2026-02-22.html +1667 -0
  46. package/docs/reports/www.impots.gouv.fr/after-accept.png +0 -0
  47. package/docs/reports/www.impots.gouv.fr/after-reject.png +0 -0
  48. package/docs/reports/www.impots.gouv.fr/gdpr-report-impots.gouv.fr-2026-02-22.html +751 -0
  49. package/docs/reports/www.leboncoin.fr/after-accept.png +0 -0
  50. package/docs/reports/www.leboncoin.fr/after-reject.png +0 -0
  51. package/docs/reports/www.leboncoin.fr/gdpr-report-leboncoin.fr-2026-02-22.html +764 -0
  52. package/docs/reports/www.netflix.com/after-accept.png +0 -0
  53. package/docs/reports/www.netflix.com/after-reject.png +0 -0
  54. package/docs/reports/www.netflix.com/gdpr-report-netflix.com-2026-02-23.html +1050 -0
  55. package/docs/reports/www.radiofrance.fr/after-accept.png +0 -0
  56. package/docs/reports/www.radiofrance.fr/after-reject.png +0 -0
  57. package/docs/reports/www.radiofrance.fr/gdpr-report-radiofrance.fr-2026-02-24.html +1145 -0
  58. package/package.json +1 -1
  59. package/src/analyzers/colour.ts +89 -0
  60. package/src/analyzers/compliance.ts +35 -10
  61. package/src/analyzers/tcf-decoder.ts +130 -0
  62. package/src/analyzers/wording.ts +44 -0
  63. package/src/report/generator.ts +83 -1
  64. package/src/report/html.ts +146 -0
  65. package/src/scanner/consent-modal.ts +3 -1
  66. package/src/scanner/index.ts +5 -0
  67. package/src/scanner/tcf.ts +80 -0
  68. package/src/types.ts +29 -0
  69. package/tests/analyzers/colour.test.ts +187 -0
  70. package/tests/analyzers/compliance.test.ts +102 -0
  71. package/tests/analyzers/tcf-decoder.test.ts +292 -0
  72. package/tests/analyzers/wording.test.ts +38 -0
  73. package/tests/scanner/button-classification.test.ts +32 -0
  74. package/docs/reports/github.com/after-accept.png +0 -0
  75. package/docs/reports/github.com/after-reject.png +0 -0
  76. package/docs/reports/github.com/gdpr-checklist-github.com-2026-02-22.md +0 -44
  77. package/docs/reports/github.com/gdpr-cookies-github.com-2026-02-22.md +0 -29
  78. package/docs/reports/github.com/gdpr-report-github.com-2026-02-22.md +0 -102
  79. package/docs/reports/github.com/gdpr-report-github.com-2026-02-22.pdf +0 -0
  80. package/docs/reports/gitlab.com/after-accept.png +0 -0
  81. package/docs/reports/gitlab.com/after-reject.png +0 -0
  82. package/docs/reports/gitlab.com/gdpr-checklist-gitlab.com-2026-02-22.md +0 -44
  83. package/docs/reports/gitlab.com/gdpr-cookies-gitlab.com-2026-02-22.md +0 -55
  84. package/docs/reports/gitlab.com/gdpr-report-gitlab.com-2026-02-22.md +0 -200
  85. package/docs/reports/gitlab.com/gdpr-report-gitlab.com-2026-02-22.pdf +0 -0
  86. package/docs/reports/gitlab.com/modal-initial.png +0 -0
  87. package/docs/reports/npmjs.com/after-accept.png +0 -0
  88. package/docs/reports/npmjs.com/after-reject.png +0 -0
  89. package/docs/reports/npmjs.com/gdpr-checklist-npmjs.com-2026-02-22.md +0 -44
  90. package/docs/reports/npmjs.com/gdpr-cookies-npmjs.com-2026-02-22.md +0 -25
  91. package/docs/reports/npmjs.com/gdpr-report-npmjs.com-2026-02-22.md +0 -88
  92. package/docs/reports/npmjs.com/gdpr-report-npmjs.com-2026-02-22.pdf +0 -0
  93. package/docs/reports/reddit.com/after-accept.png +0 -0
  94. package/docs/reports/reddit.com/after-reject.png +0 -0
  95. package/docs/reports/reddit.com/gdpr-checklist-reddit.com-2026-02-22.md +0 -44
  96. package/docs/reports/reddit.com/gdpr-cookies-reddit.com-2026-02-22.md +0 -33
  97. package/docs/reports/reddit.com/gdpr-report-reddit.com-2026-02-22.md +0 -148
  98. package/docs/reports/reddit.com/gdpr-report-reddit.com-2026-02-22.pdf +0 -0
  99. package/docs/reports/reddit.com/modal-initial.png +0 -0
  100. package/docs/reports/stackoverflow.com/after-accept.png +0 -0
  101. package/docs/reports/stackoverflow.com/after-reject.png +0 -0
  102. package/docs/reports/stackoverflow.com/gdpr-checklist-stackoverflow.com-2026-02-22.md +0 -44
  103. package/docs/reports/stackoverflow.com/gdpr-cookies-stackoverflow.com-2026-02-22.md +0 -67
  104. package/docs/reports/stackoverflow.com/gdpr-report-stackoverflow.com-2026-02-22.md +0 -206
  105. package/docs/reports/stackoverflow.com/gdpr-report-stackoverflow.com-2026-02-22.pdf +0 -0
  106. package/docs/reports/stackoverflow.com/modal-initial.png +0 -0
  107. package/docs/reports/www.afp.com/after-accept.png +0 -0
  108. package/docs/reports/www.afp.com/after-reject.png +0 -0
  109. package/docs/reports/www.afp.com/gdpr-checklist-afp.com-2026-02-22.md +0 -44
  110. package/docs/reports/www.afp.com/gdpr-cookies-afp.com-2026-02-22.md +0 -42
  111. package/docs/reports/www.afp.com/gdpr-report-afp.com-2026-02-22.md +0 -202
  112. package/docs/reports/www.afp.com/gdpr-report-afp.com-2026-02-22.pdf +0 -0
  113. package/docs/reports/www.afp.com/modal-initial.png +0 -0
@@ -1,55 +0,0 @@
1
- # Cookie Inventory — gitlab.com
2
-
3
- > **Scan date:** 22/02/2026, 19:20:20
4
- > **Scanned URL:** https://gitlab.com
5
- > **Unique cookies detected:** 32
6
-
7
- ## Instructions
8
-
9
- This table lists all cookies detected during the scan, across all phases.
10
- The **Description / Purpose** column is to be filled in by the DPO or technical owner.
11
-
12
- - **Before consent** — cookie present from page load, before any interaction
13
- - **After acceptance** — cookie set or persisting after clicking "Accept all"
14
- - **After rejection** — cookie present after clicking "Reject all"
15
-
16
- ## Cookie table
17
-
18
- | Cookie | Domain | Category | Phases | Expiry | Consent required | Description / Purpose |
19
- | ---------------------------- | ----------------- | ----------- | ------------------------------------------------- | --------- | ---------------- | --------------------- |
20
- | `_ga` | .gitlab.com | Analytics | after acceptance | 13 months | ⚠️ Yes | <!-- fill in --> |
21
- | `_ga_ENFH3X7M5Y` | .gitlab.com | Analytics | after acceptance | 13 months | ⚠️ Yes | <!-- fill in --> |
22
- | `_ga_EVTFNG2S5Z` | .gitlab.com | Analytics | after acceptance | 13 months | ⚠️ Yes | <!-- fill in --> |
23
- | `_fbp` | .gitlab.com | Advertising | after acceptance | 3 months | ⚠️ Yes | <!-- fill in --> |
24
- | `IDE` | .doubleclick.net | Advertising | after acceptance | 13 months | ⚠️ Yes | <!-- fill in --> |
25
- | `__cf_bm` | .gitlab.com | Unknown | before consent, after acceptance, after rejection | < 1 day | ✅ No | <!-- fill in --> |
26
- | `_biz_flagsA` | .gitlab.com | Unknown | after acceptance | 12 months | ✅ No | <!-- fill in --> |
27
- | `_biz_nA` | .gitlab.com | Unknown | after acceptance | 12 months | ✅ No | <!-- fill in --> |
28
- | `_biz_pendingA` | .gitlab.com | Unknown | after acceptance | 12 months | ✅ No | <!-- fill in --> |
29
- | `_biz_uid` | .gitlab.com | Unknown | after acceptance | 12 months | ✅ No | <!-- fill in --> |
30
- | `_BUID` | .bizible.com | Unknown | after acceptance | 12 months | ✅ No | <!-- fill in --> |
31
- | `_cfuvid` | .gitlab.com | Unknown | before consent, after acceptance, after rejection | Session | ✅ No | <!-- fill in --> |
32
- | `_dcid` | .gitlab.com | Unknown | after acceptance | 13 months | ✅ No | <!-- fill in --> |
33
- | `_gcl_au` | .gitlab.com | Unknown | after acceptance | 3 months | ✅ No | <!-- fill in --> |
34
- | `_gtmeec` | .gitlab.com | Unknown | after acceptance | 3 months | ✅ No | <!-- fill in --> |
35
- | `_sp_id.6b85` | .gitlab.com | Unknown | after acceptance | 13 months | ✅ No | <!-- fill in --> |
36
- | `_sp_ses.6b85` | .gitlab.com | Unknown | after acceptance | < 1 day | ✅ No | <!-- fill in --> |
37
- | `FPAU` | .gitlab.com | Unknown | after acceptance | 3 months | ⚠️ Yes | <!-- fill in --> |
38
- | `FPGSID` | .gitlab.com | Unknown | after acceptance | < 1 day | ✅ No | <!-- fill in --> |
39
- | `mutiny.optIn` | .gitlab.com | Unknown | after acceptance | 13 months | ✅ No | <!-- fill in --> |
40
- | `mutiny.optIn` | .about.gitlab.com | Unknown | after acceptance | 13 months | ✅ No | <!-- fill in --> |
41
- | `mutiny.optOut` | .gitlab.com | Unknown | after acceptance | 13 months | ✅ No | <!-- fill in --> |
42
- | `mutiny.optOut` | .about.gitlab.com | Unknown | after acceptance | 13 months | ✅ No | <!-- fill in --> |
43
- | `mutiny.user.session` | .gitlab.com | Unknown | after acceptance | < 1 day | ✅ No | <!-- fill in --> |
44
- | `mutiny.user.session` | .about.gitlab.com | Unknown | after acceptance | < 1 day | ✅ No | <!-- fill in --> |
45
- | `mutiny.user.session_number` | .gitlab.com | Unknown | after acceptance | < 1 day | ✅ No | <!-- fill in --> |
46
- | `mutiny.user.session_number` | .about.gitlab.com | Unknown | after acceptance | < 1 day | ✅ No | <!-- fill in --> |
47
- | `mutiny.user.token` | .gitlab.com | Unknown | after acceptance | 13 months | ✅ No | <!-- fill in --> |
48
- | `mutiny.user.token` | .about.gitlab.com | Unknown | after acceptance | 13 months | ✅ No | <!-- fill in --> |
49
- | `OptanonAlertBoxClosed` | .gitlab.com | Unknown | after acceptance, after rejection | 12 months | ✅ No | <!-- fill in --> |
50
- | `OptanonConsent` | .gitlab.com | Unknown | before consent, after acceptance, after rejection | 12 months | ✅ No | <!-- fill in --> |
51
- | `sa-userid` | .gitlab.com | Unknown | after acceptance | 12 months | ✅ No | <!-- fill in --> |
52
-
53
- ---
54
-
55
- _Automatically generated by gdpr-cookie-scanner. Categories marked "Unknown" could not be identified automatically and should be verified manually._
@@ -1,200 +0,0 @@
1
- # GDPR Compliance Report — gitlab.com
2
-
3
- > **Scan date:** 22/02/2026, 19:20:20
4
- > **Scanned URL:** https://gitlab.com
5
- > **Scan duration:** 15.9s
6
- > **Tool:** gdpr-cookie-scanner v0.1.0
7
-
8
- ## Global Compliance Score
9
-
10
- ### 🔴 50/100 — Grade D
11
-
12
- | Criterion | Score | Progress | Status |
13
- | ---------------- | ---------- | ---------- | ------ |
14
- | Consent validity | 10/25 | ████░░░░░░ | ❌ |
15
- | Easy refusal | 25/25 | ██████████ | ✅ |
16
- | Transparency | 0/25 | ░░░░░░░░░░ | ❌ |
17
- | Cookie behavior | 15/25 | ██████░░░░ | ⚠️ |
18
- | **TOTAL** | **50/100** | | **D** |
19
-
20
- ## Executive Summary
21
-
22
- ✅ Consent modal detected (`#onetrust-banner-sdk`).
23
- ✅ No non-essential cookie set before interaction.
24
- ✅ Non-essential cookies are correctly removed after rejection.
25
- ❌ **11 tracker request(s)** fired before consent.
26
-
27
- **1 critical issue(s)** and **5 warning(s)** identified.
28
-
29
- ## 1. Consent Modal
30
-
31
- **CSS selector:** `#onetrust-banner-sdk`
32
- **Granular controls:** ❌ No
33
- **Layer count:** 1
34
- **Privacy policy link:** ⚠️ Not found in the modal
35
-
36
- ### Detected buttons
37
-
38
- | Button | Text | Visible | Font size | Contrast ratio |
39
- | ---------- | ------------------ | ------- | --------- | -------------- |
40
- | ❓ Unknown | Cookies Settings | ✅ | 13.008px | 5.26:1 |
41
- | 🔴 Reject | Reject All | ✅ | 13.008px | 18.24:1 |
42
- | 🟢 Accept | Accept All Cookies | ✅ | 13.008px | 18.24:1 |
43
-
44
- ### Comparative analysis: Accept / Reject
45
-
46
- ✅ Accept / Reject button sizes are comparable.
47
-
48
- ### Screenshot
49
-
50
- ![Consent modal](modal-initial.png)
51
-
52
- ### Modal text excerpt
53
-
54
- > This website uses cookiesWe use cookies to make our websites and services operate correctly, to understand how visitors engage with us and to improve our product and marketing efforts. See our cookie policy for more information.Cookie PolicyCookies Settings Reject All Accept All Cookies
55
-
56
- ## 2. Dark Patterns and Detected Issues
57
-
58
- ### ❌ Critical issues
59
-
60
- **11 tracker request(s) fired before any consent**
61
-
62
- > Google Tag Manager, Google AdSense, Tracking Pixel
63
-
64
- ### ⚠️ Warnings
65
-
66
- **Missing required information: "purposes"**
67
-
68
- > The consent text does not mention purposes
69
-
70
- **Missing required information: "third-parties"**
71
-
72
- > The consent text does not mention third-parties
73
-
74
- **Missing required information: "withdrawal"**
75
-
76
- > The consent text does not mention withdrawal
77
-
78
- **No privacy policy link found in the consent modal**
79
-
80
- > GDPR Art. 13 requires the privacy policy to be accessible from the consent interface
81
-
82
- **No privacy policy link found on the page**
83
-
84
- > A privacy policy must be accessible from every page (GDPR Art. 13)
85
-
86
- ## 3. Cookies Set Before Any Interaction
87
-
88
- | Name | Domain | Category | Expiry | Consent required |
89
- | ---------------- | ----------- | -------- | --------- | ---------------- |
90
- | `__cf_bm` | .gitlab.com | unknown | < 1 day | ✅ No |
91
- | `_cfuvid` | .gitlab.com | unknown | Session | ✅ No |
92
- | `OptanonConsent` | .gitlab.com | unknown | 12 months | ✅ No |
93
-
94
- ## 4. Cookies After Consent Rejection
95
-
96
- ✅ No non-essential cookie detected after rejection.
97
-
98
- | Name | Domain | Category | Expiry | Consent required |
99
- | ----------------------- | ----------- | -------- | --------- | ---------------- |
100
- | `__cf_bm` | .gitlab.com | unknown | < 1 day | ✅ No |
101
- | `_cfuvid` | .gitlab.com | unknown | Session | ✅ No |
102
- | `OptanonAlertBoxClosed` | .gitlab.com | unknown | 12 months | ✅ No |
103
- | `OptanonConsent` | .gitlab.com | unknown | 12 months | ✅ No |
104
-
105
- ## 5. Cookies After Consent Acceptance
106
-
107
- | Name | Domain | Category | Expiry | Consent required |
108
- | ---------------------------- | ----------------- | ----------- | --------- | ---------------- |
109
- | `__cf_bm` | .gitlab.com | unknown | < 1 day | ✅ No |
110
- | `_cfuvid` | .gitlab.com | unknown | Session | ✅ No |
111
- | `OptanonAlertBoxClosed` | .gitlab.com | unknown | 12 months | ✅ No |
112
- | `_gcl_au` | .gitlab.com | unknown | 3 months | ✅ No |
113
- | `_ga` | .gitlab.com | analytics | 13 months | ⚠️ Yes |
114
- | `_ga_EVTFNG2S5Z` | .gitlab.com | analytics | 13 months | ⚠️ Yes |
115
- | `_ga_ENFH3X7M5Y` | .gitlab.com | analytics | 13 months | ⚠️ Yes |
116
- | `FPGSID` | .gitlab.com | unknown | < 1 day | ✅ No |
117
- | `FPAU` | .gitlab.com | unknown | 3 months | ⚠️ Yes |
118
- | `_sp_ses.6b85` | .gitlab.com | unknown | < 1 day | ✅ No |
119
- | `_sp_id.6b85` | .gitlab.com | unknown | 13 months | ✅ No |
120
- | `_biz_uid` | .gitlab.com | unknown | 12 months | ✅ No |
121
- | `_biz_nA` | .gitlab.com | unknown | 12 months | ✅ No |
122
- | `mutiny.user.token` | .gitlab.com | unknown | 13 months | ✅ No |
123
- | `mutiny.user.token` | .about.gitlab.com | unknown | 13 months | ✅ No |
124
- | `mutiny.user.session` | .gitlab.com | unknown | < 1 day | ✅ No |
125
- | `mutiny.user.session` | .about.gitlab.com | unknown | < 1 day | ✅ No |
126
- | `_BUID` | .bizible.com | unknown | 12 months | ✅ No |
127
- | `_biz_pendingA` | .gitlab.com | unknown | 12 months | ✅ No |
128
- | `mutiny.user.session_number` | .gitlab.com | unknown | < 1 day | ✅ No |
129
- | `mutiny.user.session_number` | .about.gitlab.com | unknown | < 1 day | ✅ No |
130
- | `mutiny.optOut` | .gitlab.com | unknown | 13 months | ✅ No |
131
- | `mutiny.optOut` | .about.gitlab.com | unknown | 13 months | ✅ No |
132
- | `mutiny.optIn` | .gitlab.com | unknown | 13 months | ✅ No |
133
- | `mutiny.optIn` | .about.gitlab.com | unknown | 13 months | ✅ No |
134
- | `_fbp` | .gitlab.com | advertising | 3 months | ⚠️ Yes |
135
- | `_gtmeec` | .gitlab.com | unknown | 3 months | ✅ No |
136
- | `IDE` | .doubleclick.net | advertising | 13 months | ⚠️ Yes |
137
- | `_biz_flagsA` | .gitlab.com | unknown | 12 months | ✅ No |
138
- | `_dcid` | .gitlab.com | unknown | 13 months | ✅ No |
139
- | `sa-userid` | .gitlab.com | unknown | 12 months | ✅ No |
140
- | `OptanonConsent` | .gitlab.com | unknown | 12 months | ✅ No |
141
-
142
- ## 6. Network Requests — Detected Trackers
143
-
144
- ### Before interaction (11 tracker(s))
145
-
146
- | Tracker | Category | URL | Type |
147
- | ------------------ | ----------- | -------------------------------------------------------------- | -------- |
148
- | Google Tag Manager | analytics | `https://www.googletagmanager.com/gtm.js?id=GTM-NJXWQL` | script |
149
- | Google Tag Manager | analytics | `https://www.googletagmanager.com/gtag/js?id=AW-1097398738...` | script |
150
- | Google Tag Manager | analytics | `https://www.googletagmanager.com/gtag/js?id=G-ENFH3X7M5Y&...` | script |
151
- | Google Tag Manager | analytics | `https://www.googletagmanager.com/gtag/js?id=G-EVTFNG2S5Z&...` | script |
152
- | Google AdSense | advertising | `https://pagead2.googlesyndication.com/pagead/conversion/1...` | fetch |
153
- | Tracking Pixel | pixel | `https://analytics.gitlab.com/g/collect?v=2&tid=G-ENFH3X7M...` | fetch |
154
- | Tracking Pixel | pixel | `https://analytics.gitlab.com/g/collect?v=2&tid=G-EVTFNG2S...` | fetch |
155
- | Google AdSense | advertising | `https://pagead2.googlesyndication.com/ccm/collect?frm=0&e...` | fetch |
156
- | Google AdSense | advertising | `https://pagead2.googlesyndication.com/ccm/collect?frm=0&e...` | fetch |
157
- | Google AdSense | advertising | `https://pagead2.googlesyndication.com/ccm/collect?frm=0&d...` | fetch |
158
- | Google Tag Manager | analytics | `https://www.googletagmanager.com/static/service_worker/62...` | document |
159
-
160
- ### After acceptance (25 tracker(s))
161
-
162
- | Tracker | Category | URL | Type |
163
- | ------------------ | ----------- | -------------------------------------------------------------- | -------- |
164
- | Google Tag Manager | analytics | `https://www.googletagmanager.com/gtm.js?id=GTM-NJXWQL` | script |
165
- | Google Tag Manager | analytics | `https://www.googletagmanager.com/gtag/js?id=AW-1097398738...` | script |
166
- | Google Tag Manager | analytics | `https://www.googletagmanager.com/gtag/js?id=G-ENFH3X7M5Y&...` | script |
167
- | Google Tag Manager | analytics | `https://www.googletagmanager.com/gtag/js?id=G-EVTFNG2S5Z&...` | script |
168
- | Tracking Pixel | pixel | `https://analytics.gitlab.com/g/collect?v=2&tid=G-EVTFNG2S...` | fetch |
169
- | Google AdSense | advertising | `https://pagead2.googlesyndication.com/pagead/conversion/1...` | fetch |
170
- | Tracking Pixel | pixel | `https://analytics.gitlab.com/g/collect?v=2&tid=G-ENFH3X7M...` | fetch |
171
- | Google Tag Manager | analytics | `https://www.googletagmanager.com/static/service_worker/62...` | document |
172
- | Google AdSense | advertising | `https://pagead2.googlesyndication.com/ccm/collect?frm=0&e...` | fetch |
173
- | Google AdSense | advertising | `https://pagead2.googlesyndication.com/ccm/collect?frm=0&e...` | fetch |
174
- | Google AdSense | advertising | `https://pagead2.googlesyndication.com/ccm/collect?frm=0&d...` | fetch |
175
- | Tracking Pixel | pixel | `https://analytics.gitlab.com/g/collect?v=2&tid=G-EVTFNG2S...` | fetch |
176
- | Google DoubleClick | advertising | `https://googleads.g.doubleclick.net/pagead/viewthroughcon...` | script |
177
- | Google DoubleClick | advertising | `https://googleads.g.doubleclick.net/pagead/viewthroughcon...` | script |
178
- | Google Ad Services | advertising | `https://www.googleadservices.com/pagead/conversion/109739...` | fetch |
179
- | Tracking Pixel | pixel | `https://analytics.gitlab.com/g/collect?v=2&tid=G-ENFH3X7M...` | fetch |
180
- | Tracking Pixel | pixel | `https://analytics.gitlab.com/g/collect?v=2&tid=G-EVTFNG2S...` | fetch |
181
- | Tracking Pixel | pixel | `https://analytics.gitlab.com/g/collect?v=2&tid=G-ENFH3X7M...` | fetch |
182
- | Tracking Pixel | pixel | `https://www.google.com/ccm/collect?frm=0&en=consent_updat...` | fetch |
183
- | Tracking Pixel | pixel | `https://analytics.gitlab.com/data?v=2&event=page_view&dtd...` | image |
184
-
185
- _... and 5 additional request(s)._
186
-
187
- ## 7. Recommendations
188
-
189
- 1. **Do not set any non-essential cookie before consent.** Gate the initialisation of third-party scripts on acceptance.
190
-
191
- 1. **Complete the modal information**: purposes, identity of sub-processors, retention period, right to withdraw.
192
-
193
- ## Legal References
194
-
195
- - **RGPD Art. 7** — Conditions for consent
196
- - **RGPD Recital 32** — Consent must result from an unambiguous positive action
197
- - **ePrivacy Directive 2002/58/EC** — Consent requirement for non-essential cookies
198
- - **CEPD Guidelines 05/2020** — Consent under the RGPD
199
- - **CEPD Guidelines 03/2022** — Dark patterns on platforms
200
- - **CNIL Recommendation 2022** — Rejection must be as easy as acceptance (same number of clicks)
@@ -1,44 +0,0 @@
1
- # GDPR Compliance Checklist — npmjs.com
2
-
3
- > **Scan date:** 22/02/2026, 19:25:09
4
- > **Scanned URL:** https://npmjs.com
5
- > **Global score:** 25/100 — Grade **F**
6
-
7
- **5 rule(s) compliant** · **11 non-compliant** · **1 warning(s)**
8
-
9
- ## Consent
10
-
11
- | Rule | Reference | Status | Detail |
12
- | ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | ------------------------------- |
13
- | Consent modal detected | [GDPR Art. 7](https://gdpr-info.eu/art-7-gdpr/) · [ePrivacy Dir. Art. 5(3)](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32002L0058) | ❌ Non-compliant | No consent banner detected |
14
- | No pre-ticked checkboxes | [GDPR Recital 32](https://gdpr-info.eu/recitals/no-32/) | ✅ Compliant | No pre-ticked checkbox detected |
15
- | Accept button label is unambiguous | [GDPR Art. 4(11)](https://gdpr-info.eu/art-4-gdpr/) | ✅ Compliant | Modal not detected |
16
-
17
- ## Easy refusal
18
-
19
- | Rule | Reference | Status | Detail |
20
- | ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | ------------------ |
21
- | Reject button present at first layer | [CNIL Recommendation 2022](https://www.cnil.fr/fr/cookies-et-autres-traceurs/regles/cookies) | ❌ Non-compliant | Modal not detected |
22
- | Rejecting requires no more clicks than accepting | [CNIL Recommendation 2022](https://www.cnil.fr/fr/cookies-et-autres-traceurs/regles/cookies) | ❌ Non-compliant | Modal not detected |
23
- | Size symmetry between Accept and Reject | [EDPB Guidelines 03/2022](https://www.edpb.europa.eu/system/files/2022-03/edpb_03-2022_guidelines_on_dark_patterns_in_social_media_platform_interfaces_en.pdf) | ❌ Non-compliant | Modal not detected |
24
- | Font symmetry between Accept and Reject | [EDPB Guidelines 03/2022](https://www.edpb.europa.eu/system/files/2022-03/edpb_03-2022_guidelines_on_dark_patterns_in_social_media_platform_interfaces_en.pdf) | ❌ Non-compliant | Modal not detected |
25
-
26
- ## Transparency
27
-
28
- | Rule | Reference | Status | Detail |
29
- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | --------------------------------------------- |
30
- | Granular controls available | [EDPB Guidelines 05/2020](https://edpb.europa.eu/our-work-tools/our-documents/guidelines/guidelines-052020-consent-under-regulation-2016679_en) | ❌ Non-compliant | Modal not detected |
31
- | Processing purposes mentioned | [GDPR Art. 13-14](https://gdpr-info.eu/art-13-gdpr/) | ❌ Non-compliant | Modal not detected |
32
- | Sub-processors / third parties mentioned | [GDPR Art. 13-14](https://gdpr-info.eu/art-13-gdpr/) | ❌ Non-compliant | Modal not detected |
33
- | Retention period mentioned | [GDPR Art. 13(2)(a)](https://gdpr-info.eu/art-13-gdpr/) | ❌ Non-compliant | Modal not detected |
34
- | Right to withdraw consent mentioned | [GDPR Art. 7(3)](https://gdpr-info.eu/art-7-gdpr/) | ❌ Non-compliant | Modal not detected |
35
- | Privacy policy link present in the consent modal | [GDPR Art. 13](https://gdpr-info.eu/art-13-gdpr/) | ❌ Non-compliant | Modal not detected |
36
- | Privacy policy accessible from the main page | [GDPR Art. 13](https://gdpr-info.eu/art-13-gdpr/) | ⚠️ Warning | No privacy policy link found on the main page |
37
-
38
- ## Cookie behavior
39
-
40
- | Rule | Reference | Status | Detail |
41
- | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | -------------------------------------------------- |
42
- | No non-essential cookie before consent | [GDPR Art. 7](https://gdpr-info.eu/art-7-gdpr/) · [ePrivacy Dir. Art. 5(3)](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32002L0058) | ✅ Compliant | No non-essential cookie set before interaction |
43
- | Non-essential cookies removed after rejection | [GDPR Art. 7](https://gdpr-info.eu/art-7-gdpr/) · [CNIL Recommendation 2022](https://www.cnil.fr/fr/cookies-et-autres-traceurs/regles/cookies) | ✅ Compliant | No non-essential cookie persisting after rejection |
44
- | No network tracker before consent | [GDPR Art. 7](https://gdpr-info.eu/art-7-gdpr/) · [ePrivacy Dir. Art. 5(3)](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32002L0058) | ✅ Compliant | No tracker request fired before interaction |
@@ -1,25 +0,0 @@
1
- # Cookie Inventory — npmjs.com
2
-
3
- > **Scan date:** 22/02/2026, 19:25:09
4
- > **Scanned URL:** https://npmjs.com
5
- > **Unique cookies detected:** 2
6
-
7
- ## Instructions
8
-
9
- This table lists all cookies detected during the scan, across all phases.
10
- The **Description / Purpose** column is to be filled in by the DPO or technical owner.
11
-
12
- - **Before consent** — cookie present from page load, before any interaction
13
- - **After acceptance** — cookie set or persisting after clicking "Accept all"
14
- - **After rejection** — cookie present after clicking "Reject all"
15
-
16
- ## Cookie table
17
-
18
- | Cookie | Domain | Category | Phases | Expiry | Consent required | Description / Purpose |
19
- | --------- | ---------- | -------- | -------------- | ------- | ---------------- | --------------------- |
20
- | `__cf_bm` | .npmjs.com | Unknown | before consent | < 1 day | ✅ No | <!-- fill in --> |
21
- | `_cfuvid` | .npmjs.com | Unknown | before consent | Session | ✅ No | <!-- fill in --> |
22
-
23
- ---
24
-
25
- _Automatically generated by gdpr-cookie-scanner. Categories marked "Unknown" could not be identified automatically and should be verified manually._
@@ -1,88 +0,0 @@
1
- # GDPR Compliance Report — npmjs.com
2
-
3
- > **Scan date:** 22/02/2026, 19:25:09
4
- > **Scanned URL:** https://npmjs.com
5
- > **Scan duration:** 7.1s
6
- > **Tool:** gdpr-cookie-scanner v0.1.0
7
-
8
- ## Global Compliance Score
9
-
10
- ### 🔴 25/100 — Grade F
11
-
12
- | Criterion | Score | Progress | Status |
13
- | ---------------- | ---------- | ---------- | ------ |
14
- | Consent validity | 0/25 | ░░░░░░░░░░ | ❌ |
15
- | Easy refusal | 0/25 | ░░░░░░░░░░ | ❌ |
16
- | Transparency | 0/25 | ░░░░░░░░░░ | ❌ |
17
- | Cookie behavior | 25/25 | ██████████ | ✅ |
18
- | **TOTAL** | **25/100** | | **F** |
19
-
20
- ## Executive Summary
21
-
22
- ❌ **No consent modal detected.** The site sets cookies without requesting consent.
23
- ✅ No non-essential cookie set before interaction.
24
- ✅ Non-essential cookies are correctly removed after rejection.
25
- ✅ No tracker requests before consent.
26
-
27
- **1 critical issue(s)** and **1 warning(s)** identified.
28
-
29
- ## 1. Consent Modal
30
-
31
- _No consent modal detected on the page._
32
-
33
- ## 2. Dark Patterns and Detected Issues
34
-
35
- ### ❌ Critical issues
36
-
37
- **No cookie consent modal detected**
38
-
39
- > A consent mechanism is required before depositing non-essential cookies
40
-
41
- ### ⚠️ Warnings
42
-
43
- **No privacy policy link found on the page**
44
-
45
- > A privacy policy must be accessible from every page (GDPR Art. 13)
46
-
47
- ## 3. Cookies Set Before Any Interaction
48
-
49
- | Name | Domain | Category | Expiry | Consent required |
50
- | --------- | ---------- | -------- | ------- | ---------------- |
51
- | `__cf_bm` | .npmjs.com | unknown | < 1 day | ✅ No |
52
- | `_cfuvid` | .npmjs.com | unknown | Session | ✅ No |
53
-
54
- ## 4. Cookies After Consent Rejection
55
-
56
- ✅ No non-essential cookie detected after rejection.
57
-
58
- _No cookies detected._
59
-
60
- ## 5. Cookies After Consent Acceptance
61
-
62
- _No cookies detected._
63
-
64
- ## 6. Network Requests — Detected Trackers
65
-
66
- _No known network tracker detected._
67
-
68
- ## 7. Recommendations
69
-
70
- 1. **Deploy a CMP solution** (e.g. Axeptio, Didomi, OneTrust, Cookiebot) that displays a consent modal before any non-essential cookie.
71
-
72
- 1. **Add a "Reject all" button** at the first layer of the modal, requiring no more clicks than "Accept all" (CNIL 2022).
73
-
74
- 1. **Complete the modal information**: purposes, identity of sub-processors, retention period, right to withdraw.
75
-
76
- ## Scan Errors and Warnings
77
-
78
- - ⚠️ No reject button found — could not test rejection flow
79
- - ⚠️ No accept button found — could not test acceptance flow
80
-
81
- ## Legal References
82
-
83
- - **RGPD Art. 7** — Conditions for consent
84
- - **RGPD Recital 32** — Consent must result from an unambiguous positive action
85
- - **ePrivacy Directive 2002/58/EC** — Consent requirement for non-essential cookies
86
- - **CEPD Guidelines 05/2020** — Consent under the RGPD
87
- - **CEPD Guidelines 03/2022** — Dark patterns on platforms
88
- - **CNIL Recommendation 2022** — Rejection must be as easy as acceptance (same number of clicks)
@@ -1,44 +0,0 @@
1
- # GDPR Compliance Checklist — reddit.com
2
-
3
- > **Scan date:** 22/02/2026, 19:17:05
4
- > **Scanned URL:** https://reddit.com
5
- > **Global score:** 34/100 — Grade **F**
6
-
7
- **9 rule(s) compliant** · **3 non-compliant** · **5 warning(s)**
8
-
9
- ## Consent
10
-
11
- | Rule | Reference | Status | Detail |
12
- | ---------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | -------------------------------------- |
13
- | Consent modal detected | [GDPR Art. 7](https://gdpr-info.eu/art-7-gdpr/) · [ePrivacy Dir. Art. 5(3)](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32002L0058) | ✅ Compliant | Detected (`[aria-label*='consent' i]`) |
14
- | No pre-ticked checkboxes | [GDPR Recital 32](https://gdpr-info.eu/recitals/no-32/) | ✅ Compliant | No pre-ticked checkbox detected |
15
- | Accept button label is unambiguous | [GDPR Art. 4(11)](https://gdpr-info.eu/art-4-gdpr/) | ✅ Compliant | No Accept button detected |
16
-
17
- ## Easy refusal
18
-
19
- | Rule | Reference | Status | Detail |
20
- | ------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | ------------------------------- |
21
- | Reject button present at first layer | [CNIL Recommendation 2022](https://www.cnil.fr/fr/cookies-et-autres-traceurs/regles/cookies) | ❌ Non-compliant | No Reject button at first layer |
22
- | Rejecting requires no more clicks than accepting | [CNIL Recommendation 2022](https://www.cnil.fr/fr/cookies-et-autres-traceurs/regles/cookies) | ✅ Compliant | Cannot verify (missing buttons) |
23
- | Size symmetry between Accept and Reject | [EDPB Guidelines 03/2022](https://www.edpb.europa.eu/system/files/2022-03/edpb_03-2022_guidelines_on_dark_patterns_in_social_media_platform_interfaces_en.pdf) | ✅ Compliant | Button sizes are comparable |
24
- | Font symmetry between Accept and Reject | [EDPB Guidelines 03/2022](https://www.edpb.europa.eu/system/files/2022-03/edpb_03-2022_guidelines_on_dark_patterns_in_social_media_platform_interfaces_en.pdf) | ✅ Compliant | Font sizes are comparable |
25
-
26
- ## Transparency
27
-
28
- | Rule | Reference | Status | Detail |
29
- | ------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | ---------------------------------------------------------- |
30
- | Granular controls available | [EDPB Guidelines 05/2020](https://edpb.europa.eu/our-work-tools/our-documents/guidelines/guidelines-052020-consent-under-regulation-2016679_en) | ⚠️ Warning | No granular controls (checkboxes or panel) detected |
31
- | Processing purposes mentioned | [GDPR Art. 13-14](https://gdpr-info.eu/art-13-gdpr/) | ⚠️ Warning | Information absent from the modal text |
32
- | Sub-processors / third parties mentioned | [GDPR Art. 13-14](https://gdpr-info.eu/art-13-gdpr/) | ⚠️ Warning | Information absent from the modal text |
33
- | Retention period mentioned | [GDPR Art. 13(2)(a)](https://gdpr-info.eu/art-13-gdpr/) | ⚠️ Warning | Information absent from the modal text |
34
- | Right to withdraw consent mentioned | [GDPR Art. 7(3)](https://gdpr-info.eu/art-7-gdpr/) | ⚠️ Warning | Information absent from the modal text |
35
- | Privacy policy link present in the consent modal | [GDPR Art. 13](https://gdpr-info.eu/art-13-gdpr/) | ✅ Compliant | Link found: https://www.reddit.com/policies/privacy-policy |
36
- | Privacy policy accessible from the main page | [GDPR Art. 13](https://gdpr-info.eu/art-13-gdpr/) | ✅ Compliant | Link found: https://www.reddit.com/policies/privacy-policy |
37
-
38
- ## Cookie behavior
39
-
40
- | Rule | Reference | Status | Detail |
41
- | --------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------- | ------------------------------------------------------ |
42
- | No non-essential cookie before consent | [GDPR Art. 7](https://gdpr-info.eu/art-7-gdpr/) · [ePrivacy Dir. Art. 5(3)](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32002L0058) | ❌ Non-compliant | 2 illegal cookie(s): `loid` (unknown), `csv` (unknown) |
43
- | Non-essential cookies removed after rejection | [GDPR Art. 7](https://gdpr-info.eu/art-7-gdpr/) · [CNIL Recommendation 2022](https://www.cnil.fr/fr/cookies-et-autres-traceurs/regles/cookies) | ✅ Compliant | No non-essential cookie persisting after rejection |
44
- | No network tracker before consent | [GDPR Art. 7](https://gdpr-info.eu/art-7-gdpr/) · [ePrivacy Dir. Art. 5(3)](https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX%3A32002L0058) | ❌ Non-compliant | 3 tracker(s): Tracking Pixel (image) |
@@ -1,33 +0,0 @@
1
- # Cookie Inventory — reddit.com
2
-
3
- > **Scan date:** 22/02/2026, 19:17:05
4
- > **Scanned URL:** https://reddit.com
5
- > **Unique cookies detected:** 10
6
-
7
- ## Instructions
8
-
9
- This table lists all cookies detected during the scan, across all phases.
10
- The **Description / Purpose** column is to be filled in by the DPO or technical owner.
11
-
12
- - **Before consent** — cookie present from page load, before any interaction
13
- - **After acceptance** — cookie set or persisting after clicking "Accept all"
14
- - **After rejection** — cookie present after clicking "Reject all"
15
-
16
- ## Cookie table
17
-
18
- | Cookie | Domain | Category | Phases | Expiry | Consent required | Description / Purpose |
19
- | --------------------------- | ------------------------ | ------------------ | -------------- | --------- | ---------------- | --------------------- |
20
- | `csrf_token` | .reddit.com | Strictly necessary | before consent | Session | ✅ No | <!-- fill in --> |
21
- | `__cf_bm` | .emoji.redditmedia.com | Unknown | before consent | < 1 day | ✅ No | <!-- fill in --> |
22
- | `__cf_bm` | .w3-reporting.reddit.com | Unknown | before consent | < 1 day | ✅ No | <!-- fill in --> |
23
- | `_GRECAPTCHA` | www.google.com | Unknown | before consent | 6 months | ✅ No | <!-- fill in --> |
24
- | `csv` | .reddit.com | Unknown | before consent | 13 months | ⚠️ Yes | <!-- fill in --> |
25
- | `edgebucket` | .reddit.com | Unknown | before consent | 13 months | ✅ No | <!-- fill in --> |
26
- | `loid` | .reddit.com | Unknown | before consent | 13 months | ⚠️ Yes | <!-- fill in --> |
27
- | `reddit_translation_status` | www.reddit.com | Unknown | before consent | 12 months | ✅ No | <!-- fill in --> |
28
- | `session_tracker` | .reddit.com | Unknown | before consent | Session | ✅ No | <!-- fill in --> |
29
- | `token_v2` | .reddit.com | Unknown | before consent | 1 days | ✅ No | <!-- fill in --> |
30
-
31
- ---
32
-
33
- _Automatically generated by gdpr-cookie-scanner. Categories marked "Unknown" could not be identified automatically and should be verified manually._