From 88874c2ab10e67d840a1edc9fb7c184d8e870320 Mon Sep 17 00:00:00 2001 From: PunGrumpy <108584943+PunGrumpy@users.noreply.github.com> Date: Sat, 25 Jul 2026 18:04:47 +0700 Subject: [PATCH 1/2] feat(web): add Databuddy analytics provider Mounts the Databuddy React SDK in the root layout with automatic tracking (interactions, outgoing links, web vitals, errors, data-track attributes), disabled in development. Co-Authored-By: Claude Fable 5 --- apps/web/app/layout.tsx | 6 +++++- apps/web/components/providers/analytics.tsx | 18 ++++++++++++++++++ apps/web/package.json | 2 ++ bun.lock | 8 ++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 apps/web/components/providers/analytics.tsx diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index 870396c..705066f 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -2,6 +2,7 @@ import "./globals.css"; import type { Metadata } from "next"; import type { ReactNode } from "react"; +import { Analytics } from "@/components/providers/analytics"; import { DesignSystemProvider } from "@/components/providers/client"; import { fonts } from "@/lib/fonts"; import { url } from "@/lib/url"; @@ -42,7 +43,10 @@ interface RootLayoutProps { const RootLayout = ({ children }: RootLayoutProps) => ( - {children} + + {children} + + ); diff --git a/apps/web/components/providers/analytics.tsx b/apps/web/components/providers/analytics.tsx new file mode 100644 index 0000000..0d842f8 --- /dev/null +++ b/apps/web/components/providers/analytics.tsx @@ -0,0 +1,18 @@ +import { DatabuddyDevtools } from "@databuddy/devtools/react"; +import { Databuddy } from "@databuddy/sdk/react"; + +export const Analytics = () => ( + <> + + + +); diff --git a/apps/web/package.json b/apps/web/package.json index 79bbf21..5a2a3e4 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -13,6 +13,7 @@ }, "dependencies": { "@base-ui/react": "^1.6.0", + "@databuddy/sdk": "^2.6.0", "cnfast": "^0.0.8", "date-fns": "^4.4.0", "fumadocs-core": "^16.12.1", @@ -28,6 +29,7 @@ "tw-animate-css": "^1.4.0" }, "devDependencies": { + "@databuddy/devtools": "^0.0.1-beta.0", "@tailwindcss/postcss": "^4.3.2", "@types/mdx": "^2.0.14", "@types/node": "^26", diff --git a/bun.lock b/bun.lock index 3bca9e1..352cc07 100644 --- a/bun.lock +++ b/bun.lock @@ -20,6 +20,7 @@ "version": "0.1.0", "dependencies": { "@base-ui/react": "^1.6.0", + "@databuddy/sdk": "^2.6.0", "cnfast": "^0.0.8", "date-fns": "^4.4.0", "fumadocs-core": "^16.12.1", @@ -35,6 +36,7 @@ "tw-animate-css": "^1.4.0", }, "devDependencies": { + "@databuddy/devtools": "^0.0.1-beta.0", "@tailwindcss/postcss": "^4.3.2", "@types/mdx": "^2.0.14", "@types/node": "^26", @@ -215,6 +217,10 @@ "@clack/prompts": ["@clack/prompts@1.7.0", "", { "dependencies": { "@clack/core": "1.4.3", "fast-string-width": "^3.0.2", "fast-wrap-ansi": "^0.2.0", "sisteransi": "^1.0.5" } }, "sha512-y7/yvZ2TPAnR9+jnc00klvNNLkJiXFFrQA/hlLCcxA9a2A4zQIOimyFQ9XfwYKiGD1fb5GY8vbKIIgO8d5Tb2A=="], + "@databuddy/devtools": ["@databuddy/devtools@0.0.1-beta.0", "", { "dependencies": { "preact": "^10.29.1" }, "peerDependencies": { "react": ">=18", "vue": "^3" }, "optionalPeers": ["react", "vue"] }, "sha512-m9cvlTsOosb3Uby8toorfc+gOis/fUAW6ff98U6j5+J+xSDWfhkcozKHmXqT3ZENx1ON5OqTw2kwbJNLZ0WDaQ=="], + + "@databuddy/sdk": ["@databuddy/sdk@2.6.0", "", { "peerDependencies": { "react": ">=18", "vue": ">=3" }, "optionalPeers": ["react", "vue"] }, "sha512-coQVa/AJoesgsFSGWPFtlrl7xZx1nTTvoX3A9YLD+9f3+JDwr3ajVog3WOiLBJSLqk7xC+G+FnR/W/Wda5eWbw=="], + "@docker-doctor/cli": ["@docker-doctor/cli@workspace:packages/docker-doctor"], "@docker-doctor/core": ["@docker-doctor/core@workspace:packages/core"], @@ -1815,6 +1821,8 @@ "powershell-utils": ["powershell-utils@0.1.0", "", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="], + "preact": ["preact@10.29.7", "", { "peerDependencies": { "preact-render-to-string": ">=5" }, "optionalPeers": ["preact-render-to-string"] }, "sha512-DCHYrK/B10yUD3ZjLfhZ3WIE/9Vf9VFUODcRE2dRomTYDpJk6z6L9wecSfhfE6M9ZTHUdyQkoC46arIDhEV84Q=="], + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], "prettier": ["prettier@3.8.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg=="], From 1035b3c63285812b61587bca16af5498a89a7822 Mon Sep 17 00:00:00 2001 From: PunGrumpy <108584943+PunGrumpy@users.noreply.github.com> Date: Sat, 25 Jul 2026 18:05:15 +0700 Subject: [PATCH 2/2] feat(web): track key CTAs via Databuddy data-track attributes Named events for the actions that matter: install_command_copied on the homepage installer, docs_code_copied on docs code blocks, and share_clicked (with a channel property) on the share card buttons. Outgoing links are already covered by trackOutgoingLinks. Co-Authored-By: Claude Fable 5 --- apps/web/components/mdx/elements.tsx | 1 + apps/web/components/sections/installer.tsx | 1 + apps/web/components/sections/share/card.tsx | 24 +++++++++++++++++---- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/apps/web/components/mdx/elements.tsx b/apps/web/components/mdx/elements.tsx index 8f74a32..4a2c389 100644 --- a/apps/web/components/mdx/elements.tsx +++ b/apps/web/components/mdx/elements.tsx @@ -129,6 +129,7 @@ export const Pre = ({ diff --git a/apps/web/components/sections/installer.tsx b/apps/web/components/sections/installer.tsx index 2c3cde3..ebd4b36 100644 --- a/apps/web/components/sections/installer.tsx +++ b/apps/web/components/sections/installer.tsx @@ -15,6 +15,7 @@ export const Installer = () => ( ( interface ShareButtonProps { children: ReactNode; + channel: string; href?: string; onClick?: () => void; } @@ -43,10 +44,17 @@ const useOrigin = () => () => "" ); -const ShareButton = ({ href, onClick, children }: ShareButtonProps) => { +const ShareButton = ({ + channel, + href, + onClick, + children, +}: ShareButtonProps) => { if (href) { return ( { } return (