shannonmcgivney/consent-gate

Sorgt dafür, dass auf einer Website oder per Vibe-Coding erstellten App keine Werbepixel, Analysetools, Session-Replay-Skripte oder optionale Drittanbieter geladen oder Daten gesendet werden, bis der Besucher zustimmt – ein „Default-Deny“-Einwilligungsmanager, ehrlicher Banner (gleichwertige Akzeptieren/Ablehnen-Buttons, deaktivierte Kategorien), Widerruf, Global Privacy Control, keine Kundene-Mails oder vollständigen URLs in Tracking-Paketen sowie eine korrekte Datenschutzerklärung. Abschließender Nachweis durch Tests bei frischen Besuchen. Verwenden Sie dieses Skill, nachdem ein Consent-Audit Tracking vor Einwilligung aufgedeckt hat oder wenn jemand „mach einfach ein Cookie-Banner“ sagt.

Was ist consent-gate?

Dieses Skill stellt sicher, dass keine optionalen Skripte von Drittanbietern (Analytics, Werbepixel, Session Replay) auf einer Website geladen werden, bis der Benutzer explizit über einen Cookie-Banner zugestimmt hat. Es implementiert einen zentralen Consent-Loader, der Scripts erst nach Opt-In dynamisch lädt, verhindert das Zwischenspeichern von Events vor der Einwilligung und respektiert die Global Privacy Control des Browsers. Der Banner bietet gleichwertige Akzeptieren- und Ablehnen-Buttons, deaktivierte Kategorien und eine Einstellungsoption; der Widerruf löscht auch die relevanten Cookies. Das Skill prüft die Umsetzung mit einer Reihe von Tests (frische Besuche, Navigation, Widerruf, SPA-Routenwechsel) und erstellt einen detaillierten Bericht über geänderte Dateien und Testergebnisse. Es ist für lokale Entwicklung mit Claude Code sowie für agentenbasierte Builder wie Lovable, Bolt, v0 oder Replit geeignet.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/shannonmcgivney/consent-before-tracking/tree/HEAD/skills/consent-gate

Installed? Explore more Produktivität & Zusammenarbeit skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Consent Gate: Nichts Optionales läuft, bis der Nutzer zustimmt

Die Regel aus dem Video in einem Satz: Keine Tracking-Pixel, Analysetools oder Skripte von Drittanbietern werden geladen, bis der Nutzer im Cookie-Banner auf „Akzeptieren" klickt. Ein Banner, der erscheint, nachdem der Pixel bereits gefeuert wurde, behebt nichts. Dieses Skill baut den Warte-Teil.

Keine Rechtsberatung. Schreiben Sie niemals „vollständig konform" in Code, Texte oder Berichte. Beschreiben Sie, was die App jetzt tut und was getestet wurde.

Bevor Sie etwas anfassen

  1. Führen Sie ein Audit durch. Falls für diese App kein consent-audit-Report vorliegt, führen Sie diesen zuerst aus. Sie benötigen das Inventar: welche Anbieter, wo sie starten, was sie senden.
  2. Fragen Sie den Eigentümer eine Frage pro Tracker: behalten, gaten oder entfernen? Wenn ein Tracker nicht für Entscheidungen oder Werbung genutzt wird, ist Entfernen besser als Gaten. Eine Seite, die nur notwendige Speicherung benötigt, braucht gar kein Banner; fügen Sie keines hinzu.
  3. Wissen Sie, was die Veröffentlichung freigibt. Gehostete Builder (Lovable usw.) veröffentlichen alle unveröffentlichten Änderungen gemeinsam. Listen Sie diese auf und holen Sie eine Freigabe ein, bevor Sie veröffentlichen.
  4. Schützen Sie Erstanbieterdaten. Das Gaten von Trackern darf sich nicht auf Login, Zahlungen oder die eigenen Datenbankschreibvorgänge der App (Schülerarbeiten, Fortschritt, Formulare) auswirken. Halten Sie dies im Bericht fest.

Was „gegatet" bedeutet (die Checkliste, die der Fix erfüllen muss)

Laden

  • Ein zentraler Lader (src/lib/consent.ts, siehe references/consent.ts). Kein Pixel, GTM, gtag, PostHog oder Replay-<script> in index.html, dem Root-Layout oder main.tsx.
  • Optionale Skripte werden nicht abgerufen, nicht nur nicht initialisiert: dynamisches import() oder Script-Injektion erfolgt erst nach Opt-In.
  • Es werden keine in der Warteschlange befindlichen Events wiedergegeben: Seitenaufrufe vor der Einwilligung werden verworfen, nicht nachträglich gesendet.
  • Serverseitige Weiterleitungen (Meta Conversions API, /api/track, Edge-Funktionen) prüfen dieselbe gespeicherte Entscheidung, die mit der Anfrage gesendet wird.
  • Host-injizierte Analysen werden an der Quelle deaktiviert (Lovable → Einstellungen → Besucheranalysen aus; Vercel/Netlify/Cloudflare-Analysen aus) oder vor der Injektion gegatet. Das Entfernen eines Skripts nach dem Laden ist zu spät, weil die erste Anfrage bereits abgesendet wurde.
  • Google Consent Mode (falls GA/Ads bleiben): gtag('consent','default',{ad_storage:'denied',analytics_storage:'denied',ad_user_data:'denied',ad_personalization:'denied'}) und das gtag-Skript selbst wartet in diesem Setup trotzdem auf Opt-In. Consent Mode „basic", nicht „advanced", da Advanced cookielose Pings vor der Einwilligung sendet.

