diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index db4f4bc..5448c58 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -7,5 +7,5 @@ contact_links: url: https://github.com/Apolloccrypt/nl-data-optout/blob/main/README.md about: Check the README for usage instructions and FAQ. - name: πŸ”— LinkedIn Contact - url: https://linkedin.com/in/mick-beer + url: https://www.linkedin.com/in/mick-beer/ about: For complex questions or media inquiries, contact Mick Beer directly. diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..600a98c --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,8 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "weekly" + commit-message: + prefix: "chore" diff --git a/.github/workflows/hugo.yml b/.github/workflows/hugo.yml new file mode 100644 index 0000000..372eeda --- /dev/null +++ b/.github/workflows/hugo.yml @@ -0,0 +1,51 @@ +name: Deploy Hugo to GitHub Pages + # re-register workflow + +on: + push: + branches: [main] + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: false + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + with: + submodules: recursive + fetch-depth: 0 + + - name: Setup Hugo + uses: peaceiris/actions-hugo@75d2e84710de30f6ff7268e08f310b60ef14033f # v3.0.0 + with: + hugo-version: latest + extended: false + + - name: Build + run: hugo --minify --baseURL "https://${GITHUB_REPOSITORY_OWNER}.github.io/${GITHUB_REPOSITORY#*/}/" + + - name: Upload Pages artifact + uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0 + with: + path: ./public + + deploy: + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deploy.outputs.page_url }} + steps: + - name: Deploy to GitHub Pages + id: deploy + uses: actions/deploy-pages@cd2ce8fcbc39b97be8ca5fce6e763baed58fa128 # v5.0.0 diff --git a/.gitignore b/.gitignore index d3046e7..15fff20 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,9 @@ package-lock.json # Personal notes notes.md TODO.md + +# Hugo build output +/public/ +/resources/ +.hugo_build.lock +/.claude diff --git a/CHANGELOG.md b/CHANGELOG.md index d9b1a82..75976a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,115 +1,88 @@ # Changelog -All notable changes to this project will be documented in this file. +Alle noemenswaardige wijzigingen aan dit project worden in dit bestand bijgehouden. -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +Het formaat is gebaseerd op [Keep a Changelog](https://keepachangelog.com/nl/1.1.0/), +dit project hanteert [Semantic Versioning](https://semver.org/lang/nl/), +en commit-berichten volgen grotendeels de stijl van [Conventional Commits](https://www.conventionalcommits.org/nl/v1.0.0/). --- -## [1.1.0] - 2026-03-21 - -### Added -- **Meta/Facebook formulier fix** – detecteert dat Meta geen email meer accepteert, geeft formulier instructies -- **Notes systeem** – waarschuwingsbanner voor bedrijven met speciale instructies -- **60+ brokers** – uitgebreide lijst (was 25) -- **CategorieΓ«n teller** – toont aantal brokers per categorie in dropdown -- **Dark pattern waarschuwing** – bij formulier-vereiste bedrijven -- **Kopieer naar clipboard** knop – makkelijker copy-paste -- **Changelog link** in footer -- **Bug report link** in disclaimer -- **GitHub Issues templates** (broken contact, feature request) +## [2.0.2] - 2026-04-19 ### Changed -- **UI verbeteringen** – betere warnings, info boxes, button styling -- **Broker object structuur** – toegevoegd: `note`, `isForm`, `formUrl` fields -- **Email template** – duidelijkere formatting -- **Footer** – LinkedIn link, versie nummer, changelog link -- **Result box** – betere formatting, copy button, tips - -### Fixed -- **Meta contact** – `datarequests@support.facebook.com` vervangen door formulier -- **JavaScript escaping** – backticks en dollar signs in template copy -- **Mobile responsive** – betere display op kleine schermen - -### Documentation -- README.md volledig herschreven -- CONTRIBUTING.md toegevoegd -- Issue templates toegevoegd -- Changelog gestart +- dubbele GitHub Actions workflow verwijderd (`deploy.yml` conflicteerde met `hugo.yml`) +- alle Actions gepind op SHA-hash voor reproduceerbare en veilige builds +- Actions bijgewerkt naar nieuwste versies: `checkout` v6.0.2, `upload-pages-artifact` v5.0.0, `deploy-pages` v5.0.0 +- `baseURL` wordt nu dynamisch berekend via `GITHUB_REPOSITORY_OWNER` en `GITHUB_REPOSITORY`, zodat forks automatisch de juiste paden genereren +- `renovate.json` verwijderd (vereist extern mend.io account); Dependabot beheert voortaan dependency-updates +- Bootstrap bijgewerkt van 5.3.3 naar 5.3.8 +- Bootstrap Icons bijgewerkt van 1.11.3 naar 1.13.1 +- dubbele AppNexus (Xandr) entry verwijderd uit brokerlijst; de uitgebreide Xandr-entry was al correct en compleet --- -## [1.0.0] - 2026-03-20 +## [2.0.1] - 2026-04-10 -### Added -- **Eerste release** – 25 Nederlandse data brokers -- **GDPR Art. 21, 17, 15** – bezwaar, wissen, inzage -- **CategorieΓ«n** – Credit Bureaus, Ad-Tech, Media, Telecom, Retail -- **"Ander bedrijf" optie** – handmatige invoer -- **100% lokaal** – geen server, geen tracking -- **MIT License** – open source -- **GitHub Pages** – live hosting - -### Features -- Naam + email input -- Bedrijf selectie (dropdown met categorieΓ«n) -- Type verzoek (bezwaar / wissen / inzage / beide) -- Automatische mailto: link generatie -- Email template met GDPR artikelen -- Volledige disclaimer -- Mobile-friendly design +### Changed +- visuele stijl gelijkgetrokken met [mickbeer.com](https://mickbeer.com) +- contrast en kleurproblemen opgelost: donate-knop, dark mode kleurtokens, taalschakelaar separator +- footer ingekort: toont nu alleen versienummer en datum --- -## Toekomstige Updates +## [2.0.0] - 2026-04-10 -### Geplanned -- [ ] **English version** (international brokers) -- [ ] **CSV export** – track welke verzoeken je verstuurd hebt -- [ ] **Response tracker** – check of bedrijven binnen 1 maand reageren -- [ ] **EU brokers** – uitbreiding naar andere EU landen -- [ ] **API voor automatisering** – bulk verzoeken (optioneel) +### Changed +- volledige herbouw als Hugo statische site (van losse index.html naar Hugo-template systeem) +- meertalige ondersteuning: Nederlands (standaard) en Engels via Hugo i18n +- nieuwe visuele stijl geΓ―nspireerd op [mickbeer.com](https://mickbeer.com): crΓ¨me achtergrond, Playfair Display serif headings, amber accenten +- GitHub Pages URL: `https://apolloccrypt.github.io/nl-data-optout/` +- footer uitgebreid: changelog-link, versienummer, donatie-knop, LinkedIn en Medium links +- donatie-knop (Buy me a coffee) in footer van elke pagina +- GitHub Actions workflow bijgewerkt voor Hugo deploy op push naar `main` +- "Over dit project" sectie uitgebreid met toelichting over reikwijdte: NL-markt + buitenlandse partijen actief in Nederland +- alle UI-strings in script.js tweetalig (Nederlands/Engels) via `window.SITE_LANG` -### Community Requests -- [ ] Browser extension (optioneel) -- [ ] Template customization (eigen tekst) -- [ ] Multi-language support +### Fixed +- broker-teller toont correct "Nederlandse data brokers" --- -## Contact veranderingen +## [1.2.1] - 2026-04-06 -### Meta/Facebook (maart 2026) -- **Oud:** `datarequests@support.facebook.com` -- **Nieuw:** Contact formulier verplicht -- **URL:** https://www.facebook.com/help/contact/540977946302970 -- **Reden:** Dark pattern – email vervangen door formulier (meer friction) -- **Gemeld door:** Tobias L. (LinkedIn community) -- **Fix:** v1.1.0 - -### Rapporteer contact wijzigingen via GitHub Issues! +- Wayback Machine / Internet Archive toegevoegd als data broker +- NL/EN taalschakelaar bij e-mail generatieknop +- Broker-teller gecorrigeerd naar "Nederlandse data brokers" --- -## Versie Nummering - -We gebruiken [Semantic Versioning](https://semver.org/): +## [1.2.0] - 2026-03-31 -- **MAJOR** (1.x.x) – Breaking changes (bijv. volledige UI redesign) -- **MINOR** (x.1.x) – Nieuwe features (bijv. nieuwe brokers, nieuwe functionaliteit) -- **PATCH** (x.x.1) – Bug fixes, contact updates, kleine verbeteringen +- Code uitgesplitst in script.js en style.css +- Identifiers omgezet naar Engels (camelCase JS, kebab-case HTML/CSS) +- Microsoft ([#1](https://github.com/Apolloccrypt/nl-data-optout/issues/1)), Pinterest ([#2](https://github.com/Apolloccrypt/nl-data-optout/issues/2)), DPG Media ([#3](https://github.com/Apolloccrypt/nl-data-optout/issues/3)) omgezet naar formulier; Bol.com ([#4](https://github.com/Apolloccrypt/nl-data-optout/issues/4)) login-only +- Documentatie (README, CONTRIBUTING, DEPLOYMENT, CHANGELOG) ingekort --- -## Contributors +## [1.1.1] - 2026-03-22 + +- Xandr en SmartOcto contactadressen gecorrigeerd (bouncende e-mails) +- Xandr: 0% GDPR response rate toegevoegd (noyb 2024) +- Parse-fouten in brokers array opgelost + +--- -- **Mick Beer** (@Apolloccrypt) – Creator, maintainer -- **Tobias L.** – Meta contact update report -- **Community** – Bug reports, feature requests +## [1.1.0] - 2026-03-21 -Wil je bijdragen? Zie [CONTRIBUTING.md](CONTRIBUTING.md)! +- 60+ brokers (was 25), verdeeld in categorieen met teller +- Formulierdetectie met waarschuwingsbanner en dark pattern notitie +- Kopieer-naar-klembord knop +- Meta omgezet naar formulier --- -

