Kort antwoord: PrutCMS zet geen tracking-cookies, spoort je niet, stuurt niks naar derden, en heeft geen consent-banner nodig. Nul externe calls by default — geen enkele byte gaat naar een domein dat jij niet zelf host. Dit artikel legt uit wat er wél gebeurt en waarom dat binnen AVG/GDPR blijft.

Wat PrutCMS NIET doet

Geen Google Analytics. Geen Facebook Pixel. Geen Hotjar, Mixpanel, Segment, of enige andere analytics-dienst. Geen Consent Management Platform. Geen externe fonts van fonts.googleapis.com. Geen CDN voor jQuery/Bootstrap/whatever. Geen Gravatar-calls. Geen OpenGraph-scrapes naar andere sites tenzij jij een URL embedded. Geen error-reporting naar Sentry of iets dergelijks. Geen newsletter-service tracking pixels. Geen "share"-buttons die naar Facebook/Twitter phonen.

Check zelf: open DevTools → Network tab → refresh een pagina. Je ziet alleen requests naar het domein waar je nu bent. Geen enkele third-party domain. Dat is geen accident — dat is het ontwerp.

Wat PrutCMS WEL doet

Session cookies

Als je inlogt, zet PrutCMS één cookie: PHPSESSID. Dit is een random ID dat jouw browser koppelt aan een server-side sessie. Alleen voor login-status, CSRF-protection, en shopping-cart-achtige state. Geen tracking-info in deze cookie, geen cross-site bruikbaarheid, HttpOnly en SameSite=Lax by default. Duur: tot je uitlogt of de sessie expired.

Voor anonieme bezoekers wordt er geen cookie gezet. Je kan volledig de hele site browsen zonder ooit een cookie te krijgen. Pas bij daadwerkelijk inloggen komt die PHPSESSID.

Localstorage (alleen jouw browser)

Voor gebruikers-comfort bewaart PrutCMS in je lokale browser-storage:

  • pcms-theme — light/dark mode voorkeur
  • pcms-audio-state — welke track je aan het luisteren bent + positie (zodat het doorspeelt bij pagina-wissel)
  • pcms-audio-volume — jouw volume-setting

Dit is géén cookie. Het leeft uitsluitend in jouw browser, wordt nooit naar de server gestuurd, en is niet leesbaar voor andere sites. Clear je browser-data en het is weg. AVG/GDPR: localStorage voor puur functionele voorkeuren zonder tracking-doel valt onder "strikt noodzakelijk" en vereist geen consent-banner.

Service worker (PWA)

Voor de installable-app-functionaliteit registreert PrutCMS een service worker (/sw.js). Deze cached je site offline, maar doet geen calls naar derden, bewaart geen analytics, en tracked geen usage. Je kan 'm zien via DevTools → Application → Service Workers, en uitschakelen met /sw-reset.

Signed audio URLs (v9)

Audio-bestanden krijgen een HMAC-signed tijdelijke URL (10 minuten geldig). Hotlinkers en scrapers kunnen je audio niet stelen — directe URL's naar /audio/hash.mp3 geven 403. De signing-logica draait volledig op jouw server met een eigen secret. Geen externe auth-service, geen DRM-licentie-server, geen telemetrie over wie wat afspeelt.

De player vernieuwt URLs proactief elke 8 minuten via jouw eigen domein (?refresh_audio=1). Geen externe token-server, geen third-party refresh-dienst. Wat over de lijn gaat is alleen een lijst van jouw eigen audio-files met nieuwe signatures.

MediaSession API (lockscreen controls)

Deze API toont de huidige track + cover op je telefoon-lockscreen, in de notification-bar, en laat bluetooth-headphone-knoppen werken. Dit is 100% browser-lokaal: metadata wordt door jouw browser aan jouw OS doorgegeven, niet naar een server gestuurd. Geen Google Cast, geen Spotify Connect, geen external media registry — pure native browser API.

Wake Lock API (scherm-actief tijdens play)

