CookieSnitch: Was lädt, bevor jemand zustimmt?

CookieSnitch schaut sich eine Website so an, wie sie jemand sieht, der noch nichts angeklickt hat. Kein "Alle akzeptieren", kein "Ablehnen", einfach nur Seite auf. Und dann wird mitgeschrieben, was trotzdem schon alles lädt.
Spoiler: Meistens ist es mehr, als man denkt 🍪
Das Problem
Berufskrankheit: Wenn ich auf einer Website lande, schaue ich manchmal einfach so in die DevTools. Und es sind immer wieder die gleichen Dinge:
- Google Fonts kommen direkt von Googles Servern, obwohl man sie einfach selbst hosten könnte
- Google Analytics oder der Meta-Pixel feuern los, bevor das Cookie-Banner überhaupt fertig gerendert ist
- Das Banner hat zwar ein "Akzeptieren", aber "Ablehnen" gibt's erst auf der zweiten Ebene
- Im Impressum steht noch "Angaben gemäß § 5 TMG", das gibt's seit 2024 nicht mehr
Das alles per Hand zusammenzusuchen, ist mühsam. Ich wollte etwas, das mir in einer Minute sagt, was los ist, und zwar mit Request-URL, Cookie und Paragraf dazu.
Die Lösung
Domain eingeben, CookieSnitch startet ein frisches Chromium mit deutschem Standort, ruft die Startseite plus bis zu zehn Unterseiten auf und klickt nichts an. Danach gibt's einen Bericht im Browser und als PDF.
Geprüft wird unter anderem:
- Consent-Banner: Gibt es eins, steht Ablehnen auf der ersten Ebene, sind Häkchen vorausgewählt?
- Tracking vor Einwilligung nach § 25 TDDDG, also Requests, Cookies und Local Storage
- Drittanbieter mit Land und DPF-Status, damit man sieht, welche Daten in die USA gehen
- Impressum nach § 5 DDG und Datenschutzerklärung nach Art. 13 DSGVO, inklusive veralteter Verweise auf TMG, TTDSG oder Privacy Shield
- Technik: HTTPS, HSTS, Mixed Content, Formulare über HTTP
Jeder Befund hat einen Beleg und ein "So beheben". Und natürlich steht da auch: Das ist keine Rechtsberatung.
Credits statt Abo
Die erste Prüfung einer Domain ist kostenlos, danach kostet jede weitere Prüfung einen Credit. Credits gibt's in Paketen ab 5 €, sie verfallen nie und es gibt kein Konto. Das Guthaben hängt an einem Schlüssel, den man auf einem anderen Gerät einfach wieder eingibt. Bezahlt wird über Creem, CookieSnitch selbst speichert keine E-Mail-Adresse.
Ein Abo für ein Tool, das man vielleicht dreimal im Jahr braucht, fand ich selbst immer nervig. Also gibt's keins.
Tech Stack
Nach Lauschliste wieder TypeScript, diesmal aber ohne Next.js:
- Runtime: Node.js 24, TypeScript (ESM,
tsxzur Laufzeit) - Scan: Playwright mit Chromium, auch für den PDF-Export
- Server: Fastify, dazu eine kleine Job-Queue für parallele Scans
- Tests: Vitest und Stryker für Mutation Testing
- Deployment: Ein einziges Docker-Image auf meinem eigenen Server
Die Seite selbst lädt übrigens keine Google Fonts. Die Schriften liegen lokal, wäre ja sonst auch etwas peinlich 😅
Architektur
Der Crawler ist das einzige Modul, das einen Browser anfasst. Er sammelt Rohdaten (Requests, Cookies, Storage, Seitentexte, Links, fixierte Elemente als Banner-Kandidaten) und legt sie als Capture ab. Alles danach sind reine Funktionen auf diesem Capture: Drittanbieter, Consent, Rechtstexte und Technik. Kein Netzwerk, kein Browser.
Das macht das Testen angenehm. Für die Erkennung gibt es ein Goldset aus 62 Fixture-Sites, jede mit einer expected.json, welche Befunde kommen müssen und welche auf keinen Fall. Externe Hosts werden dabei lokal gestubbt, npm run eval läuft also komplett ohne Internet. Land und DPF-Status der 133 Anbieter in der Vendor-Liste habe ich von einem Agent recherchieren lassen. Für die offizielle DPF-Liste gibt es keine öffentliche API, deshalb ist die Liste kuratiert statt live abgefragt und muss regelmäßig nachgeprüft werden.
Namensfindung
CookieSnitch hieß nicht immer so. Gestartet ist das Projekt als Cookie Canary, kurz danach wurde es Nullklick und am Ende eben CookieSnitch. Ich finde, der Name sagt am ehrlichsten, was das Tool macht: Es petzt 🫢