Photographer website in Kassel, team project
A new website for a photography studio in Kassel: 16 pages, static, with its own Node server for delivery. A team project: 39 commits, 8 of them mine. My part sat on the side you do not see: getting a third-party chat widget in so that it does not load at all without consent.
Before and after

My part
- ADON CRM chat widget embedded across all 15 pages, not as a direct script tag but through a consent loader: before consent it is not in the DOM at all
- Took the third-party widget apart before letting it in: XHR with polling, Shadow DOM, no iframe, no WebSocket, talks only to its own endpoint
- Added a new “Functional” cookie category and raised the consent version. A new processing purpose means asking again
- Extended the CSP on the server: the widget host added to
script-srcandconnect-src - Cookies set according to Planet49: analytics and marketing off by default, functional too
- Added a section on the chat to the privacy statement
- Above the fold: image frame set so the photo fills it; studio copy reworked
Verification
- Before consent: no widget in the DOM, checked by selector, the script is simply absent
- After accepting “Functional”: the widget is injected and builds its Shadow DOM interface
- On a repeat visit with stored consent it loads by itself
- No CSP violations in the console; the API connection is allowed, and neither iframe nor WebSocket is needed
- The whole procedure sits in the repository as an integration journal, traceable, not merely claimed
Stack: HTML, CSS, JavaScript, Node.js (delivery and CSP), Docker