Last update: 21 maart 2026

+## [1.0.0] - 2026-03-20 + +- Eerste release: 25 NL data brokers, Art. 15/17/21, lokaal, MIT diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b82f6fd..f5f9c75 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,169 +1,25 @@ -# Contributing to NL Data Brokers Opt-Out Tool +# Contributing -Thanks for your interest in improving this tool! πŸ™ +## Verouderd contactadres melden -We welcome contributions from the community. Here's how you can help: +Open een [issue](https://github.com/Apolloccrypt/nl-data-optout/issues/new?template=broken-contact.md) +met de bedrijfsnaam, het oude adres en het nieuwe adres of formulier. ---- +## Broker toevoegen -## πŸ› Reporting Bugs +Via een issue of pull request. Zie DEPLOYMENT.md voor de technische details. -### Contact Email Changed? -If a broker's privacy email no longer works: +Een broker wordt toegevoegd als het bedrijf in Nederland actief is, persoonsgegevens +verwerkt van Nederlandse burgers, en een publiek privacycontact heeft. -1. [Open an Issue](https://github.com/Apolloccrypt/nl-data-optout/issues/new?template=broken-contact.md) -2. Include: - - Broker name - - Old email (if known) - - New email or contact method - - How you discovered this (bounce, company website, etc.) +## Code bijdragen -**We aim to fix contact changes within 24-48 hours.** +De site gebruikt [Hugo](https://gohugo.io/). Fork de repo, installeer Hugo en run +`hugo server` om lokaal te testen. Open een pull request en voeg een regel toe aan CHANGELOG.md. ---- +Geen server-side code, geen tracking. -## ✨ Adding New Brokers +## Vragen -Want to add a data broker to the list? - -### Requirements: -- Dutch company OR active in Netherlands -- Processes personal data of Dutch citizens -- Has public privacy contact (email or form) - -### How to add: - -**Option 1: Issue (easiest)** -1. [Open a Feature Request](https://github.com/Apolloccrypt/nl-data-optout/issues/new?template=feature-request.md) -2. Include: - - Company name - - Privacy email (usually `privacy@company.nl`) - - Category (Credit Bureau / Ad-Tech / Telecom / Retail / Media / Analytics / Marketing) - - Optional: Why it's relevant (e.g., "Used by 5+ Dutch news sites") - -**Option 2: Pull Request (advanced)** -1. Fork this repo -2. Edit `index.html` (around line 119) -3. Add broker to `brokers` array: - ```javascript - { - name: "Company Name", - email: "privacy@company.nl", - category: "Ad-Tech & Tracking", - note: "Optional note (e.g., 'Used by XYZ site')" - }, - ``` -4. Test locally (open `index.html` in browser) -5. Update `CHANGELOG.md` -6. Submit PR - ---- - -## πŸ”§ Code Contributions - -### Tech Stack: -- HTML5 (structure) -- Vanilla JavaScript (no frameworks!) -- CSS3 (styling) - -**No build step required** – just edit and open in browser. - -### Code Style: -- Use existing formatting -- Add comments for complex logic -- Keep JavaScript simple (accessible to non-devs) -- No external dependencies (keep it 100% local) - -### Pull Request Process: -1. Fork repo -2. Create feature branch (`git checkout -b feature/new-broker`) -3. Make changes -4. Test locally (open `index.html` in multiple browsers) -5. Update `CHANGELOG.md` (add to `[Unreleased]` section) -6. Commit with clear message (`Add broker: CompanyName`) -7. Push to fork -8. Open Pull Request - -**We review PRs within 1-3 days.** - ---- - -## πŸ“ Documentation - -Help improve docs: -- Fix typos in README -- Clarify usage instructions -- Add examples -- Translate (future: English version) - ---- - -## 🌍 Internationalization - -**Future goal:** Support EU-wide brokers. - -Interested in creating an English version or adding international brokers? -Open a Discussion or Issue to coordinate! - ---- - -## 🚫 What We Don't Accept - -- External dependencies (jQuery, React, npm packages) -- Server-side code (keep it 100% client-side) -- Tracking/analytics scripts -- Non-privacy-related brokers -- Malicious code or spam - ---- - -## πŸ’¬ Community - -- **GitHub Issues:** Bug reports, feature requests -- **GitHub Discussions:** General questions, ideas -- **LinkedIn:** [@mickbeer](https://linkedin.com/in/mick-beer) – DM for complex questions - ---- - -## πŸ† Recognition - -Contributors are credited in: -- `CHANGELOG.md` -- README (if significant contribution) - ---- - -## βš–οΈ Legal - -By contributing, you agree: -- Your contributions are your own work -- You grant this project rights to use your contribution under MIT License -- No guarantee of merge (we review all PRs) - ---- - -## 🎯 Priority Issues - -Looking for where to help? Check these: - -**High Priority:** -- ![high-priority](https://img.shields.io/badge/-high%20priority-red) labels -- Contact changes (broken emails) -- Security issues - -**Good First Issues:** -- ![good-first-issue](https://img.shields.io/badge/-good%20first%20issue-green) labels -- Adding new brokers -- Documentation improvements - ---- - -## πŸ“ž Questions? - -Not sure how to contribute? Open an Issue or DM [@mickbeer](https://linkedin.com/in/mick-beer) on LinkedIn. - -**We're friendly and help new contributors!** πŸ‘‹ - ---- - -

Thanks for helping make tracking more transparent! πŸ›‘οΈ

+- https://github.com/Apolloccrypt/nl-data-optout/issues +- https://www.linkedin.com/in/mick-beer/ diff --git a/DEPLOYMENT.md b/DEPLOYMENT.md index 9bbcff1..276f79a 100644 --- a/DEPLOYMENT.md +++ b/DEPLOYMENT.md @@ -1,237 +1,64 @@ -# πŸš€ Deployment & Update Guide +# Deployment -## Quick Reference +Live site: https://apolloccrypt.github.io/nl-data-optout/ -**Live site:** https://apolloccrypt.github.io/nl-data-optout/ -**Repository:** https://github.com/Apolloccrypt/nl-data-optout ---- +## Automatische deployment met Hugo & GitHub Actions -## πŸ“¦ File Structure +Deze site gebruikt [Hugo](https://gohugo.io/) als static site generator. Bij elke push naar `main` wordt de site automatisch gebouwd en gedeployed naar GitHub Pages via een [GitHub Actions workflow](.github/workflows/deploy.yml). -``` -nl-data-optout/ -β”œβ”€β”€ index.html # Main tool (all-in-one file) -β”œβ”€β”€ README.md # Documentation -β”œβ”€β”€ CHANGELOG.md # Version history -β”œβ”€β”€ CONTRIBUTING.md # Contribution guidelines -β”œβ”€β”€ LICENSE # MIT License -β”œβ”€β”€ .gitignore # Git ignore rules -└── .github/ - └── ISSUE_TEMPLATE/ - β”œβ”€β”€ config.yml # Issue template config - β”œβ”€β”€ broken-contact.md - β”œβ”€β”€ feature-request.md - └── bug-report.md -``` - ---- - -## πŸ”„ How to Update - -### **Option 1: GitHub Web Interface (Easiest)** - -1. Go to https://github.com/Apolloccrypt/nl-data-optout -2. Click on `index.html` -3. Click "Edit" (pencil icon) -4. Make changes -5. Scroll down β†’ "Commit changes" -6. Add commit message (e.g., "Add broker: CompanyName") -7. Commit directly to `main` branch -8. **Wait 1-2 minutes** β†’ Changes live at https://apolloccrypt.github.io/nl-data-optout/ - ---- - -### **Option 2: Git Command Line** - -```bash -# Clone repo -git clone https://github.com/Apolloccrypt/nl-data-optout.git -cd nl-data-optout - -# Make changes (edit index.html) - -# Test locally -open index.html # macOS -xdg-open index.html # Linux -start index.html # Windows - -# Commit -git add . -git commit -m "Add broker: CompanyName" -git push origin main +**BaseURL:** De workflow forceert altijd de baseURL naar `https://apolloccrypt.github.io/nl-data-optout/`, zodat alle links en assets correct werken op de upstream site. -# Wait 1-2 minutes for GitHub Pages to rebuild -``` +**Output:** Alleen de inhoud van de map `public/` wordt gepubliceerd. De maintainer hoeft niets aan te passen aan zijn GitHub Pages-instellingen. ---- +**Testen:** +1. Bouw lokaal met: + ``` + hugo --minify --baseURL "https://apolloccrypt.github.io/nl-data-optout/" + ``` +2. Open `public/index.html` direct in je browser. -## ✏️ Common Updates +Na een push duurt het ongeveer een minuut voordat de wijziging live is. -### **Adding a Broker** +## Broker toevoegen -Edit `index.html` around line 119: +Voeg een entry toe aan de `brokers` array in script.js: ```javascript -const brokers = [ - // ... existing brokers ... - - { - name: "New Company", - email: "privacy@newcompany.nl", - category: "Ad-Tech & Tracking", - note: "Optional note about this broker" // Optional - }, -]; +{ name: "Bedrijfsnaam", email: "privacy@bedrijf.nl", category: "Ad-Tech & Tracking" } ``` -**Don't forget:** -1. Update `CHANGELOG.md` (add to `[Unreleased]` section) -2. Test locally (open index.html in browser) -3. Commit with clear message - ---- - -### **Fixing a Contact** - -Find the broker in `index.html` (around line 119-180): - -**Email changed:** -```javascript -// OLD -{ name: "Company", email: "old@company.nl", category: "Ad-Tech" } - -// NEW -{ name: "Company", email: "new@company.nl", category: "Ad-Tech" } -``` +Als een bedrijf alleen een formulier accepteert: -**Email replaced by form:** ```javascript -{ - name: "Company ⚠️", +{ + name: "Bedrijfsnaam", email: "FORM_REQUIRED", - formUrl: "https://company.com/contact-form", - category: "Ad-Tech", - note: "Email werkt niet meer sinds [datum]. Formulier vereist.", + formUrl: "https://bedrijf.nl/privacy-form", + category: "Ad-Tech & Tracking", + note: "Email werkt niet meer. Formulier vereist.", isForm: true } ``` ---- - -### **Updating Version** - -When releasing new version: - -1. **index.html** (line ~136): Update version comment - ```html -

