From a54df524c761b9b715fff637f0db9dedefd0b091 Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Sun, 4 Oct 2026 12:17:42 +0200 Subject: [PATCH] feat(analytics): record pageviews server-side only Umami never received data: the client-side path (browser beacon to /stats/api/send) has been dead in production. Pageviews are now classified and recorded entirely on the server in the request proxy; no tracking script ships to the browser anymore. - Pure domain decision (decidePageview) filters real page views from assets, infrastructure paths, prefetches and bot user agents - Pure payload builder maps facts onto the Umami send contract as an unnamed event, with the client identity travelling in headers - proxy.ts wires request facts into the domain and fires the send without delaying the response; configured via UMAMI_WEBSITE_ID and UMAMI_API_ENDPOINT - Removes the dead client analytics stack (components, adapters, /stats proxy route) and its layout mount --- apps/web/app/(site)/layout.tsx | 2 - apps/web/app/(site)/stats/api/send/route.ts | 77 --------- apps/web/proxy.ts | 55 +++++++ .../src/analytics/recordPageviewToUmami.ts | 36 +++++ apps/web/src/components/Analytics.tsx | 147 ------------------ .../analytics/ScrollDepthTracker.tsx | 70 --------- .../components/analytics/analytics-events.ts | 44 ------ .../src/components/analytics/useAnalytics.ts | 40 ----- .../components/analytics/useSafePathname.ts | 24 --- apps/web/src/domain/pageview-decision.spec.ts | 138 ++++++++++++++++ apps/web/src/domain/pageview-decision.ts | 104 +++++++++++++ apps/web/src/domain/umami-payload.spec.ts | 49 ++++++ apps/web/src/domain/umami-payload.ts | 35 +++++ apps/web/src/utils/analytics/index.ts | 137 ---------------- apps/web/src/utils/analytics/interfaces.ts | 22 --- .../src/utils/analytics/plausible-adapter.ts | 42 ----- apps/web/src/utils/analytics/umami-adapter.ts | 78 ---------- .../utils/error-tracking/glitchtip-adapter.ts | 48 ------ apps/web/src/utils/error-tracking/index.ts | 61 -------- .../src/utils/error-tracking/interfaces.ts | 29 ---- 20 files changed, 417 insertions(+), 821 deletions(-) delete mode 100644 apps/web/app/(site)/stats/api/send/route.ts create mode 100644 apps/web/proxy.ts create mode 100644 apps/web/src/analytics/recordPageviewToUmami.ts delete mode 100644 apps/web/src/components/Analytics.tsx delete mode 100644 apps/web/src/components/analytics/ScrollDepthTracker.tsx delete mode 100644 apps/web/src/components/analytics/analytics-events.ts delete mode 100644 apps/web/src/components/analytics/useAnalytics.ts delete mode 100644 apps/web/src/components/analytics/useSafePathname.ts create mode 100644 apps/web/src/domain/pageview-decision.spec.ts create mode 100644 apps/web/src/domain/pageview-decision.ts create mode 100644 apps/web/src/domain/umami-payload.spec.ts create mode 100644 apps/web/src/domain/umami-payload.ts delete mode 100644 apps/web/src/utils/analytics/index.ts delete mode 100644 apps/web/src/utils/analytics/interfaces.ts delete mode 100644 apps/web/src/utils/analytics/plausible-adapter.ts delete mode 100644 apps/web/src/utils/analytics/umami-adapter.ts delete mode 100644 apps/web/src/utils/error-tracking/glitchtip-adapter.ts delete mode 100644 apps/web/src/utils/error-tracking/index.ts delete mode 100644 apps/web/src/utils/error-tracking/interfaces.ts diff --git a/apps/web/app/(site)/layout.tsx b/apps/web/app/(site)/layout.tsx index 3ff5e85..88fb17a 100644 --- a/apps/web/app/(site)/layout.tsx +++ b/apps/web/app/(site)/layout.tsx @@ -1,6 +1,5 @@ import type { Metadata } from "next"; import { Inter, JetBrains_Mono, Newsreader } from "next/font/google"; -import { Analytics } from "@/src/components/Analytics"; import { BitBurst } from "@/src/components/bits/BitBurst"; import { Footer } from "@/src/components/Footer"; import { Header } from "@/src/components/Header"; @@ -72,7 +71,6 @@ export default function RootLayout({