Der Banner

  • Optionale akzeptieren und Optionale ablehnen sind gleich prominent: gleiche Größe, gleicher Stil, gleiche Klickzahl. Plus eine Einstellungen-Option.
  • Kategorie-Toggles (Analytik, Werbung usw.) beginnen deaktiviert.
  • Das Schließen des Banners (X / Escape) bedeutet Ablehnen.
  • Die Entscheidung wird mit einer Version und einer Ablaufzeit (6 bis 12 Monate) gespeichert. Eine Änderung der Anbieterliste erhöht die Version und fragt erneut.
  • Ein dauerhafter „Datenschutzeinstellungen"-Link in der Fußzeile öffnet die Einstellungen erneut.
  • Der Widerruf stoppt zukünftige Aufrufe und löscht app-eigene optionale Cookies und Speicher (_ga*, _fbp, _gcl_au, _ttp, ph_*, ajs_*, _hj*, _clck), ohne die Authentifizierung zu beeinträchtigen.
  • Global Privacy Control (navigator.globalPrivacyControl === true) wird als Ablehnen für Werbung/Verkauf/Weitergabe behandelt, und der Banner sagt, dass sie beachtet wurde.

Was gesendet wird, auch nach Zustimmung

  • Keine E-Mails, Telefonnummern, Namen oder Geburtsdaten in Pixel- oder Analyse-Paketen (kein Meta Advanced Matching, kein identify(email)). Verwenden Sie eine undurchsichtige ID nur, wenn wirklich nötig.
  • URLs werden ohne ?query und #fragment gesendet (Geschenkcodes, Reset-Tokens, Suchbegriffe). Wenn ein Anbieter diese nicht entfernen kann, entfernen Sie den Anbieter.
  • Nichts aus Quizantworten, Chat-Inhalten, Gesundheits-/Finanz-/Geburtsdaten oder Formularfeldern.
  • Videoseiten: kein Werbepixel auf Seiten, die Lektions- oder Kursvideos abspielen (Risiko durch den US Video Privacy Protection Act), es sei denn, die Rechtsabteilung sagt etwas anderes.

Hinweis

  • Eine Datenschutz-/Cookie-Hinweisseite unter einer öffentlichen Route, verlinkt in der Fußzeile und auf der Registrierungs-/Login-Seite, die die tatsächlichen Anbieter und Kategorien auflistet. Verwenden Sie nur den tatsächlichen Betreibernamen und die Kontakt-E-Mail; erfinden Sie niemals Adressen, Datenschutzbeauftragte oder rechtliche Behauptungen.

Implementierung

  • Lokaler Code / Claude Code: Kopieren Sie references/consent.ts in die App, registrieren Sie jeden optionalen Anbieter als loader, löschen Sie die hartcodierten Tags, bauen Sie den Banner mit den eigenen Komponenten der App und verknüpfen Sie den Fußzeilen-Link. Halten Sie das Diff klein und im Stil der App.
  • Lovable / Bolt / v0 / Replit (agentenbasiert): Fügen Sie den Fix-Prompt aus ~/.claude/skills/consent-audit/references/prompts.md ein (oder den Remove-Prompt). Überprüfen Sie es dann selbst; vertrauen Sie nicht der Zusammenfassung des Agenten.

Beweisen (erforderlich, bevor Sie es als erledigt melden)

Führen Sie diese Tests gegen die Vorschau und dann erneut gegen die Live-URL nach der Veröffentlichung durch. Verwenden Sie im integrierten Browser von Claude einen neuen Tab mit geleertem Speicher, dann read_network_requests und javascript_tool (document.cookie, localStorage):

TestBestanden, wenn
Neuer Besuch, kein Klick0 Anfragen an Werbe-, Analyse- oder Replay-Domains; keine optionalen Cookies oder Speicher
Ablehnen, dann 2 Seitennavigationenimmer noch 0; Banner bleibt weg; Entscheidung gespeichert
Nur Analyse akzeptierenAnalyse lädt; Werbepixel nicht
NeuladenEntscheidung gemerkt; kein Banner
Widerruf über Fußzeilen-Linkzukünftige Aufrufe gestoppt; optionale Cookies gelöscht; noch eingeloggt
GPC an (navigator.globalPrivacyControl forciert true)Werbung ohne Klick abgelehnt
Clientseitige Navigation (SPA)kein Tracker schleicht sich bei Routenwechsel ein
Anmelden mit einem Testkontokeine E-Mail oder Benutzer-ID in einer Tracker-Anfrage
Build + Typprüfungbestanden

Bericht: geänderte Dateien, Ergebnis jedes Tests mit Beweisen (gesehene Domains oder „keine"), nicht durchgeführte Tests und warum, damit veröffentlichte unveröffentlichte Änderungen und „Keine Rechtsberatung. Lassen Sie sich von einem Rechtsbeistand beraten, wenn Sie Werbung schalten oder Besucher aus Kalifornien/EU bedienen."

Individual skills in this repo

This repo contains 2 individual skills — each has its own dedicated page.

Verwandte Skills