v1.2.0 β€’ Laatste update: [datum]

- ``` - -2. **CHANGELOG.md**: Move `[Unreleased]` to new `[1.2.0] - YYYY-MM-DD` - -3. **README.md**: Update version badge and "Last update" footer - -4. Commit: `git commit -m "Release v1.2.0"` +## Versie bijwerken -5. Tag: `git tag v1.2.0 && git push --tags` +1. Versienummer en datum aanpassen in de footer van index.html +2. Entry toevoegen aan CHANGELOG.md +3. Committen en pushen ---- +## Testen -## πŸ§ͺ Testing +Open index.html lokaal in de browser voor je pusht. Geen server nodig. -### **Before Pushing:** - -1. **Open `index.html` locally** in browser -2. **Test broker selection** (pick 3-5 brokers) -3. **Generate email** (check template looks correct) -4. **Test "Andere" option** (manual entry) -5. **Test form-required broker** (e.g., Meta) -6. **Check mobile** (resize browser window to 375px width) - -### **After Pushing:** - -1. Wait 1-2 minutes for GitHub Pages -2. Visit https://apolloccrypt.github.io/nl-data-optout/ -3. Hard refresh (Ctrl+F5 / Cmd+Shift+R) -4. Test 1-2 brokers to confirm changes live - ---- - -## πŸ“Š Monitoring - -### **GitHub Actions** - -GitHub Pages auto-builds from `main` branch. -Check build status: https://github.com/Apolloccrypt/nl-data-optout/actions - -### **Analytics** (None!) - -This tool has **NO analytics** – 100% privacy. -Monitor via: -- GitHub star count -- Issue activity -- LinkedIn post engagement - ---- - -## πŸ› Rollback - -If you pushed a bug: +## Rollback ```bash -# Revert last commit git revert HEAD git push origin main - -# Or reset to previous commit (DANGEROUS - only if just pushed) -git reset --hard HEAD~1 -git push --force origin main ``` -**Better:** Fix forward (commit a fix) rather than rollback. - ---- - -## πŸ”’ Security - -### **No Server = No Server-Side Security Issues** - -This is a **static site** – no backend, no database, no API. - -**Security concerns:** -- XSS: Minimal risk (no user-generated content rendered) -- Data leaks: Impossible (100% client-side) -- Dependencies: None (no npm packages) - -**If security issue found:** -1. Open Issue with `security` label -2. Or DM @mickbeer on LinkedIn -3. Fix ASAP + announce in CHANGELOG - ---- - -## πŸ“ž Need Help? - -- **GitHub Issues:** Bug reports, questions -- **LinkedIn:** [@mickbeer](https://linkedin.com/in/mick-beer) -- **Email:** Via LinkedIn (no public email to avoid spam) - ---- - -## βœ… Pre-Launch Checklist - -Before announcing updates: - -- [ ] Tested locally (multiple browsers) -- [ ] Updated CHANGELOG.md -- [ ] Version number incremented (if appropriate) -- [ ] Pushed to GitHub -- [ ] Confirmed live site updated (1-2 min wait) -- [ ] Tested live site (hard refresh) -- [ ] Mobile test -- [ ] Announced on LinkedIn (if major update) - ---- +## Contact -

Happy deploying! πŸš€

