diff --git a/site/netlify.toml b/site/netlify.toml
index f015fce4..9c669ac7 100644
--- a/site/netlify.toml
+++ b/site/netlify.toml
@@ -3,6 +3,21 @@
publish = "site/dist"
ignore = "pnpm dlx turbo-ignore site --task=build --fallback=origin/main"
+# PostHog reverse proxy (ad-blocker bypass)
+[[redirects]]
+ from = "/ph/static/*"
+ to = "https://us-assets.i.posthog.com/static/:splat"
+ host = "us-assets.i.posthog.com"
+ status = 200
+ force = true
+
+[[redirects]]
+ from = "/ph/*"
+ to = "https://us.i.posthog.com/:splat"
+ host = "us.i.posthog.com"
+ status = 200
+ force = true
+
# Netlify aliases -> videojs.org
[[redirects]]
from = "https://videojs.com/*"
diff --git a/site/netlify/edge-functions/trailing-slash.ts b/site/netlify/edge-functions/trailing-slash.ts
index d2807552..08012ca6 100644
--- a/site/netlify/edge-functions/trailing-slash.ts
+++ b/site/netlify/edge-functions/trailing-slash.ts
@@ -2,6 +2,10 @@ import type { Config } from '@netlify/edge-functions';
export default async (request: Request) => {
const url = new URL(request.url);
+
+ // Skip PostHog proxy paths — handled by Netlify redirects
+ if (url.pathname.startsWith('/ph/')) return;
+
const redirectUrl = new URL(url.pathname.replace(/\/$/, ''), url.origin);
redirectUrl.search = url.search;
redirectUrl.hash = url.hash;
diff --git a/site/src/components/Posthog.astro b/site/src/components/Posthog.astro
new file mode 100644
index 00000000..e54d32a0
--- /dev/null
+++ b/site/src/components/Posthog.astro
@@ -0,0 +1,80 @@
+---
+/**
+ * PostHog analytics with cookieless server-side hashing.
+ * Idle-loaded to minimize impact on page performance.
+ *
+ * Requires "Cookieless server hash mode" enabled in PostHog project settings.
+ */
+---
+
+
+
+
+
diff --git a/site/src/content/pages/privacy.mdx b/site/src/content/pages/privacy.mdx
index e474a19d..7b9bf650 100644
--- a/site/src/content/pages/privacy.mdx
+++ b/site/src/content/pages/privacy.mdx
@@ -1,6 +1,6 @@
---
title: "Privacy Policy"
-description: "Last Updated March 9, 2026"
+description: "Last Updated March 11, 2026"
---
## Introduction
@@ -18,7 +18,7 @@ Like most websites, our web servers may automatically collect standard technical
This information is used solely for maintaining the website's functionality, security, and performance, as well as to understand how individuals are using the website. It is not used for tracking or profiling visitors across services or browsing sessions, or for advertising purposes.
-We may use Google Analytics to collect and process this information for the purposes identified above. We have configured Google Analytics to collect this information without the use of cookies. You can learn more about Google Analytics and its relevant processing of data in Google's "Safeguarding Your Data" Analytics Guide. You can learn about Google Analytics' currently available opt-outs, including the Google Analytics Browser Add-On here: https://tools.google.com/dlpage/gaoptout/.
+We may use PostHog to collect and process this information for the purposes identified above. We have configured PostHog to collect this information without the use of cookies. PostHog's cookieless mode uses server-side hashing to count unique visitors without storing any cookies, localStorage, or sessionStorage data on your device.
## Open Source and Development Platforms
diff --git a/site/src/layouts/Base.astro b/site/src/layouts/Base.astro
index ff3d50bd..1587aaf4 100644
--- a/site/src/layouts/Base.astro
+++ b/site/src/layouts/Base.astro
@@ -9,6 +9,7 @@ import '@/styles/globals.css';
import BannerInit from '@/components/BannerInit.astro';
import { PreferenceSync } from '@/components/docs/PreferenceSync';
import LegacyBanner from '@/components/LegacyBanner.astro';
+import Posthog from '@/components/Posthog.astro';
import ThemeInit from '@/components/ThemeInit.astro';
interface Props {
@@ -55,25 +56,8 @@ const fullTitle =
/>
- {/* Google Analytics (cookieless) */}
-
-
+ {/* Analytics (production only) */}
+ {import.meta.env.PROD && }
{/* Important stuff */}