🍪 100% DSGVO-konform · Kostenlos für immer
Selbstgehostete Alternative zu Cookiebot und Usercentrics — ohne Abo, ohne Datenweitergabe an Drittanbieter.
📍 Script URL
https://enjyn.de/src/enjyn-cookie.php
✨ Features
- ✓ Ein Script-Tag – sofort einsatzbereit
- ✓ Automatische Cookie-Erkennung (~50 bekannte Tracker, mit Wildcards)
- ✓ Script- und Iframe-Blocker: Tracker laden erst NACH Zustimmung
- ✓ Vereinheitlichter Banner mit direkt sichtbaren Kategorien
- ✓ Dynamischer Button-Text („Alle akzeptieren" ↔ „Auswahl speichern")
- ✓ 9 vorgefertigte Themes + Live-Anpassung (Glasmorphismus, Neon, Brutal …)
- ✓ Rechtstext-Lesemodus (automatische Erkennung, kompakter Banner)
- ✓ Mehrsprachig (DE / EN, Browser-Erkennung)
- ✓ Datenschutz-Tabelle automatisch via Container
- ✓ Quarantäne-Kategorie für unbekannte Cookies
- ✓ Zurück-Button im Footer
- ✓ Reopen-Button für jederzeitigen Widerruf
- ✓ Anonymisierter Consent-Log (DSGVO Art. 7)
- ✓ Mobile-optimiert (Bottom-Sheet mit Inner-Scrolling)
🚀 Integration (eine Zeile reicht)
<script src="https://enjyn.de/src/enjyn-cookie.php" async></script>
Banner erscheint beim ersten Besuch mit direkt sichtbaren Kategorien. Nach Auswahl bleibt ein kleiner Cookie-Button zum Widerrufen.
⚙️ Konfigurationsoptionen
Volle Kontrolle über window.EnjynCookie vor dem Script-Tag:
Allgemein
| Option |
Standard |
Beschreibung |
| site_name | – | Name der Website |
| operator | – | Betreiber-Name |
| contact | – | Datenschutz-Kontakt-E-Mail |
| lang | de | Sprache (de, en) |
| auto_lang | true | Browser-Sprache automatisch erkennen |
| privacy_url | – | Link zur Datenschutzerklärung |
| imprint_url | – | Link zum Impressum |
| consent_lifetime | 180 | Tage bis erneut nachgefragt wird |
| auto_scan | true | Auto-Erkennung von Cookies |
| show_reopen | true | Cookie-Icon in der Ecke nach Consent |
| log_consents | false | Anonymisierten Consent-Log aktivieren |
| log_endpoint | – | URL für Consent-Log-POST |
Design
| Option |
Standard |
Beschreibung |
| primary | #2563eb | Akzentfarbe (Buttons) |
| primary_text | #ffffff | Text-Farbe auf Primary-Buttons |
| position | bottom-right | bottom-right, bottom-left, bottom-center, center |
| theme | auto | Siehe Theme-Liste unten |
| style | modern | modern, minimal, box |
| animation | slide | slide, fade, pop |
| radius | 14px | Ecken-Radius |
| btn_radius | 10px | Button-Ecken-Radius |
| opacity | 1 | Karten-Transparenz (0–1) |
| card_blur | 0 | Glasmorphismus-Blur in px |
| backdrop | true | Verdunkelung im Hintergrund |
| backdrop_blur | 2 | Backdrop-Blur in px |
| backdrop_alpha | 0.35 | Hintergrund-Dunkelheit (0–1) |
| border_width | 1 | Rahmenstärke in px |
| font_scale | 1 | Schriftgrößen-Skalierung (0.85–1.3) |
Rechtstext-Lesemodus
| Option |
Standard |
Beschreibung |
| legal_mode | undefined | true = Modus erzwingen, false = abschalten, undefined = auto-Erkennung |
| legal_paths | [] | Eigene Pfade zusätzlich zu den Standards |
🎨 9 vorgefertigte Themes
| Theme |
Beschreibung |
default | Modern, blau, weiß |
dark | Dunkler Modus |
glass | Glasmorphismus, halbtransparent mit Blur |
glass-dark | Dunkler Glaseffekt |
neon | Knallige Akzente auf schwarz |
minimal-bw | Schwarz/weiß, scharfe Kanten |
pastel | Rosa, weich, sehr rund |
brutal | Hart kantig, gelb, harter Schatten |
soft | Sehr rund, Pill-Buttons, weiche Schatten |
🔘 Adaptive Button-Anzeige
Die Buttons im Banner passen sich automatisch an:
| Situation |
Buttons |
| Es gibt optionale Kategorien (Analytics, Marketing …) | [Nur Notwendige] [Alle akzeptieren] |
| User wählt eine Kategorie ab | [Nur Notwendige] [Auswahl speichern] |
| Nur essential, keine optionalen Cookies | [Akzeptieren] (Reject-Button ausgeblendet) |
💡 Anwendungsbeispiele
Minimal (empfohlen)
<script src="https://enjyn.de/src/enjyn-cookie.php" async></script>
Mit eigenen Cookies (inkl. Wildcard)
<script>
window.EnjynCookie = {
site_name: "Meine Website",
primary: "#2563eb",
privacy_url: "/datenschutz",
imprint_url: "/impressum",
categories: {
analytics: {
cookies: [
{ name: "_ga", provider: "Google LLC (USA)",
purpose_de: "Statistik", duration: "2 Jahre",
type: "HTTP-Cookie" },
// Wildcard: matcht _ga_ABCDEF, _ga_XYZ123 etc.
{ name: "_ga_*", provider: "Google LLC (USA)",
purpose_de: "GA4-Session", duration: "2 Jahre" }
]
}
}
};
</script>
<script src="https://enjyn.de/src/enjyn-cookie.php" async></script>
Glas-Design unten mittig
<script>
window.EnjynCookie = {
theme: "glass",
position: "bottom-center",
primary: "#7c3aed",
opacity: 0.7,
card_blur: 20
};
</script>
<script src="https://enjyn.de/src/enjyn-cookie.php" async></script>
🚫 Script-Blocker
Tausche bei Tracking-Scripts src gegen data-src und type gegen "text/plain". Das Widget aktiviert sie erst nach Zustimmung:
<!-- Vorher (DSGVO-Verstoß): lädt SOFORT -->
<script src="https://www.googletagmanager.com/gtag/js?id=G-XXXX"></script>
<!-- Nachher: lädt erst nach Consent -->
<script type="text/plain"
data-cookiecategory="analytics"
data-src="https://www.googletagmanager.com/gtag/js?id=G-XXXX"
async></script>
Iframes (YouTube, Vimeo, Maps)
<iframe data-cookiecategory="marketing"
data-src="https://www.youtube-nocookie.com/embed/VIDEO_ID"
width="560" height="315"></iframe>
🔍 Automatische Cookie-Erkennung
Der Auto-Scanner findet Cookies aus mehreren Quellen:
document.cookie – inkl. Live-Überwachung neu gesetzter Cookies
localStorage + sessionStorage
IndexedDB
- Drittanbieter-Domains via
PerformanceObserver
MutationObserver für dynamisch eingefügte Scripts/Iframes (z. B. Tag-Manager)
Bekannte Tracker werden via interner Datenbank kategorisiert (Google, Meta, Hotjar, HubSpot …). Unbekannte Cookies landen in einer Quarantäne-Kategorie – standardmäßig deaktiviert.
📦 Quarantäne & Cookie-Zuordnung
Sobald ein Cookie in categories.X.cookies definiert ist (auch via Wildcard), gilt diese Kategorie und der Cookie verschwindet aus der Quarantäne. Zusätzlich gibt es eine Laufzeit-API zum Verschieben:
// Workflow für Quarantäne-Cleanup
EnjynCookie.unknown() // Liste aller unbekannten Cookies
// Pro Cookie zuordnen:
EnjynCookie.assign("xyz_session", "essential", {
provider: "Mein CMS",
purpose_de: "Session-Verwaltung",
duration: "Session",
type: "HTTP-Cookie"
});
📄 Datenschutzerklärung — Auto-Tabelle
Container in deiner Datenschutzerklärung platzieren – das Widget befüllt sie automatisch und ergänzt „bereitgestellt durch Enjyn Gruppe":
| Container |
Inhalt |
<div data-enjyn-cookie-table></div> | Komplette Tabelle aller Kategorien |
<div data-enjyn-cookie-table="analytics"></div> | Nur eine Kategorie |
<span data-enjyn-cookie-list></span> | Komma-Liste der Cookie-Namen |
<a data-enjyn-open href="#">...</a> | Öffnet den Settings-Dialog |
<div data-enjyn-placeholder="marketing"></div> | „Inhalt blockiert"-Box für eingebettete Inhalte |
📖 Rechtstext-Lesemodus
Auf rechtlichen Seiten (Datenschutz, Impressum, AGB) wird der Banner automatisch kompakter dargestellt – ohne Backdrop, damit der Text gut lesbar bleibt. Die Kategorien sind hinter einem Ausklappfeld versteckt.
Erkannt werden Standard-Pfade wie /datenschutz, /impressum, /agb, /privacy, /terms. Eigene Pfade können ergänzt werden:
window.EnjynCookie = {
legal_paths: ["/agb", "/widerruf", "/nutzungsbedingungen"]
};
Banner-Text im Lesemodus: „Die Cookies wurden noch nicht akzeptiert, oder es wurde noch keine Einstellung festgelegt. Sie befinden sich aktuell nur im Lesemodus für Rechtsdokumente."
🛠️ JavaScript API
Globale Funktionen unter window.EnjynCookie:
Banner-Aktionen
EnjynCookie.open() → Settings-Dialog öffnen
EnjynCookie.accept() → Alles akzeptieren
EnjynCookie.reject() → Nur Notwendige
EnjynCookie.reset() → Zustimmung verwerfen, Banner erneut zeigen
EnjynCookie.get() → Aktueller Consent als Objekt
EnjynCookie.isAllowed("analytics") → Boolean, ob Kategorie zugestimmt
Design (live)
EnjynCookie.setTheme("glass")
EnjynCookie.setDesign({ primary: "#ff0080", opacity: 0.7, card_blur: 20 })
EnjynCookie.getDesign() → aktuelle Werte als Objekt
EnjynCookie.themes() → Array aller Theme-Namen
Sprache & Datenschutz
EnjynCookie.setLanguage("en") → Sprache wechseln ohne Reset
EnjynCookie.refreshPrivacy() → Datenschutz-Container neu rendern
Auto-Scanner & Zuordnung
EnjynCookie.scan() → Sofort-Scan auslösen
EnjynCookie.found() → Alle erkannten Cookies
EnjynCookie.unknown() → Quarantäne-Liste
EnjynCookie.assign(name, category, meta)
→ Cookie manuell einer Kategorie zuordnen
Event-Listener
EnjynCookie.onChange(function (record) {
if (record.choices.analytics) {
// hier z. B. Google Analytics initialisieren
gtag('js', new Date());
gtag('config', 'G-XXXX');
}
});
🔒 DSGVO-Konformität
- Opt-in: Nicht-essenzielle Kategorien werden ohne Klick nicht aktiviert
- Gleichwertige Buttons: „Nur Notwendige" optisch gleich prominent wie „Alle akzeptieren"
- Granulare Auswahl: Pro Kategorie Toggle-Switch, direkt im Banner sichtbar
- Einfacher Widerruf: Reopen-Button oder
data-enjyn-open
- Echter Script-Blocker: Tracker werden vor Consent gar nicht geladen
- Anonymisierter Consent-Log: IP-Subnet + sha256 + tägliches Salt, Salts nach 30 Tagen gelöscht
- Keine externen Assets: kein Google Fonts, kein FontAwesome, alles inline
- Keine Datenübertragung vor Zustimmung: Cookie-DB inline im Bundle
📱 Mobile-Optimierung
- Banner als zentriertes Bottom-Sheet auf Tablets und Smartphones
- Inner-Scrolling: lange Kategorien-Listen scrollen, Buttons + Footer bleiben sichtbar
- Touch-Targets mindestens 44 px hoch
- Cookie-Tabelle wird auf kleinen Screens zum Card-Layout mit Labels
- 3D-Cookie dezenter (56 px statt 78 px)
📜 Lizenz & Wasserzeichen
Das Widget ist kostenlos nutzbar. Das powered by Enjyn Gruppe-Wasserzeichen im Banner und in der Datenschutz-Tabelle ist Lizenzbestandteil und wird sowohl serverseitig als auch clientseitig erzwungen.
Diebstahlschutz: Das Widget funktioniert nur, wenn es von einer autorisierten Domain (Standard: enjyn.de) geladen wird. Bei unautorisierten Kopien zeigt es einen roten Warnbanner und führt keine Funktionen aus.