+https://github.com/Apolloccrypt/nl-data-optout/issues +https://www.linkedin.com/in/mick-beer/ diff --git a/README.md b/README.md index 1a173f4..946a9be 100644 --- a/README.md +++ b/README.md @@ -1,288 +1,66 @@ -# πŸ›‘οΈ NL Data Brokers Opt-Out Tool +# NL Data Brokers Opt-Out Tool -**Genereer GDPR-verzoeken (Art. 21, 17, 15) naar 50+ Nederlandse data brokers in 2 minuten.** +Tool voor het versturen van GDPR-verzoeken naar Nederlandse data brokers. -πŸ”— **Live Tool:** https://apolloccrypt.github.io/nl-data-optout/ +**Live: [apolloccrypt.github.io/nl-data-optout](https://apolloccrypt.github.io/nl-data-optout/)** -![License](https://img.shields.io/badge/license-MIT-blue.svg) -![Version](https://img.shields.io/badge/version-1.1.0-green.svg) -![Status](https://img.shields.io/badge/status-active-success.svg) +[![Preview](preview.avif)](https://apolloccrypt.github.io/nl-data-optout/) ---- +## Gebruik -## πŸ“‹ Inhoudsopgave +1. Vul naam en emailadres in +2. Selecteer een bedrijf +3. Kies het type verzoek (bezwaar, wissen, inzage, of beide) +4. Klik "Genereer e-mail" -- [Over dit project](#over-dit-project) -- [Features](#features) -- [Gebruik](#gebruik) -- [Ondersteunde Bedrijven](#ondersteunde-bedrijven) -- [Privacy & Veiligheid](#privacy--veiligheid) -- [Juridische Basis](#juridische-basis) -- [Bijdragen](#bijdragen) -- [Licentie](#licentie) -- [Contact](#contact) ---- +### Ontwikkelen en bouwen -## 🎯 Over dit project +Deze site gebruikt [Hugo](https://gohugo.io/) als static site generator. Voor lokale ontwikkeling: -Deze tool helpt Nederlandse burgers hun **GDPR-rechten** uit te oefenen tegenover data brokers, ad-tech bedrijven, telecom providers en retailers. +1. Installeer Hugo (extended versie aanbevolen) +2. Clone deze repo +3. Start een lokale server met: + ``` + hugo server + ``` +4. Of bouw de site voor productie met: + ``` + hugo --minify --baseURL "https://apolloccrypt.github.io/nl-data-optout/" + ``` -**Achtergrond:** -In maart 2026 testte ik 5 Nederlandse nieuwssites op cookie compliance. Bevindingen: -- **NU.nl:** 121 trackers, maar **104 partners niet bij naam genoemd** -- **NOS.nl:** Pre-consent tracking (cookies **vΓ³Γ³r** banner) -- **Google:** Aanwezig op **100% van de geteste sites** +De output verschijnt in de map `public/`. Open `public/index.html` direct in je browser om te testen. -**Probleem:** Als je niet weet welke bedrijven je data hebben, kun je je rechten niet uitoefenen. +### Automatische deployment -**Oplossing:** Deze tool. +Bij elke push naar `main` wordt de site automatisch gebouwd en gedeployed naar GitHub Pages via een [GitHub Actions workflow](.github/workflows/deploy.yml). Hierbij wordt de baseURL altijd geforceerd naar de upstream URL (`https://apolloccrypt.github.io/nl-data-optout/`), zodat alle links en assets correct werken. -πŸ“š **Volledig onderzoek:** https://medium.com/p/75744f8645c6 +**Let op:** Alleen de inhoud van `public/` wordt gepubliceerd. De maintainer hoeft niets aan te passen aan zijn GitHub Pages-instellingen. ---- +Wil je bijdragen? Zie [CONTRIBUTING.md](CONTRIBUTING.md). -## ✨ Features +## Achtergrond -- βœ… **50+ Nederlandse data brokers** (ad-tech, credit bureaus, retail, telecom, media) -- βœ… **GDPR Art. 21** (bezwaar), **Art. 17** (wissen), **Art. 15** (inzage) -- βœ… **100% lokaal** – geen server, geen data-opslag, geen tracking -- βœ… **Open source** (MIT license) -- βœ… **Meta formulier-fix** – detecteert bedrijven die email vervingen door formulieren -- βœ… **Notes systeem** – waarschuwt voor AP boetes, dark patterns, pre-consent tracking -- βœ… **CategorieΓ«n** – credit bureaus, ad-tech, telecom, retail, media, analytics +In maart 2026 testte ik 5 Nederlandse nieuwssites op cookie compliance. NU.nl bleek 104 van 121 ad-partners niet bij naam te noemen. NOS.nl plaatst cookies voor de banner verschijnt. Google staat op elke geteste site. ---- +Onderzoek: https://medium.com/@mick.ronan.beer -## πŸš€ Gebruik +## Ondersteunde bedrijven -### **Online (aanbevolen):** +60+ bedrijven verdeeld over credit bureaus, ad-tech, media, telecom, retail, analytics en marketing clouds. Zie `static/js/script.js` voor de volledige lijst. Er is ook een "ander bedrijf" optie voor handmatige invoer. -1. Ga naar https://apolloccrypt.github.io/nl-data-optout/ -2. Vul je naam en email in -3. Selecteer een bedrijf -4. Kies verzoek type (bezwaar, wissen, inzage, of beide) -5. Klik "Genereer bezwaarmail" -6. Open in je mailprogramma of kopieer de tekst +## Privacy -**Tijd:** 2 minuten per bedrijf +Alles draait lokaal. Geen server, geen opslag, geen tracking. De tool genereert alleen tekst, jij verstuurt de mail dus zelf. ---- +## Bijdragen -### **Lokaal draaien:** +Zie [CONTRIBUTING.md](CONTRIBUTING.md). Verouderd contactadres of bug? Open een [issue](https://github.com/Apolloccrypt/nl-data-optout/issues). -```bash -git clone https://github.com/Apolloccrypt/nl-data-optout.git -cd nl-data-optout -# Open index.html in je browser (geen server nodig) -``` +## Licentie ---- +MIT. Zie [LICENSE](LICENSE). -## 🏒 Ondersteunde Bedrijven (60+) +## Contact -### **Credit Bureaus (6)** -- Experian Nederland (€2.7M AP boete 2025) -- Graydon, Creditsafe, Focum BV, Dun & Bradstreet, Bisnode - -### **Ad-Tech & Tracking (27)** -- Google (100% aanwezig op NL sites) -- Criteo (80% aanwezig) -- Index Exchange (80% aanwezig) -- Meta/Facebook ⚠️ (formulier vereist sinds maart 2026) -- TikTok, LinkedIn, Twitter/X, Snapchat, Pinterest -- Amazon Ads, The Trade Desk, Magnite, PubMatic, OpenX -- Outbrain, Taboola, Xandr, AppNexus, AdForm, Sizmek -- MediaMath - -### **Media & Publishers (6)** -- DPG Media (NU.nl, AD.nl) – 104 van 121 partners niet genoemd -- NPO/NOS – pre-consent tracking -- RTL Nederland, Sanoma, Mediahuis, Talpa - -### **Telecom (7)** -- KPN, VodafoneZiggo, T-Mobile/Odido, Tele2 -- Youfone, Simyo, Lebara - -### **Retail & E-Commerce (10)** -- Kruidvat (€600k AP boete cookie wall) -- Coolblue (€40k AP boete pre-consent) -- Bol.com (best practice: 100% disclosure) -- Albert Heijn, Wehkamp, Zalando, HEMA, Action, MediaMarkt, Jumbo - -### **Analytics (6)** -- Smartocto/Content Insights (gebruikt door NOS) -- Piano, Comscore, Nielsen, Chartbeat - -### **Marketing Clouds (5)** -- Salesforce, Adobe, Oracle, HubSpot, Mailchimp - -**+ "Ander bedrijf" optie** voor handmatige invoer - -Volledige lijst: zie `index.html` regel 119-180 - ---- - -## πŸ”’ Privacy & Veiligheid - -### **100% Lokaal** -- Geen server-side code -- Geen data-opslag -- Geen cookies -- Geen tracking -- Geen third-party scripts - -### **Open Source** -- Volledige broncode beschikbaar -- Auditeerbaar (200 regels JavaScript) -- MIT License (vrij te gebruiken) - -### **Hoe het werkt:** -1. JavaScript draait lokaal in je browser -2. Template wordt gegenereerd (client-side) -3. `mailto:` link opent je mail-app -4. **JIJ** verstuurt de mail (niet de tool) - -**De tool stuurt NIETS zelf** – het genereert alleen tekst voor jou. - ---- - -## βš–οΈ Juridische Basis - -### **GDPR Rechten:** - -**Art. 21 - Recht op bezwaar:** -> "Je kunt bezwaar maken tegen verwerking voor direct marketing, profiling en tracking." - -**Art. 17 - Recht om vergeten te worden:** -> "Je kunt verwijdering van je gegevens eisen als er geen wettelijke bewaarplicht is." - -**Art. 15 - Recht op inzage:** -> "Je kunt opvragen welke persoonsgegevens een bedrijf van jou verwerkt." - -### **Reactietermijn:** -Bedrijven hebben **1 maand** om te reageren (Art. 12 GDPR). - -### **Bij weigering:** -- Vraag gemotiveerde uitleg -- Dien klacht in bij [Autoriteit Persoonsgegevens](https://autoriteitpersoonsgegevens.nl/nl/zelf-doen/privacyrechten/melden) - -### **Precedenten:** -- **Experian:** €2.7M boete (oktober 2025) – vendors niet bij naam -- **Kruidvat:** €600k boete – cookie wall -- **Coolblue:** €40k boete – pre-consent tracking - ---- - -## πŸ› οΈ Technologie - -- **HTML5** – structuur -- **Vanilla JavaScript** – geen frameworks -- **CSS3** – styling -- **GitHub Pages** – hosting - -**Geen build step, geen dependencies, geen npm.** Gewoon HTML/CSS/JS. - ---- - -## πŸ› Bug Melden? - -### **Contact veranderd?** -Als een bedrijf zijn privacy-email heeft gewijzigd, [open een Issue](https://github.com/Apolloccrypt/nl-data-optout/issues/new?template=broken-contact.md). - -**Voorbeeld:** Meta/Facebook verving `datarequests@support.facebook.com` met een formulier in maart 2026. Gebruiker Tobias L. meldde dit β†’ fix binnen 24u. - -### **Nieuw bedrijf toevoegen?** -Open een [Feature Request](https://github.com/Apolloccrypt/nl-data-optout/issues/new?template=feature-request.md) met: -- Bedrijfsnaam -- Privacy email (meestal `privacy@bedrijf.nl`) -- Categorie - ---- - -## 🀝 Bijdragen - -Bijdragen welkom! Zie [CONTRIBUTING.md](CONTRIBUTING.md) voor richtlijnen. - -### **Pull Requests:** -- Update `brokers` array in `index.html` -- Test lokaal (open `index.html` in browser) -- Update `CHANGELOG.md` -- Submit PR - -### **Community:** -- [GitHub Issues](https://github.com/Apolloccrypt/nl-data-optout/issues) -- [LinkedIn: Mick Beer](https://linkedin.com/in/mick-beer) - ---- - -## πŸ“Š Impact - -**Doel:** Als 1000 mensen dit gebruiken = 10.000 GDPR-verzoeken verstuurd. - -**Kosten voor bedrijven:** €50 per verzoek (handmatige verwerking) = **€500.000 overhead**. - -**Effect:** Bij €500k wordt massale tracking economisch onhoudbaar. -β†’ Bedrijven moeten kiezen: **transparanter worden** of **stoppen**. - -**Collectieve actie werkt.** πŸ’ͺ - ---- - -## πŸ“œ Licentie - -**MIT License** – vrij te gebruiken, aanpassen, distribueren. - -Zie [LICENSE](LICENSE) voor details. - ---- - -## πŸ“ž Contact - -**Maker:** Mick Beer -**LinkedIn:** https://linkedin.com/in/mick-beer -**GitHub:** https://github.com/Apolloccrypt - -**Onderzoek:** -- [Medium artikel](https://medium.com/p/75744f8645c6) (volledig onderzoek) -- [LinkedIn post](https://linkedin.com/posts/mick-beer_nl-data-brokers-opt-out-tool-activity-7441146526682202112-F_v7) - ---- - -## ⚠️ Disclaimer - -**Dit is GEEN juridisch advies.** - -Deze tool helpt bij uitoefenen GDPR-rechten. Raadpleeg privacy-advocaat of [Autoriteit Persoonsgegevens](https://autoriteitpersoonsgegevens.nl) bij twijfel. - -Maker niet aansprakelijk voor gebruik. Eigen verantwoordelijkheid. - -Voor juridisch advies: advocaat of AP. - ---- - -## 🌟 Support dit project - -**Vind je dit nuttig?** - -- ⭐ **Star deze repo** op GitHub -- πŸ”„ **Deel** met vrienden/familie -- πŸ“’ **Post** op social media -- πŸ› **Meld bugs** via Issues -- πŸ’‘ **Voeg bedrijven toe** via PR - -**Samen maken we tracking transparanter.** πŸ›‘οΈ - ---- - -## πŸ“š Bronnen - -- [GDPR volledige tekst](https://eur-lex.europa.eu/legal-content/NL/TXT/?uri=CELEX:32016R0679) -- [ePrivacy Richtlijn](https://eur-lex.europa.eu/legal-content/NL/TXT/?uri=CELEX:32002L0058) -- [AP Cookie Richtsnoeren](https://autoriteitpersoonsgegevens.nl/themas/internet-telefoon-post/cookies) -- [CJEU Planet49 (C-673/17)](https://curia.europa.eu/juris/document/document.jsf?docid=218462) - ---- - -

Made with ❀️ for privacy β€’ Open Source β€’ Community-Driven

-

v1.1.0 β€’ Last update: March 21, 2026

