diff --git a/.env.example b/.env.example index 2a08852..883c8bd 100644 --- a/.env.example +++ b/.env.example @@ -69,7 +69,6 @@ CLOUDINARY_CLOUD_NAME=my-cloud-name CLOUDINARY_API_KEY=my-api-key CLOUDINARY_API_SECRET=my-api-secret -LARAVEL_DEFAULT_FATHOM_SITE_ID=WECFOADW CODEBAR_ANALYTICS_URL=https://analytics.codebar.ch LITELLM_URL=https://llm.codebar.net LITELLM_MASTER_KEY= diff --git a/README.md b/README.md index 5f5daed..4a5e8b5 100644 --- a/README.md +++ b/README.md @@ -141,7 +141,7 @@ HSTS, COOP, CORP, `X-Content-Type-Options`, `Referrer-Policy` and `X-Frame-Optio - **SEO** — `spatie/laravel-sitemap`, `spatie/laravel-responsecache` - **Security & health** — `spatie/laravel-csp`, `spatie/laravel-honeypot` (network request form), `spatie/laravel-permission`, `spatie/laravel-health`, `spatie/security-advisories-health-check`, `mazedlx/laravel-feature-policy` - **Ops** — `laravel/nightwatch` (observability), `symfony/postmark-mailer` -- **Analytics** — [Fathom](https://usefathom.com) (privacy-friendly, no cookie banner) +- **Analytics** — codebar Analytics (self-hosted on analytics.codebar.ch, cookieless, no cookie banner) ## License diff --git a/app/Security/Presets/MyCspPreset.php b/app/Security/Presets/MyCspPreset.php index 146cbee..dae317c 100644 --- a/app/Security/Presets/MyCspPreset.php +++ b/app/Security/Presets/MyCspPreset.php @@ -18,8 +18,6 @@ public function configure(Policy $policy): void $scriptSources = array_filter([ Keyword::SELF, - 'cdn.usefathom.com', - 'cdn-eu.usefathom.com', 'analytics.codebar.ch', $cdnHost ?: null, ]); @@ -62,8 +60,6 @@ public function configure(Policy $policy): void 'data:', 'res.cloudinary.com', 'www.gravatar.com', - 'cdn.usefathom.com', - 'cdn-eu.usefathom.com', ]); $fontSources = array_filter([ @@ -77,8 +73,6 @@ public function configure(Policy $policy): void $policy->add(Directive::OBJECT, Keyword::NONE); $policy->add(Directive::CONNECT, [ Keyword::SELF, - 'cdn.usefathom.com', - 'cdn-eu.usefathom.com', 'analytics.codebar.ch', ]); } diff --git a/config/default.php b/config/default.php index 0f024e8..72274c4 100644 --- a/config/default.php +++ b/config/default.php @@ -8,12 +8,6 @@ return [ 'services' => [ - 'fathom' => [ - 'site_id' => env('LARAVEL_DEFAULT_FATHOM_SITE_ID'), - 'environments' => [ - EnvironmentEnum::PRODUCTION->value, - ], - ], 'codebar_analytics' => [ 'url' => env('CODEBAR_ANALYTICS_URL'), 'environments' => [ diff --git a/lang/de_CH.json b/lang/de_CH.json index 4943df9..fe1e838 100644 --- a/lang/de_CH.json +++ b/lang/de_CH.json @@ -256,8 +256,8 @@ "Privacy contact heading": "Kontakt", "Privacy controller body": "Verantwortlich für die Datenbearbeitung auf dieser Website ist die codebar Solutions AG.", "Privacy controller heading": "Verantwortliche Stelle", - "Privacy data collected analytics": "Nutzungsstatistiken über Fathom Analytics (ohne Cookies, anonymisierte Seitenaufrufe; keine Personenprofile)", - "Privacy data collected errors": "Fehler- und Leistungsdaten an Flare zur Fehlerbehebung (serverseitig; sensible Header werden entfernt)", + "Privacy data collected analytics": "Nutzungsstatistiken über codebar Analytics (von codebar selbst betrieben auf analytics.codebar.ch, ohne Cookies, anonymisierte Seitenaufrufe; keine Personenprofile)", + "Privacy data collected errors": "Fehler- und Leistungsdaten an Laravel Nightwatch zur Fehlerbehebung (serverseitig; sensible Header werden entfernt)", "Privacy data collected heading": "Welche Daten wir erheben", "Privacy data collected intro": "Beim Besuch dieser Website verarbeiten wir folgende Datenkategorien:", "Privacy data collected logs": "Server-Logdaten (IP-Adresse, Datum und Uhrzeit des Zugriffs, Browsertyp, besuchte Seiten)", @@ -265,15 +265,15 @@ "Privacy last updated date": "28.08.2026", "Privacy page intro": "Wie die codebar Solutions AG Personendaten auf dieser Website gemäss Schweizer Datenschutzrecht bearbeitet.", "Privacy policy": "Datenschutzerklärung", + "Privacy processors analytics": "codebar Analytics – cookielose Website-Statistiken, von der codebar Solutions AG selbst betrieben (analytics.codebar.ch)", "Privacy processors body": "Wir setzen folgende Dienstleister ein, die Personendaten in unserem Auftrag verarbeiten können:", "Privacy processors cloudinary": "Cloudinary – Auslieferung von Bildern und Medien (Datenschutz: cloudinary.com/privacy)", - "Privacy processors fathom": "Fathom Analytics – datenschutzfreundliche Website-Statistiken (usefathom.com/privacy)", - "Privacy processors flare": "Flare – Fehlerüberwachung unserer Anwendung (flareapp.io/privacy)", "Privacy processors heading": "Auftragsbearbeiter", "Privacy processors hosting": "Laravel Cloud – Website-Hosting und Infrastruktur (laravel.com)", + "Privacy processors monitoring": "Laravel Nightwatch – Fehler- und Leistungsüberwachung unserer Anwendung (nightwatch.laravel.com)", "Privacy purpose body": "Wir verarbeiten diese Daten, um die Website zu betreiben und abzusichern, aggregierte Nutzungsmuster zu verstehen und technische Probleme zu beheben. Rechtsgrundlage ist unser berechtigtes Interesse an einem sicheren und funktionsfähigen Webangebot sowie gegebenenfalls die Vertragserfüllung.", "Privacy purpose heading": "Zweck und Rechtsgrundlage", - "Privacy retention analytics": "Analysedaten werden gemäss Richtlinie von Fathom aufbewahrt.", + "Privacy retention analytics": "Analysedaten speichern wir selbst auf analytics.codebar.ch; sie enthalten keine Personenprofile.", "Privacy retention errors": "Fehlermeldungen werden so lange aufbewahrt, wie zur Behebung erforderlich.", "Privacy retention heading": "Aufbewahrungsdauer", "Privacy retention logs": "Server-Logs werden bis zu 90 Tage aufbewahrt.", diff --git a/lang/en_CH.json b/lang/en_CH.json index 108a8f6..d588efa 100644 --- a/lang/en_CH.json +++ b/lang/en_CH.json @@ -252,8 +252,8 @@ "Privacy contact heading": "Contact", "Privacy controller body": "The controller responsible for data processing on this website is codebar Solutions AG.", "Privacy controller heading": "Controller", - "Privacy data collected analytics": "Usage analytics via Fathom Analytics (cookieless, anonymised page views; no personal profiles)", - "Privacy data collected errors": "Error and performance data sent to Flare for troubleshooting (server-side; sensitive headers are redacted)", + "Privacy data collected analytics": "Usage analytics via codebar Analytics (run by codebar itself on analytics.codebar.ch, cookieless, anonymised page views; no personal profiles)", + "Privacy data collected errors": "Error and performance data sent to Laravel Nightwatch for troubleshooting (server-side; sensitive headers are redacted)", "Privacy data collected heading": "Data we collect", "Privacy data collected intro": "When you visit this website, we process the following categories of data:", "Privacy data collected logs": "Server log data (IP address, date and time of access, browser type, pages visited)", @@ -261,15 +261,15 @@ "Privacy last updated date": "28 August 2026", "Privacy page intro": "How codebar Solutions AG collects and processes personal data on this website, under Swiss data protection law.", "Privacy policy": "Privacy policy", + "Privacy processors analytics": "codebar Analytics – cookieless website statistics, run by codebar Solutions AG itself (analytics.codebar.ch)", "Privacy processors body": "We use the following third-party services that may process personal data on our behalf:", "Privacy processors cloudinary": "Cloudinary – delivery of images and media assets (privacy policy: cloudinary.com/privacy)", - "Privacy processors fathom": "Fathom Analytics – privacy-friendly website statistics (usefathom.com/privacy)", - "Privacy processors flare": "Flare – error monitoring for our application (flareapp.io/privacy)", "Privacy processors heading": "Third-party processors", "Privacy processors hosting": "Laravel Cloud – website hosting and infrastructure (laravel.com)", + "Privacy processors monitoring": "Laravel Nightwatch – error and performance monitoring for our application (nightwatch.laravel.com)", "Privacy purpose body": "We process this data to operate and secure the website, to understand aggregate usage patterns, and to diagnose technical issues. The legal basis is our legitimate interest in providing a secure and functional website, and where applicable the performance of a contract.", "Privacy purpose heading": "Purpose and legal basis", - "Privacy retention analytics": "Analytics data is retained according to Fathom's policy.", + "Privacy retention analytics": "Analytics data is stored by us on analytics.codebar.ch and contains no personal profiles.", "Privacy retention errors": "Error reports are retained as long as necessary to resolve the issue.", "Privacy retention heading": "Retention", "Privacy retention logs": "Server logs are retained for up to 90 days.", diff --git a/resources/views/layouts/_partials/_fathom.blade.php b/resources/views/layouts/_partials/_fathom.blade.php deleted file mode 100644 index 9101be8..0000000 --- a/resources/views/layouts/_partials/_fathom.blade.php +++ /dev/null @@ -1,10 +0,0 @@ -@php - use Illuminate\Support\Arr; - $environments = config('default.services.fathom.environments', []); - $url = 'https://cdn.usefathom.com/script.js'; - $siteId = config('default.services.fathom.site_id'); -@endphp - -@if (in_array(app()->environment(), $environments) && $siteId) - -@endif diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 887bfff..9762db0 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -13,8 +13,6 @@ class="scroll-smooth" @endif - -