diff --git a/apps/web/package.json b/apps/web/package.json
index b9dd0649..81f8a2fc 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -42,6 +42,7 @@
"next-runtime-env": "^1.7.2",
"nextjs-cors": "^2.2.0",
"pino": "^9.6.0",
+ "posthog-js": "^1.254.0",
"react": "catalog:react18",
"react-beautiful-dnd": "^13.1.1",
"react-contenteditable": "^3.3.7",
diff --git a/apps/web/src/env.ts b/apps/web/src/env.ts
index dee7f7ca..194b99c3 100644
--- a/apps/web/src/env.ts
+++ b/apps/web/src/env.ts
@@ -79,6 +79,8 @@ export const env = createEnv({
client: {
NEXT_PUBLIC_KAN_ENV: z.string().optional(),
NEXT_PUBLIC_UMAMI_ID: z.string().optional(),
+ NEXT_PUBLIC_POSTHOG_KEY: z.string().optional(),
+ NEXT_PUBLIC_POSTHOG_HOST: z.string().optional(),
NEXT_PUBLIC_BASE_URL: z.string().url(),
NEXT_PUBLIC_STORAGE_URL: z.string().url().optional(),
NEXT_PUBLIC_AVATAR_BUCKET_NAME: z.string().optional(),
@@ -105,6 +107,8 @@ export const env = createEnv({
NEXT_PUBLIC_KAN_ENV: process.env.NEXT_PUBLIC_KAN_ENV,
NODE_ENV: process.env.NODE_ENV,
NEXT_PUBLIC_UMAMI_ID: process.env.NEXT_PUBLIC_UMAMI_ID,
+ NEXT_PUBLIC_POSTHOG_KEY: process.env.NEXT_PUBLIC_POSTHOG_KEY,
+ NEXT_PUBLIC_POSTHOG_HOST: process.env.NEXT_PUBLIC_POSTHOG_HOST,
NEXT_PUBLIC_BASE_URL: process.env.NEXT_PUBLIC_BASE_URL,
NEXT_PUBLIC_STORAGE_URL: process.env.NEXT_PUBLIC_STORAGE_URL,
NEXT_PUBLIC_AVATAR_BUCKET_NAME: process.env.NEXT_PUBLIC_AVATAR_BUCKET_NAME,
diff --git a/apps/web/src/pages/_app.tsx b/apps/web/src/pages/_app.tsx
index 480a955b..058ba624 100644
--- a/apps/web/src/pages/_app.tsx
+++ b/apps/web/src/pages/_app.tsx
@@ -2,7 +2,11 @@ import "~/styles/globals.css";
import type { AppType } from "next/app";
import { Plus_Jakarta_Sans } from "next/font/google";
+import Script from "next/script";
import { env } from "next-runtime-env";
+import posthog from "posthog-js";
+import { PostHogProvider } from "posthog-js/react";
+import { useEffect } from "react";
import { ModalProvider } from "~/providers/modal";
import { PopupProvider } from "~/providers/popup";
@@ -21,6 +25,21 @@ export const metadata = {
};
const MyApp: AppType = ({ Component, pageProps }) => {
+ const posthogKey = env("NEXT_PUBLIC_POSTHOG_KEY");
+
+ useEffect(() => {
+ if (posthogKey) {
+ posthog.init(posthogKey, {
+ api_host: env("NEXT_PUBLIC_POSTHOG_HOST"),
+ person_profiles: "identified_only",
+ defaults: "2025-05-24",
+ loaded: (posthog) => {
+ if (process.env.NODE_ENV === "development") posthog.debug();
+ },
+ });
+ }
+ }, [posthogKey]);
+
return (
<>
{env("NEXT_PUBLIC_UMAMI_ID") && (
-