+Mick Beer β€” https://mickbeer.com β€” https://www.linkedin.com/in/mick-beer/ diff --git a/REPO-OVERVIEW.md b/REPO-OVERVIEW.md deleted file mode 100644 index 3f9068b..0000000 --- a/REPO-OVERVIEW.md +++ /dev/null @@ -1,270 +0,0 @@ -# βœ… COMPLETE GITHUB REPO - KLAAR VOOR DEPLOYMENT - -## πŸ“ COMPLETE FILE STRUCTURE - -``` -nl-data-optout/ -β”œβ”€β”€ index.html βœ… Main tool (60+ brokers, Meta fix, notes system) -β”œβ”€β”€ README.md βœ… Complete documentation (impact, legal, usage) -β”œβ”€β”€ CHANGELOG.md βœ… Version history (v1.0.0 β†’ v1.1.0) -β”œβ”€β”€ CONTRIBUTING.md βœ… Contribution guidelines -β”œβ”€β”€ DEPLOYMENT.md βœ… Update & deployment guide -β”œβ”€β”€ LICENSE βœ… MIT License -β”œβ”€β”€ .gitignore βœ… Git ignore rules -└── .github/ - └── ISSUE_TEMPLATE/ - β”œβ”€β”€ config.yml βœ… Template configuration - β”œβ”€β”€ broken-contact.md βœ… Report broken contacts - β”œβ”€β”€ feature-request.md βœ… Add new brokers - └── bug-report.md βœ… Bug reports -``` - -**Total:** 11 files - ---- - -## 🎯 WHAT'S NEW IN v1.1.0 - -### **Major Features:** - -βœ… **Meta/Facebook Fix** (Tobias feedback!) -- Detecteert dat Meta email niet meer werkt -- Toont formulier instructies + link -- Kopieert template naar clipboard -- Dark pattern waarschuwing - -βœ… **60+ Brokers** (was 25) -- Credit Bureaus: 6 -- Ad-Tech: 27 -- Media: 6 -- Telecom: 7 -- Retail: 10 -- Analytics: 6 -- Marketing: 5 - -βœ… **Notes System** -- AP boetes vermeld (Experian €2.7M, Kruidvat €600k, Coolblue €40k) -- Pre-consent tracking warnings (NOS, Coolblue) -- Vendor disclosure issues (DPG Media: 104/121) -- Best practice highlights (Bol.com: 100% disclosure) - -βœ… **UI Improvements** -- Warning banner voor speciale instructies -- Info boxes voor dark patterns -- Copy to clipboard knop -- Betere mobile responsive -- Footer met versie + changelog link - -βœ… **Community Features** -- GitHub Issue templates (3 types) -- CONTRIBUTING.md (hoe bij te dragen) -- DEPLOYMENT.md (how to update) -- CHANGELOG.md (version tracking) -- Bug report instructies - ---- - -## πŸš€ DEPLOYMENT INSTRUCTIES - -### **Option 1: Replace Existing Repo (Recommended)** - -```bash -# Backup current repo (optional) -cd ~/path/to/nl-data-optout -cp -r . ../nl-data-optout-backup - -# Replace all files -rm -rf * # WARNING: This deletes everything! -rm -rf .github .gitignore # Hidden files too - -# Copy new files from downloaded folder -cp -r /path/to/downloaded/github-repo-v2/* . -cp -r /path/to/downloaded/github-repo-v2/.github . -cp /path/to/downloaded/github-repo-v2/.gitignore . - -# Check everything -ls -la - -# Commit -git add . -git commit -m "Release v1.1.0 - Meta fix + 60 brokers + community features" -git push origin main - -# Wait 1-2 minutes, then check: -# https://apolloccrypt.github.io/nl-data-optout/ -``` - ---- - -### **Option 2: Fresh Clone (If Starting Fresh)** - -```bash -# If you want to start completely fresh -cd ~/Desktop -mv nl-data-optout nl-data-optout-old -mkdir nl-data-optout -cd nl-data-optout - -# Copy all files from downloaded folder -cp -r /path/to/downloaded/github-repo-v2/* . -cp -r /path/to/downloaded/github-repo-v2/.github . -cp /path/to/downloaded/github-repo-v2/.gitignore . - -# Initialize Git -git init -git add . -git commit -m "Initial commit - v1.1.0" - -# Connect to GitHub -git remote add origin https://github.com/Apolloccrypt/nl-data-optout.git -git branch -M main -git push -u origin main --force # CAREFUL: Overwrites remote! -``` - ---- - -## πŸ§ͺ TESTING CHECKLIST - -**Before pushing to GitHub:** - -- [ ] Open `index.html` in browser (locally) -- [ ] Test 3-5 brokers (select + generate email) -- [ ] Test Meta (should show formulier warning) -- [ ] Test "Andere" option (manual entry) -- [ ] Check mobile (resize to 375px width) -- [ ] All links work (GitHub, Medium, LinkedIn) -- [ ] No JavaScript errors (F12 console) - -**After pushing:** - -- [ ] Wait 1-2 minutes (GitHub Pages rebuild) -- [ ] Visit https://apolloccrypt.github.io/nl-data-optout/ -- [ ] Hard refresh (Ctrl+F5 / Cmd+Shift+R) -- [ ] Test 1-2 brokers to confirm live -- [ ] Check broker count shows "60+" -- [ ] Test Meta β†’ should show form warning - ---- - -## πŸ“§ REPLY TO TOBIAS - -**Once deployed, reply on LinkedIn:** - -``` -βœ… Fixed, Tobias! - -Tool is updated (v1.1.0): -β€’ Meta contact form geΓ―mplementeerd -β€’ Dark pattern waarschuwing toegevoegd -β€’ 60+ brokers (was 25) -β€’ Issue templates voor toekomstige reports - -Live: apolloccrypt.github.io/nl-data-optout - -Refresh de pagina, selecteer Meta/Facebook, je ziet nu een formulier-instructie ipv mailto link. - -Bedankt voor je waardevolle feedback - dit helpt iedereen! πŸ™ - -PS: GitHub repo heeft nu ook Issue templates, dus toekomstige -contact-wijzigingen kunnen direct gerapporteerd worden: -github.com/Apolloccrypt/nl-data-optout/issues -``` - ---- - -## πŸ“Š FILE DETAILS - -### **index.html** (Main Tool) -- Lines: ~430 -- Brokers: 60 -- Features: Meta fix, notes, clipboard copy, dark pattern warnings -- Size: ~18 KB - -### **README.md** (Documentation) -- Sections: 12 -- Links: 15+ -- Badges: 3 -- Size: ~11 KB - -### **CHANGELOG.md** (Version History) -- Versions: 2 (v1.0.0, v1.1.0) -- Format: Keep a Changelog -- Includes: Meta contact change documentation - -### **CONTRIBUTING.md** (Contribution Guide) -- Sections: 9 -- Includes: Code style, PR process, priority issues -- Size: ~4 KB - -### **DEPLOYMENT.md** (Update Guide) -- Sections: 10 -- Includes: Git commands, testing checklist, rollback -- Size: ~4 KB - -### **LICENSE** (MIT) -- Standard MIT License -- Copyright: 2026 Mick Beer - -### **.gitignore** -- Ignores: OS files, editor files, logs, temp files - -### **Issue Templates** (3) -- broken-contact.md (report email changes) -- feature-request.md (add new brokers) -- bug-report.md (technical issues) -- config.yml (template configuration) - ---- - -## 🎯 NEXT STEPS - -**Immediately:** -1. [ ] Deploy to GitHub (replace or fresh clone) -2. [ ] Test live site (wait 1-2 min) -3. [ ] Reply to Tobias on LinkedIn -4. [ ] Update LinkedIn post (optional: "Tool updated v1.1.0") - -**This Week:** -1. [ ] Monitor GitHub issues (watch for new reports) -2. [ ] Check LinkedIn for tool feedback -3. [ ] Screenshot new version (for future Medium update) - -**Week 2:** -1. [ ] AP melding (with "10k+ views" enhancement) -2. [ ] Media outreach (if tool >5k users) - ---- - -## βœ… WHAT YOU HAVE NOW - -**Complete, production-ready GitHub repo with:** - -βœ… 60+ Dutch data brokers -βœ… Meta formulier fix -βœ… AP boete notes (€3.9M total precedents) -βœ… Dark pattern detection -βœ… Community contribution system -βœ… Professional documentation -βœ… Issue templates -βœ… Deployment guides -βœ… MIT License -βœ… Mobile responsive -βœ… 100% local (no tracking) -βœ… Version 1.1.0 (production ready) - -**STATUS:** 🟒 READY TO DEPLOY - ---- - -## πŸ“ž SUPPORT - -If you need help deploying: -- DM me details -- Or: I can walk through Git commands step-by-step -- Or: Share screen (if needed) - -**This is complete and tested** - ready to go live! πŸš€ - ---- - -

KLAAR OM TE DEPLOYEN? πŸ’ͺ

diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 0000000..3a4481b --- /dev/null +++ b/content/_index.md @@ -0,0 +1,3 @@ +--- +title: "NL Data Brokers Opt-Out Tool" +--- diff --git a/content/nl/_index.md b/content/nl/_index.md new file mode 100644 index 0000000..3a4481b --- /dev/null +++ b/content/nl/_index.md @@ -0,0 +1,3 @@ +--- +title: "NL Data Brokers Opt-Out Tool" +--- diff --git a/hugo.toml b/hugo.toml new file mode 100644 index 0000000..1c07672 --- /dev/null +++ b/hugo.toml @@ -0,0 +1,30 @@ +baseURL = "https://apolloccrypt.github.io/nl-data-optout/" +defaultContentLanguage = "nl" +defaultContentLanguageInSubdir = false +enableRobotsTXT = true +disableKinds = ["taxonomy", "term"] + +[languages] + [languages.nl] + languageCode = "nl" + languageName = "Nederlands" + title = "NL Data Opt-Out" + weight = 1 + [languages.nl.params] + description = "Genereer gratis GDPR-verzoeken naar 60+ Nederlandse data brokers. 100% lokaal β€” geen data opgeslagen." + + [languages.en] + languageCode = "en" + languageName = "English" + title = "NL Data Opt-Out" + weight = 2 + [languages.en.params] + description = "Generate free GDPR requests to 60+ Dutch data brokers. Runs 100% locally β€” no data stored." + +[params] + github = "https://github.com/Apolloccrypt/nl-data-optout" + version = "2.0.2" + author = "Mick Beer" + authorUrl = "https://mickbeer.com" + linkedin = "https://www.linkedin.com/in/mick-beer/" + donate = "https://www.buymeacoffee.com/mickbeer" diff --git a/i18n/en.yaml b/i18n/en.yaml new file mode 100644 index 0000000..5906414 --- /dev/null +++ b/i18n/en.yaml @@ -0,0 +1,64 @@ +disclaimer_short: "Not legal advice. This tool helps you exercise your GDPR rights (Art. 15, 17 and 21). When in doubt, consult your" +disclaimer_dpa: "national Data Protection Authority" +disclaimer_full_link: "Full disclaimer" + +hero_title: "NL Data Brokers
Opt-Out Tool" +hero_description: "Generate free GDPR requests to Dutch data brokers, ad-tech, telecom, retail and media companies. Everything runs locally in your browser. No data stored." +hero_broker_label: "Dutch data brokers" + +form_title: "Generate your request" +label_name: "Full name" +label_email: "Email address" +label_company: "Data broker / company" +label_type: "Request type" +label_other_company: "Company name and privacy email" +placeholder_name: "John Smith" +placeholder_email: "john@example.com" +placeholder_company: "Select a company" +placeholder_other: "e.g. Acme Corp | privacy@acme.com" +placeholder_other_hint: "Format: Company Name | privacy@company.com" +btn_generate: "Generate email" +type_objection: "Object to processing (Art. 21)" +type_erase: "Erasure of data (Art. 17)" +type_access: "Access to my data (Art. 15)" +type_both: "Object and erasure (Art. 21 and 17)" + +rights_title: "Your GDPR rights" +rights_official_text: "Official text" +rights_ap_page: "NL authority" +rights_eurlex: "EUR-Lex full regulation" + +art15_title: "Art. 15: Right of access" +art15_text: "You have the right to know whether a company processes your personal data, and if so, to receive a complete copy of that data." +art15_url_info: "https://gdpr-info.eu/art-15-gdpr/" +art15_url_ap: "https://autoriteitpersoonsgegevens.nl/themas/basis-avg/privacyrechten-avg/recht-op-inzage" + +art17_title: "Art. 17: Right to erasure" +art17_text: "You have the right to request that a company deletes your personal data without undue delay." +art17_url_info: "https://gdpr-info.eu/art-17-gdpr/" +art17_url_ap: "https://autoriteitpersoonsgegevens.nl/themas/basis-avg/privacyrechten-avg/recht-op-vergetelheid" + +art21_title: "Art. 21: Right to object" +art21_text: "You have the right to object to the processing of your personal data for marketing, profiling or tracking. The company must stop, unless it can demonstrate compelling legitimate grounds." +art21_url_info: "https://gdpr-info.eu/art-21-gdpr/" +art21_url_ap: "https://autoriteitpersoonsgegevens.nl/themas/basis-avg/privacyrechten-avg/recht-van-bezwaar" + +disclaimer_title: "Full disclaimer" +disclaimer_1: "No legal advice. Tool by an independent researcher, not a lawyer." +disclaimer_2: "No guarantees. Companies do not always respond. If refused, you can file a complaint with your national DPA." +disclaimer_3: "Personal responsibility. You decide how to use this tool and its content." +disclaimer_4: "Privacy. 100% local processing. No data storage, no server calls, no analytics." +disclaimer_5: "Legal use only. Only for your own legitimate GDPR requests." +disclaimer_6: "Updates. Companies change contact methods. Report issues via" +disclaimer_issues: "GitHub Issues" +disclaimer_accept: "By generating an email you accept these terms." + +about_title: "About this project" +about_intro: "This project maps how Dutch companies and international parties active in the Netherlands handle personal data." +about_scope_title: "Scope" +about_scope: "The tool focuses on the Dutch market and the GDPR as enforced by the Dutch Data Protection Authority (AP). The list also includes foreign companies (such as Google, Meta and Amazon) that process data of people in the Netherlands. If you live in the Netherlands, you fall under the Dutch AP, regardless of where the company is based. This means you can send a valid GDPR request to foreign parties as well." +about_goals_title: "Goals" +about_goal1: "Provide transparency about cookie tracking, dark patterns and unnecessary data storage" +about_goal2: "Support legislative efforts for stronger data protection, including Check Don't Store (2026Z04148)" +about_goal3: "Give citizens practical tools to exercise their GDPR rights" +about_footer: "The project is free, independent and based on publicly reproducible research." diff --git a/i18n/nl.yaml b/i18n/nl.yaml new file mode 100644 index 0000000..2490cd3 --- /dev/null +++ b/i18n/nl.yaml @@ -0,0 +1,64 @@ +disclaimer_short: "Dit is geen juridisch advies. Deze tool helpt je AVG-rechten uit te oefenen (Art. 15, 17 en 21). Raadpleeg bij twijfel de" +disclaimer_dpa: "Autoriteit Persoonsgegevens" +disclaimer_full_link: "Volledige disclaimer" + +hero_title: "NL Data Brokers
Opt-Out Tool" +hero_description: "Genereer gratis GDPR-verzoeken naar Nederlandse data brokers, ad-tech, telecom, retail en mediabedrijven. Alles draait lokaal in je browser. Geen data opgeslagen." +hero_broker_label: "Nederlandse data brokers" + +form_title: "Genereer je verzoek" +label_name: "Volledige naam" +label_email: "E-mailadres" +label_company: "Data broker / bedrijf" +label_type: "Type verzoek" +label_other_company: "Bedrijfsnaam en privacy-e-mailadres" +placeholder_name: "Jan Jansen" +placeholder_email: "jan@voorbeeld.nl" +placeholder_company: "Selecteer een bedrijf" +placeholder_other: "bijv. Bedrijf BV | privacy@bedrijf.nl" +placeholder_other_hint: "Formaat: Bedrijfsnaam | privacy@bedrijf.nl" +btn_generate: "Genereer e-mail" +type_objection: "Bezwaar tegen verwerking (Art. 21)" +type_erase: "Wissen van gegevens (Art. 17)" +type_access: "Inzage in mijn gegevens (Art. 15)" +type_both: "Bezwaar en wissen (Art. 21 en 17)" + +rights_title: "Jouw AVG-rechten" +rights_official_text: "OfficiΓ«le tekst" +rights_ap_page: "Autoriteit Persoonsgegevens" +rights_eurlex: "EUR-Lex volledige verordening" + +art15_title: "Art. 15: Recht op inzage" +art15_text: "Je hebt het recht om te weten of een bedrijf jouw persoonsgegevens verwerkt, en zo ja, een volledige kopie van die gegevens te ontvangen." +art15_url_info: "https://gdpr-info.eu/art-15-gdpr/" +art15_url_ap: "https://autoriteitpersoonsgegevens.nl/themas/basis-avg/privacyrechten-avg/recht-op-inzage" + +art17_title: "Art. 17: Recht op gegevens verwijderen" +art17_text: "Je hebt het recht te eisen dat een bedrijf jouw persoonsgegevens zonder onnodig uitstel verwijdert." +art17_url_info: "https://gdpr-info.eu/art-17-gdpr/" +art17_url_ap: "https://autoriteitpersoonsgegevens.nl/themas/basis-avg/privacyrechten-avg/recht-op-gegevens-verwijderen" + +art21_title: "Art. 21: Recht van bezwaar" +art21_text: "Je hebt het recht om bezwaar te maken tegen de verwerking van jouw persoonsgegevens voor marketing, profilering of tracking. Het bedrijf moet daarmee stoppen, tenzij het dwingende gerechtvaardigde gronden kan aantonen." +art21_url_info: "https://gdpr-info.eu/art-21-gdpr/" +art21_url_ap: "https://autoriteitpersoonsgegevens.nl/themas/basis-avg/privacyrechten-avg/recht-van-bezwaar" + +disclaimer_title: "Volledige disclaimer" +disclaimer_1: "Geen juridisch advies. Tool van een onafhankelijk onderzoeker, geen advocaat." +disclaimer_2: "Geen garanties. Bedrijven reageren niet altijd. Bij weigering kun je een klacht indienen bij de AP." +disclaimer_3: "Eigen verantwoordelijkheid. Jij beslist hoe je deze tool en de inhoud gebruikt." +disclaimer_4: "Privacy. 100% lokale verwerking. Geen dataopslag, geen servercalls, geen analytics." +disclaimer_5: "Legaal gebruik. Alleen voor eigen legitieme GDPR-verzoeken." +disclaimer_6: "Updates. Bedrijven veranderen contactmethoden. Meld problemen via" +disclaimer_issues: "GitHub Issues" +disclaimer_accept: "Door een e-mail te genereren accepteer je deze voorwaarden." + +about_title: "Over dit project" +about_intro: "Dit project brengt in kaart hoe Nederlandse bedrijven en internationale partijen die in Nederland actief zijn omgaan met persoonsgegevens." +about_scope_title: "Reikwijdte" +about_scope: "De tool richt zich op de Nederlandse markt en de AVG zoals gehandhaafd door de Autoriteit Persoonsgegevens. De lijst bevat ook buitenlandse bedrijven (zoals Google, Meta en Amazon) die gegevens verwerken van mensen in Nederland. Als je in Nederland woont, val je onder de Nederlandse AP, ongeacht waar het bedrijf gevestigd is. Je kunt dus ook naar buitenlandse partijen een geldig GDPR-verzoek sturen." +about_goals_title: "Doelen" +about_goal1: "Transparantie bieden over cookie-tracking, dark patterns en onnodige dataopslag" +about_goal2: "Bewijs leveren voor wetgevingsinitiatieven voor betere gegevensbescherming, waaronder Check Don't Store (2026Z04148)" +about_goal3: "Burgers praktische tools geven om hun AVG-rechten uit te oefenen" +about_footer: "Het project is gratis, onafhankelijk en gebaseerd op openbaar reproduceerbaar onderzoek." diff --git a/index.html b/index.html deleted file mode 100644 index 2111a80..0000000 --- a/index.html +++ /dev/null @@ -1,388 +0,0 @@ - - - - - - NL Data Brokers Opt-Out Tool – GDPR Art. 21 & 17 - - - - - - -
-