Tijdens audio-playback stelt de speler het scherm-blanking uit zodat je telefoon niet in deep sleep gaat halverwege een track. Dit gaat via de browser Wake Lock API — een lokale OS-permissie die jij per site kunt geven of weigeren. Geen tracking, geen batterij-drain-profilering, geen "wie luistert wanneer"-logging. De lock wordt automatisch losgelaten zodra je pauzeert of de tab sluit.

Server logs

Apache/nginx logt standaard wat requests, incluis IP-adres. PrutCMS doet zelf géén IP-logging in applicatie-data. Voor rate-limiting (login-pogingen etc) wordt het IP-adres gehashed opgeslagen in de database of in een klein rate-limit-bestand — niet rauw. Audit logs bevatten actions (wie logde in, wie verwijderde een post) maar gebruiken ook gehashed IPs.

Wat je hoster met server-logs doet valt buiten PrutCMS. Goede hosters (TransIP, Hetzner, OVH) volgen AVG/GDPR en bewaren logs maximaal een paar weken. Check hun privacy-verklaring.

Email (optioneel)

Voor password-reset en email-verify stuurt PrutCMS emails via je server's PHP mail() of via SMTP naar een mailserver die jij configureert. Geen Mailchimp, geen SendGrid, geen externe mailing-dienst. De email-adressen staan in je users-database of users.json, nooit bij een derde.

CRDT-sync is ook privacy-neutraal

Als je PrutCMS instances met elkaar laat syncen (voor multi-device of federation), gebeurt dit via je eigen domein. Geen central sync-server, geen "PrutCMS cloud", geen Anthropic/Google/AWS in de keten. Jij hosted alles, jij controleert het.

Elke tabel/bestand heeft een hlc_ts (Hybrid Logical Clock timestamp) voor conflict-free merging. Dit is technische metadata, geen identificatie. Als je twee kopieën wil mergen: beide draaien de sync-endpoint, pushen hun recent-changed items naar elkaar, HLC beslist welke "wint". Alles P2P tussen jouw servers.

Externe embeds (als je ze gebruikt)

Als je in een post een YouTube-video, SoundCloud-track, of Spotify-embed invoegt, wordt die vanuit hun servers geladen. Op die embed-pagina gelden hun cookies/tracking. PrutCMS gebruikt youtube-nocookie.com voor YouTube embeds by default — dat is YouTube's privacy-enhanced mode die pas tracking-cookies zet na interactie.

Als je embeds vermijdt, heb je nul externe calls. Als je ze gebruikt, bepaal jij het per post, en de gebruiker ziet zelf waar ze vandaan komen (zichtbaar in DevTools).

AVG/GDPR: geen consent-banner nodig

De Europese AVG vereist een consent-banner voor niet-essentiële cookies en tracking. Aangezien PrutCMS geen niet-essentiële cookies zet en niet trackt, is er niets om consent voor te vragen. De enige cookie (PHPSESSID na login) valt onder "strikt noodzakelijk voor de aangevraagde dienst" — vrijgesteld van consent-plicht.

Als je zelf externe embeds, Google Analytics, of nieuwsbrief-tracking toevoegt: dan zul je weer een consent-banner moeten bouwen. Maar dat is jouw keuze, niet iets wat PrutCMS oplegt.

MySQL-optie (v9.1+): wat verandert er?

Met MySQL als backend werken dezelfde principes. Rate-limit en audit-log verhuizen van JSON-files naar DB-tabellen, maar de inhoud blijft gelijk — gehashed IPs, geen rauwe identificatie. Je backup wordt mysqldump in plaats van tar /posts, maar de data blijft op jouw server.

Bewijs: audit het zelf

Open grep -r "google\|facebook\|fbq\|gtag\|analytics\|hotjar\|segment" /path/to/prutcms. Resultaat: geen matches in de core. De enige "google" die je zou kunnen vinden is in docs of comments — geen enkele runtime-call.

Voor forensische zekerheid: draai PrutCMS achter een firewall die outbound connections logt (tcpdump of je router's logs). Surf door je eigen site. Het enige outbound verkeer zou naar update-checks of embed-URLs moeten zijn — en die kan je uitschakelen.

Dat is PrutCMS's belofte, en het is controleerbaar. Geen marketing, gewoon geen externe calls.