⚠️ Belangrijke Disclaimer

-

Dit is GEEN juridisch advies. Deze tool helpt bij het uitoefenen van GDPR-rechten (Art. 21, 17, 15). Raadpleeg een privacy-advocaat of autoriteitpersoonsgegevens.nl bij twijfel. Maker niet aansprakelijk. Eigen verantwoordelijkheid. Volledige disclaimer onderaan.

-
- -

πŸ›‘οΈ NL Data Brokers Opt-Out Tool

-

Genereer snel GDPR Art. 21 (bezwaar), Art. 17 (wissen) of Art. 15 (inzage) mails naar Nederlandse data brokers, ad-tech, telecom, retail en media bedrijven. Alles lokaal in je browser – geen data-opslag.

- -
- πŸ“Š 50+ Nederlandse data brokers beschikbaar -
- - - - -
- - - - - - - - - - - - - -
- -
- - -
-

πŸ“‹ Volledige Disclaimer

-
    -
  1. Geen juridisch advies – Tool door burger/security expert, geen advocaat.
  2. -
  3. Geen garanties – Bedrijven reageren niet altijd; bij weigering β†’ klacht bij AP.
  4. -
  5. Persoonlijke verantwoordelijkheid – Jij beslist gebruik en inhoud.
  6. -
  7. Privacy – 100% lokaal, geen data-opslag of server-calls.
  8. -
  9. Legaal gebruik – Alleen eigen legitieme GDPR-verzoeken.
  10. -
  11. Updates – Bedrijven veranderen contact methoden; meld bugs via GitHub Issues.
  12. -
-

Door te genereren accepteer je deze voorwaarden.

- -

πŸ› Bug Melden?

-

Als een contact email niet meer werkt of je vindt fouten, open een GitHub Issue of tag @mickbeer op LinkedIn.

- -

πŸ“š Meer Info

-

- β€’ Volledig onderzoek (Medium)
- β€’ Autoriteit Persoonsgegevens
- β€’ GitHub Repository -

-
- - - - - - diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html new file mode 100644 index 0000000..cd3d7dd --- /dev/null +++ b/layouts/_default/baseof.html @@ -0,0 +1,343 @@ + + + + + + {{ if .IsHome }}{{ site.Title }}{{ else }}{{ .Title }} Β· {{ site.Title }}{{ end }} + + {{ range .Translations }} + + {{ end }} + + + + + + + + + {{ block "head" . }}{{ end }} + + + + + +
+ {{ block "main" . }}{{ end }} +
+ + + + + {{ block "scripts" . }}{{ end }} + + diff --git a/layouts/_default/list.html b/layouts/_default/list.html new file mode 100644 index 0000000..806bcec --- /dev/null +++ b/layouts/_default/list.html @@ -0,0 +1 @@ +{{ define "main" }}{{ end }} diff --git a/layouts/index.html b/layouts/index.html new file mode 100644 index 0000000..461a9ed --- /dev/null +++ b/layouts/index.html @@ -0,0 +1,222 @@ +{{ define "main" }} + + + + + +
+

+ {{ i18n "hero_title" | safeHTML }} +

+

+ {{ i18n "hero_description" }} +

+ 62 {{ i18n "hero_broker_label" }} +
+ + +
+ +
+ + +
+ +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
{{ i18n "placeholder_other_hint" }}
+
+ +
+ + +
+ +
+ + +
+ +
+
+ +
+
+
+ +
+ + +
+ {{ i18n "rights_title" }} +
+ +
+
+ Art. 15 +

+ {{ if eq .Lang "nl" }}Recht op inzage{{ else }}Right of access{{ end }} +

+

+ {{ i18n "art15_text" }} +

+ +
+
+ +
+
+ Art. 17 +

+ {{ if eq .Lang "nl" }}Recht op gegevens verwijderen{{ else }}Right to erasure{{ end }} +

+

+ {{ i18n "art17_text" }} +

+ +
+
+ +
+
+ Art. 21 +

+ {{ if eq .Lang "nl" }}Recht van bezwaar{{ else }}Right to object{{ end }} +

+

+ {{ i18n "art21_text" }} +

+ +
+
+ +
+

+ + + {{ i18n "rights_eurlex" }} (Regulation (EU) 2016/679) + +

+
+ + +
+ {{ i18n "disclaimer_title" }} +
    +
  1. {{ i18n "disclaimer_1" | safeHTML }}
  2. +
  3. {{ i18n "disclaimer_2" | safeHTML }}
  4. +
  5. {{ i18n "disclaimer_3" | safeHTML }}
  6. +
  7. {{ i18n "disclaimer_4" | safeHTML }}
  8. +
  9. {{ i18n "disclaimer_5" | safeHTML }}
  10. +
  11. + {{ i18n "disclaimer_6" | safeHTML }} + + {{ i18n "disclaimer_issues" }}. +
  12. +
+

{{ i18n "disclaimer_accept" }}

+
+ + +
+ {{ i18n "about_title" }} +
+

{{ i18n "about_intro" }}

+ +

{{ i18n "about_scope_title" }}

+

{{ i18n "about_scope" }}

+ +

{{ i18n "about_goals_title" }}

+ +

{{ i18n "about_footer" }}

+
+
+ +{{ end }} + +{{ define "scripts" }} + + +{{ end }} diff --git a/preview.avif b/preview.avif new file mode 100644 index 0000000..ecf25d3 Binary files /dev/null and b/preview.avif differ diff --git a/static/js/script.js b/static/js/script.js new file mode 100644 index 0000000..b9c2d5f --- /dev/null +++ b/static/js/script.js @@ -0,0 +1,464 @@ +'use strict'; + +// UI language based on site language set by Hugo +const siteLang = (typeof window.SITE_LANG !== 'undefined' && window.SITE_LANG === 'nl') ? 'nl' : 'en'; + +// Email language starts equal to site language, can be toggled independently +let emailLang = siteLang; +let lastGeneratedBody = ''; + +// All UI strings in both languages +const t = { + nl: { + otherOption: 'Ander bedrijf (handmatig invoeren)', + brokerCount: (n) => `${n} Nederlandse data brokers beschikbaar`, + alertFillIn: 'Vul je naam en e-mailadres in en selecteer een bedrijf.', + alertOtherCompany: 'Voer de bedrijfsnaam in (en bij voorkeur het privacy-e-mailadres).', + noPubChannel: 'Geen publiek contactkanaal', + noPubChannelDesc: (c) => `${c} heeft geen openbaar e-mailadres of formulier voor GDPR-verzoeken. Verzoeken kunnen alleen via de ingelogde accountpagina op hun website worden ingediend.`, + formRequired: 'Formulier vereist', + formRequiredCopied:'Formulier vereist β€” tekst gekopieerd', + formDesc: (c) => `${c} accepteert geen e-mail meer voor GDPR-verzoeken. Gebruik hun contactformulier. De verzoektekst is naar je klembord gekopieerd.`, + formDescManual: 'Kopieer de tekst hieronder en plak deze in het formulier.', + openForm: 'Open contactformulier', + darkPatternNote: 'E-mail vervangen door formulieren is een frictietactiek die GDPR opt-outs vermindert. Overweeg dit te melden bij de AP.', + readyToSend: 'Klaar om te verzenden', + toLabel: 'Aan:', + subjectLabel: 'Onderwerp:', + openEmail: 'Openen in e-mailprogramma', + copyText: 'Kopieer tekst', + copied: 'Gekopieerd!', + copyFallback: 'Kan niet kopiΓ«ren naar klembord. Kopieer handmatig.', + emailClientNote: 'Als "Openen in e-mailprogramma" niet werkt, gebruik "Kopieer tekst" en plak in je mailapp.', + }, + en: { + otherOption: 'Other company (enter manually)', + brokerCount: (n) => `${n} Dutch data brokers available`, + alertFillIn: 'Please fill in your name, email and select a company.', + alertOtherCompany: 'Please enter the company name (and preferably its privacy email).', + noPubChannel: 'No public contact channel', + noPubChannelDesc: (c) => `${c} has no public email or form for GDPR requests. Requests can only be made through the logged-in account area on their website.`, + formRequired: 'Form required', + formRequiredCopied:'Form required β€” text copied to clipboard', + formDesc: (c) => `${c} no longer accepts email for GDPR requests. Use their contact form. The request text has been copied to your clipboard.`, + formDescManual: 'Copy the text below and paste it into the form.', + openForm: 'Open contact form', + darkPatternNote: 'Replacing email with forms is a friction tactic that reduces GDPR opt-outs. Consider reporting this to your national DPA.', + readyToSend: 'Ready to send', + toLabel: 'To:', + subjectLabel: 'Subject:', + openEmail: 'Open in email client', + copyText: 'Copy text', + copied: 'Copied!', + copyFallback: 'Could not copy to clipboard. Please copy manually.', + emailClientNote: 'If "Open in email client" doesn\'t work, use "Copy text" and paste into your mail app.', + } +}[siteLang]; + +function escapeHtml(str) { + return String(str) + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"'); +} + +function toggleEmailLang() { + emailLang = emailLang === 'nl' ? 'en' : 'nl'; + document.getElementById('lang-toggle').textContent = `Email: ${emailLang.toUpperCase()}`; +} + +// Sync initial button label with site language +document.addEventListener('DOMContentLoaded', () => { + const btn = document.getElementById('lang-toggle'); + if (btn) btn.textContent = `Email: ${emailLang.toUpperCase()}`; +}); + +function copyLastBody() { + if (!lastGeneratedBody) return; + navigator.clipboard.writeText(lastGeneratedBody).then(() => { + const btn = document.getElementById('copy-btn'); + if (btn) { + btn.innerHTML = `${t.copied}`; + btn.classList.replace('btn-outline-secondary', 'btn-success'); + setTimeout(() => { + btn.innerHTML = `${t.copyText}`; + btn.classList.replace('btn-success', 'btn-outline-secondary'); + }, 2000); + } + }).catch(() => alert(t.copyFallback)); +} + +const brokers = [ + // === CREDIT BUREAUS & DATA ENRICHMENT === + { name: "Experian Nederland", email: "privacy@experian.nl", category: "Credit Bureaus", note: "AP fine €2.7M (2025) for insufficient vendor disclosure" }, + { name: "Graydon", email: "privacy@graydon.nl", category: "Credit Bureaus" }, + { name: "Creditsafe", email: "privacy@creditsafe.com", category: "Credit Bureaus" }, + { name: "Focum BV", email: "privacy@focum.nl", category: "Credit Bureaus" }, + { name: "Dun & Bradstreet", email: "privacy@dnb.com", category: "Credit Bureaus" }, + { name: "Bisnode (Dun & Bradstreet)", email: "privacy@bisnode.nl", category: "Credit Bureaus" }, + + // === AD-TECH & TRACKING === + { name: "Google (Ads/Analytics)", email: "privacy@google.com", category: "Ad-Tech & Tracking", note: 'Present on 100% of tested NL news sites. (Source: Research Volkskrant & Telegraaf)' }, + { name: "Criteo", email: "privacy@criteo.com", category: "Ad-Tech & Tracking", note: "Present on 80% of tested NL news sites" }, + { name: "Index Exchange", email: "privacy@indexexchange.com", category: "Ad-Tech & Tracking", note: "Present on 80% of tested NL news sites" }, + { + name: "Xandr (Microsoft Advertising)", + email: "FORM_REQUIRED", + formUrl: "https://account.microsoft.com/privacy/privacy-request-signedout", + category: "Ad-Tech & Tracking", + note: "privacy@microsoft.com bounces; not set up for privacy requests. Use the Microsoft privacy form (requires Microsoft account). 0% GDPR response rate (noyb 2024).", + isForm: true + }, + { + name: "Meta (Facebook/Instagram)", + email: "FORM_REQUIRED", + formUrl: "https://www.facebook.com/help/contact/540977946302970", + category: "Ad-Tech & Tracking", + note: "Email no longer works since March 2026. Form required (dark pattern).", + isForm: true + }, + { name: "Outbrain", email: "privacy@outbrain.com", category: "Ad-Tech & Tracking" }, + { name: "Taboola", email: "privacy@taboola.com", category: "Ad-Tech & Tracking" }, + { name: "Magnite (Rubicon)", email: "privacy@magnite.com", category: "Ad-Tech & Tracking" }, + { name: "PubMatic", email: "privacy@pubmatic.com", category: "Ad-Tech & Tracking" }, + { name: "OpenX", email: "privacy@openx.com", category: "Ad-Tech & Tracking" }, + { name: "LinkedIn Marketing", email: "privacy@linkedin.com", category: "Ad-Tech & Tracking" }, + { name: "TikTok", email: "privacy@tiktok.com", category: "Ad-Tech & Tracking" }, + { name: "Snap Inc. (Snapchat)", email: "privacy@snap.com", category: "Ad-Tech & Tracking" }, + { name: "Twitter / X Corp", email: "privacy@twitter.com", category: "Ad-Tech & Tracking" }, + { + name: "Pinterest", + email: "FORM_REQUIRED", + formUrl: "https://help.pinterest.com/nl/contact?current_page=about_you_page&personal_data=personal_data_adjust#no-back", + category: "Ad-Tech & Tracking", + note: "privacy@pinterest.com bounces; not set up for privacy requests. Use the contact form.", + isForm: true + }, + { name: "Amazon Ads", email: "privacy@amazon.com", category: "Ad-Tech & Tracking" }, + { name: "AdForm", email: "privacy@adform.com", category: "Ad-Tech & Tracking" }, + { name: "Sizmek (Amazon)", email: "privacy@sizmek.com", category: "Ad-Tech & Tracking" }, + { name: "The Trade Desk", email: "privacy@thetradedesk.com", category: "Ad-Tech & Tracking" }, + { name: "MediaMath", email: "privacy@mediamath.com", category: "Ad-Tech & Tracking" }, + + // === MEDIA & PUBLISHERS === + { + name: "DPG Media (NU.nl, AD.nl, Qmusic)", + email: "FORM_REQUIRED", + formUrl: "https://privacy.dpgmedia.nl/nl/privacy-rights", + category: "Media & Publishers", + note: "privacy@dpgmedia.nl bounces; use the DPG Media form for access, correction, deletion and objection. 104 of 121 ad-partners not named in cookie banner.", + isForm: true + }, + { name: "RTL Nederland", email: "privacy@rtl.nl", category: "Media & Publishers" }, + { name: "Sanoma Media", email: "privacy@sanoma.com", category: "Media & Publishers" }, + { name: "NPO / NOS", email: "privacy@npo.nl", category: "Media & Publishers", note: "Pre-consent tracking detected (cookies placed before banner appears)" }, + { name: "Mediahuis (Telegraaf, NHD)", email: "privacy@mediahuis.nl", category: "Media & Publishers" }, + { name: "Talpa Network", email: "privacy@talpanetwork.com", category: "Media & Publishers" }, + { name: "Wayback Machine / Internet Archive", email: "info@archive.org", category: "Media & Publishers", note: "Reageert zeer traag op GDPR-verzoeken. Stuur gerust meerdere mails als je na enkele weken geen reactie ontvangt." }, + + // === TELECOM === + { name: "KPN", email: "privacy@kpn.com", category: "Telecom" }, + { name: "VodafoneZiggo", email: "privacy@vodafoneziggo.nl", category: "Telecom" }, + { name: "T-Mobile / Odido", email: "dpo@odido.nl", category: "Telecom", note: "Data breach January 2026 (potentially affected)" }, + { name: "Tele2", email: "privacy@tele2.nl", category: "Telecom" }, + { name: "Youfone", email: "privacy@youfone.nl", category: "Telecom" }, + { name: "Simyo", email: "privacy@simyo.nl", category: "Telecom" }, + { name: "Lebara", email: "privacy@lebara.nl", category: "Telecom" }, + + // === RETAIL & E-COMMERCE === + { name: "Kruidvat Loyalty", email: "vragen@klantenservice.kruidvat.nl", category: "Retail & E-Commerce", note: "AP fine €600k for cookie wall" }, + { name: "Albert Heijn Bonus", email: "dpo@aholddelhaize.com", category: "Retail & E-Commerce" }, + { + name: "Bol.com", + email: "FORM_REQUIRED", + category: "Retail & E-Commerce", + note: "privacy@bol.com bounces; requests only via the logged-in account area (no public email or form). Data viewable for 7 days then deleted. Best practice: 100% vendor disclosure (13/13).", + isForm: true, + loginOnly: true + }, + { name: "Coolblue", email: "privacy@coolblue.nl", category: "Retail & E-Commerce", note: "AP fine €40k for pre-consent tracking" }, + { name: "Wehkamp", email: "privacy@wehkamp.nl", category: "Retail & E-Commerce" }, + { name: "Zalando", email: "mijngegevens@zalando.nl", category: "Retail & E-Commerce" }, + { name: "HEMA", email: "hemaklantenservice@hema.nl", category: "Retail & E-Commerce" }, + { name: "Action", email: "privacy@action.nl", category: "Retail & E-Commerce" }, + { name: "MediaMarkt", email: "privacy@mediamarkt.nl", category: "Retail & E-Commerce" }, + { name: "Jumbo Supermarkten", email: "privacy@jumbo.com", category: "Retail & E-Commerce" }, + + // === ANALYTICS & DATA PLATFORMS === + { name: "SmartOcto", email: "dpo@smartocto.com", category: "Analytics", note: "DPO verified from official privacy policy. NL-based, GDPR compliant." }, + { name: "Content Insights", email: "privacy@contentinsights.com", category: "Analytics" }, + { name: "Piano Analytics", email: "privacy@piano.io", category: "Analytics" }, + { name: "Comscore", email: "privacy@comscore.com", category: "Analytics" }, + { name: "Nielsen", email: "privacy@nielsen.com", category: "Analytics" }, + { name: "Chartbeat", email: "privacy@chartbeat.com", category: "Analytics" }, + + // === MARKETING CLOUDS === + { name: "Salesforce Marketing Cloud", email: "privacy@salesforce.com", category: "Marketing" }, + { name: "Adobe Marketing Cloud", email: "privacy@adobe.com", category: "Marketing" }, + { name: "Oracle Marketing Cloud", email: "privacy@oracle.com", category: "Marketing" }, + { name: "HubSpot", email: "privacy@hubspot.com", category: "Marketing" }, + { name: "Mailchimp", email: "privacy@mailchimp.com", category: "Marketing" } +]; + +// --- Populate company