diff --git a/frontend/__snapshots__/scenes-other-onboarding--onboarding-sd-ks--dark.png b/frontend/__snapshots__/scenes-other-onboarding--onboarding-sd-ks--dark.png
index 6b266dfc495d9..32ccc8f30f274 100644
Binary files a/frontend/__snapshots__/scenes-other-onboarding--onboarding-sd-ks--dark.png and b/frontend/__snapshots__/scenes-other-onboarding--onboarding-sd-ks--dark.png differ
diff --git a/frontend/__snapshots__/scenes-other-onboarding--onboarding-sd-ks--light.png b/frontend/__snapshots__/scenes-other-onboarding--onboarding-sd-ks--light.png
index 9ce6ff19c933f..8334bf0ed643c 100644
Binary files a/frontend/__snapshots__/scenes-other-onboarding--onboarding-sd-ks--light.png and b/frontend/__snapshots__/scenes-other-onboarding--onboarding-sd-ks--light.png differ
diff --git a/frontend/src/scenes/onboarding/sdks/allSDKs.tsx b/frontend/src/scenes/onboarding/sdks/allSDKs.tsx
index ab980c8d2e350..c9a6a88c5b3cc 100644
--- a/frontend/src/scenes/onboarding/sdks/allSDKs.tsx
+++ b/frontend/src/scenes/onboarding/sdks/allSDKs.tsx
@@ -19,6 +19,13 @@ export const allSDKs: SDK[] = [
image: require('./logos/html.svg'),
docsLink: 'https://posthog.com/docs/libraries/js',
},
+ {
+ name: 'Android',
+ key: SDKKey.ANDROID,
+ tags: [SDKTag.MOBILE],
+ image: require('./logos/android.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/android',
+ },
{
name: 'Angular',
key: SDKKey.ANGULAR,
@@ -27,42 +34,72 @@ export const allSDKs: SDK[] = [
docsLink: 'https://posthog.com/docs/libraries/angular',
},
{
- name: 'React',
- key: SDKKey.REACT,
- tags: [SDKTag.WEB, SDKTag.RECOMMENDED],
- recommended: true,
- image: require('./logos/react.svg'),
- docsLink: 'https://posthog.com/docs/libraries/react',
+ name: 'API',
+ key: SDKKey.API,
+ tags: [SDKTag.SERVER],
+ image: (
+
+
+
+ ),
+ docsLink: 'https://posthog.com/docs/api',
},
{
- name: 'Next.js',
- key: SDKKey.NEXT_JS,
+ name: 'Astro',
+ key: SDKKey.ASTRO,
tags: [SDKTag.WEB],
- image: require('./logos/nextjs.svg'),
- docsLink: 'https://posthog.com/docs/libraries/next-js',
+ image: require('./logos/astro.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/astro',
},
{
- name: 'Gatsby',
- key: SDKKey.GATSBY,
+ name: 'Bubble',
+ key: SDKKey.BUBBLE,
tags: [SDKTag.WEB],
- image: require('./logos/gatsby.svg'),
- docsLink: 'https://posthog.com/docs/libraries/gatsby',
+ image: require('./logos/bubble.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/bubble',
},
{
- name: 'Nuxt.js',
- key: SDKKey.NUXT_JS,
+ name: 'Django',
+ key: SDKKey.DJANGO,
+ tags: [SDKTag.SERVER],
+ image: require('./logos/django.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/django',
+ },
+ {
+ name: 'Elixir',
+ key: SDKKey.ELIXIR,
+ tags: [SDKTag.SERVER],
+ image: require('./logos/elixir.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/elixir',
+ },
+ {
+ name: 'Flutter',
+ key: SDKKey.FLUTTER,
+ tags: [SDKTag.MOBILE],
+ image: require('./logos/flutter.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/flutter',
+ },
+ {
+ name: 'Framer',
+ key: SDKKey.FRAMER,
tags: [SDKTag.WEB],
- image: require('./logos/nuxt.svg'),
- docsLink: 'https://posthog.com/docs/libraries/nuxt-js',
+ image: require('./logos/framer.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/framer',
},
{
- name: 'Vue.js',
- key: SDKKey.VUE_JS,
+ name: 'Gatsby',
+ key: SDKKey.GATSBY,
tags: [SDKTag.WEB],
- image: require('./logos/vue.svg'),
- docsLink: 'https://posthog.com/docs/libraries/vue-js',
+ image: require('./logos/gatsby.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/gatsby',
+ },
+ {
+ name: 'Go',
+ key: SDKKey.GO,
+ tags: [SDKTag.SERVER],
+ image: require('./logos/go.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/go',
},
- // Mobile
{
name: 'iOS',
key: SDKKey.IOS,
@@ -71,27 +108,26 @@ export const allSDKs: SDK[] = [
docsLink: 'https://posthog.com/docs/libraries/ios',
},
{
- name: 'Android',
- key: SDKKey.ANDROID,
- tags: [SDKTag.MOBILE],
- image: require('./logos/android.svg'),
- docsLink: 'https://posthog.com/docs/libraries/android',
+ name: 'Java',
+ key: SDKKey.JAVA,
+ tags: [SDKTag.SERVER],
+ image: require('./logos/java.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/java',
},
{
- name: 'React Native',
- key: SDKKey.REACT_NATIVE,
- tags: [SDKTag.MOBILE],
- image: require('./logos/react.svg'),
- docsLink: 'https://posthog.com/docs/libraries/react-native',
+ name: 'Laravel',
+ key: SDKKey.LARAVEL,
+ tags: [SDKTag.SERVER],
+ image: require('./logos/laravel.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/laravel',
},
{
- name: 'Flutter',
- key: SDKKey.FLUTTER,
- tags: [SDKTag.MOBILE],
- image: require('./logos/flutter.svg'),
- docsLink: 'https://posthog.com/docs/libraries/flutter',
+ name: 'Next.js',
+ key: SDKKey.NEXT_JS,
+ tags: [SDKTag.WEB],
+ image: require('./logos/nextjs.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/next-js',
},
- // Server
{
name: 'Node.js',
key: SDKKey.NODE_JS,
@@ -101,19 +137,11 @@ export const allSDKs: SDK[] = [
docsLink: 'https://posthog.com/docs/libraries/node',
},
{
- name: 'Python',
- key: SDKKey.PYTHON,
- tags: [SDKTag.SERVER, SDKTag.RECOMMENDED],
- recommended: true,
- image: require('./logos/python.svg'),
- docsLink: 'https://posthog.com/docs/libraries/python',
- },
- {
- name: 'Ruby',
- key: SDKKey.RUBY,
- tags: [SDKTag.SERVER],
- image: require('./logos/ruby.svg'),
- docsLink: 'https://posthog.com/docs/libraries/ruby',
+ name: 'Nuxt.js',
+ key: SDKKey.NUXT_JS,
+ tags: [SDKTag.WEB],
+ image: require('./logos/nuxt.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/nuxt-js',
},
{
name: 'PHP',
@@ -123,36 +151,41 @@ export const allSDKs: SDK[] = [
docsLink: 'https://posthog.com/docs/libraries/php',
},
{
- name: 'Go',
- key: SDKKey.GO,
- tags: [SDKTag.SERVER],
- image: require('./logos/go.svg'),
- docsLink: 'https://posthog.com/docs/libraries/go',
+ name: 'Python',
+ key: SDKKey.PYTHON,
+ tags: [SDKTag.SERVER, SDKTag.RECOMMENDED],
+ recommended: true,
+ image: require('./logos/python.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/python',
},
{
- name: 'Elixir',
- key: SDKKey.ELIXIR,
- tags: [SDKTag.SERVER],
- image: require('./logos/elixir.svg'),
- docsLink: 'https://posthog.com/docs/libraries/elixir',
+ name: 'React',
+ key: SDKKey.REACT,
+ tags: [SDKTag.WEB, SDKTag.RECOMMENDED],
+ recommended: true,
+ image: require('./logos/react.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/react',
},
{
- name: 'API',
- key: SDKKey.API,
- tags: [SDKTag.SERVER],
- image: (
-
-
-
- ),
- docsLink: 'https://posthog.com/docs/api',
+ name: 'React Native',
+ key: SDKKey.REACT_NATIVE,
+ tags: [SDKTag.MOBILE],
+ image: require('./logos/react.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/react-native',
},
{
- name: 'Java',
- key: SDKKey.JAVA,
+ name: 'Remix',
+ key: SDKKey.REMIX,
+ tags: [SDKTag.WEB],
+ image: require('./logos/remix.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/remix',
+ },
+ {
+ name: 'Ruby',
+ key: SDKKey.RUBY,
tags: [SDKTag.SERVER],
- image: require('./logos/java.svg'),
- docsLink: 'https://posthog.com/docs/libraries/java',
+ image: require('./logos/ruby.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/ruby',
},
{
name: 'Rust',
@@ -161,6 +194,27 @@ export const allSDKs: SDK[] = [
image: require('./logos/rust.svg'),
docsLink: 'https://posthog.com/docs/libraries/rust',
},
+ {
+ name: 'Svelte',
+ key: SDKKey.SVELTE,
+ tags: [SDKTag.WEB],
+ image: require('./logos/svelte.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/svelte',
+ },
+ {
+ name: 'Vue.js',
+ key: SDKKey.VUE_JS,
+ tags: [SDKTag.WEB],
+ image: require('./logos/vue.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/vue-js',
+ },
+ {
+ name: 'Webflow',
+ key: SDKKey.WEBFLOW,
+ tags: [SDKTag.WEB],
+ image: require('./logos/webflow.svg'),
+ docsLink: 'https://posthog.com/docs/libraries/webflow',
+ },
// integrations
{
name: 'Google Tag Manager',
diff --git a/frontend/src/scenes/onboarding/sdks/feature-flags/FeatureFlagsSDKInstructions.tsx b/frontend/src/scenes/onboarding/sdks/feature-flags/FeatureFlagsSDKInstructions.tsx
index 8d6247d513e7e..ab58f83895d72 100644
--- a/frontend/src/scenes/onboarding/sdks/feature-flags/FeatureFlagsSDKInstructions.tsx
+++ b/frontend/src/scenes/onboarding/sdks/feature-flags/FeatureFlagsSDKInstructions.tsx
@@ -4,17 +4,27 @@ import {
FeatureFlagsAndroidInstructions,
FeatureFlagsAngularInstructions,
FeatureFlagsAPIInstructions,
+ FeatureFlagsAstroInstructions,
+ FeatureFlagsBubbleInstructions,
+ FeatureFlagsDjangoInstructions,
FeatureFlagsFlutterInstructions,
+ FeatureFlagsFramerInstructions,
FeatureFlagsGoInstructions,
FeatureFlagsIOSInstructions,
FeatureFlagsJSWebInstructions,
+ FeatureFlagsLaravelInstructions,
FeatureFlagsNextJSInstructions,
FeatureFlagsNodeInstructions,
+ FeatureFlagsNuxtJSInstructions,
FeatureFlagsPHPInstructions,
FeatureFlagsPythonInstructions,
FeatureFlagsReactInstructions,
+ FeatureFlagsRemixJSInstructions,
FeatureFlagsRNInstructions,
FeatureFlagsRubyInstructions,
+ FeatureFlagsSvelteInstructions,
+ FeatureFlagsVueInstructions,
+ FeatureFlagsWebflowInstructions,
} from '.'
export const FeatureFlagsSDKInstructions: SDKInstructionsMap = {
@@ -22,15 +32,24 @@ export const FeatureFlagsSDKInstructions: SDKInstructionsMap = {
[SDKKey.ANGULAR]: FeatureFlagsAngularInstructions,
[SDKKey.ANDROID]: FeatureFlagsAndroidInstructions,
[SDKKey.API]: FeatureFlagsAPIInstructions,
+ [SDKKey.ASTRO]: FeatureFlagsAstroInstructions,
+ [SDKKey.BUBBLE]: FeatureFlagsBubbleInstructions,
+ [SDKKey.DJANGO]: FeatureFlagsDjangoInstructions,
[SDKKey.FLUTTER]: FeatureFlagsFlutterInstructions,
+ [SDKKey.FRAMER]: FeatureFlagsFramerInstructions,
[SDKKey.GO]: FeatureFlagsGoInstructions,
[SDKKey.IOS]: FeatureFlagsIOSInstructions,
+ [SDKKey.LARAVEL]: FeatureFlagsLaravelInstructions,
[SDKKey.NEXT_JS]: FeatureFlagsNextJSInstructions,
[SDKKey.NODE_JS]: FeatureFlagsNodeInstructions,
+ [SDKKey.NUXT_JS]: FeatureFlagsNuxtJSInstructions,
[SDKKey.PHP]: FeatureFlagsPHPInstructions,
[SDKKey.PYTHON]: FeatureFlagsPythonInstructions,
[SDKKey.REACT]: FeatureFlagsReactInstructions,
[SDKKey.REACT_NATIVE]: FeatureFlagsRNInstructions,
+ [SDKKey.REMIX]: FeatureFlagsRemixJSInstructions,
[SDKKey.RUBY]: FeatureFlagsRubyInstructions,
- // add rust, gatsby, nuxt, vue, svelte, and others here
+ [SDKKey.SVELTE]: FeatureFlagsSvelteInstructions,
+ [SDKKey.VUE_JS]: FeatureFlagsVueInstructions,
+ [SDKKey.WEBFLOW]: FeatureFlagsWebflowInstructions,
}
diff --git a/frontend/src/scenes/onboarding/sdks/feature-flags/astro.tsx b/frontend/src/scenes/onboarding/sdks/feature-flags/astro.tsx
new file mode 100644
index 0000000000000..faedfad4cb789
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/feature-flags/astro.tsx
@@ -0,0 +1,13 @@
+import { SDKKey } from '~/types'
+
+import { SDKInstallAstroInstructions } from '../sdk-install-instructions/astro'
+import { FlagImplementationSnippet } from './flagImplementationSnippet'
+
+export function FeatureFlagsAstroInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/feature-flags/bubble.tsx b/frontend/src/scenes/onboarding/sdks/feature-flags/bubble.tsx
new file mode 100644
index 0000000000000..d529ef3b5d6a6
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/feature-flags/bubble.tsx
@@ -0,0 +1,13 @@
+import { SDKKey } from '~/types'
+
+import { SDKInstallBubbleInstructions } from '../sdk-install-instructions/bubble'
+import { FlagImplementationSnippet } from './flagImplementationSnippet'
+
+export function FeatureFlagsBubbleInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/feature-flags/django.tsx b/frontend/src/scenes/onboarding/sdks/feature-flags/django.tsx
new file mode 100644
index 0000000000000..6f6e3043e9377
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/feature-flags/django.tsx
@@ -0,0 +1,13 @@
+import { SDKKey } from '~/types'
+
+import { SDKInstallDjangoInstructions } from '../sdk-install-instructions'
+import { FlagImplementationSnippet } from './flagImplementationSnippet'
+
+export function FeatureFlagsDjangoInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/feature-flags/framer.tsx b/frontend/src/scenes/onboarding/sdks/feature-flags/framer.tsx
new file mode 100644
index 0000000000000..0212ac657c8e1
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/feature-flags/framer.tsx
@@ -0,0 +1,13 @@
+import { SDKKey } from '~/types'
+
+import { SDKInstallFramerInstructions } from '../sdk-install-instructions/framer'
+import { FlagImplementationSnippet } from './flagImplementationSnippet'
+
+export function FeatureFlagsFramerInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/feature-flags/index.tsx b/frontend/src/scenes/onboarding/sdks/feature-flags/index.tsx
index 20ae0c2eefe0f..83d8dd502923b 100644
--- a/frontend/src/scenes/onboarding/sdks/feature-flags/index.tsx
+++ b/frontend/src/scenes/onboarding/sdks/feature-flags/index.tsx
@@ -1,14 +1,24 @@
export * from './android'
export * from './angular'
export * from './api'
+export * from './astro'
+export * from './bubble'
+export * from './django'
export * from './flutter'
+export * from './framer'
export * from './go'
export * from './ios'
export * from './js-web'
+export * from './laravel'
export * from './next-js'
export * from './nodejs'
+export * from './nuxt'
export * from './php'
export * from './python'
export * from './react'
export * from './react-native'
+export * from './remix'
export * from './ruby'
+export * from './svelte'
+export * from './vue'
+export * from './webflow'
diff --git a/frontend/src/scenes/onboarding/sdks/feature-flags/laravel.tsx b/frontend/src/scenes/onboarding/sdks/feature-flags/laravel.tsx
new file mode 100644
index 0000000000000..bc3b80d4417fd
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/feature-flags/laravel.tsx
@@ -0,0 +1,13 @@
+import { SDKKey } from '~/types'
+
+import { SDKInstallLaravelInstructions } from '../sdk-install-instructions'
+import { FlagImplementationSnippet } from './flagImplementationSnippet'
+
+export function FeatureFlagsLaravelInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/feature-flags/nuxt.tsx b/frontend/src/scenes/onboarding/sdks/feature-flags/nuxt.tsx
new file mode 100644
index 0000000000000..2d0854bd3011a
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/feature-flags/nuxt.tsx
@@ -0,0 +1,21 @@
+import { SDKKey } from '~/types'
+
+import { NodeInstallSnippet, NodeSetupSnippet } from '../sdk-install-instructions'
+import { SDKInstallNuxtJSInstructions } from '../sdk-install-instructions/nuxt'
+import { FlagImplementationSnippet } from './flagImplementationSnippet'
+
+export function FeatureFlagsNuxtJSInstructions(): JSX.Element {
+ return (
+ <>
+
+
Client-side rendering
+
+ Server-side rendering
+ Install
+
+ Configure
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/feature-flags/remix.tsx b/frontend/src/scenes/onboarding/sdks/feature-flags/remix.tsx
new file mode 100644
index 0000000000000..3ed90cab39edc
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/feature-flags/remix.tsx
@@ -0,0 +1,21 @@
+import { SDKKey } from '~/types'
+
+import { NodeInstallSnippet, NodeSetupSnippet } from '../sdk-install-instructions'
+import { SDKInstallRemixJSInstructions } from '../sdk-install-instructions/remix'
+import { FlagImplementationSnippet } from './flagImplementationSnippet'
+
+export function FeatureFlagsRemixJSInstructions(): JSX.Element {
+ return (
+ <>
+
+ Client-side rendering
+
+ Server-side rendering
+ Install
+
+ Configure
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/feature-flags/svelte.tsx b/frontend/src/scenes/onboarding/sdks/feature-flags/svelte.tsx
new file mode 100644
index 0000000000000..74349718ac517
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/feature-flags/svelte.tsx
@@ -0,0 +1,21 @@
+import { SDKKey } from '~/types'
+
+import { NodeInstallSnippet, NodeSetupSnippet } from '../sdk-install-instructions'
+import { SDKInstallSvelteJSInstructions } from '../sdk-install-instructions/svelte'
+import { FlagImplementationSnippet } from './flagImplementationSnippet'
+
+export function FeatureFlagsSvelteInstructions(): JSX.Element {
+ return (
+ <>
+
+ Client-side rendering
+
+ Server-side rendering
+ Install
+
+ Configure
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/feature-flags/vue.tsx b/frontend/src/scenes/onboarding/sdks/feature-flags/vue.tsx
new file mode 100644
index 0000000000000..eec3c3d13f093
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/feature-flags/vue.tsx
@@ -0,0 +1,13 @@
+import { SDKKey } from '~/types'
+
+import { SDKInstallVueInstructions } from '../sdk-install-instructions/vue'
+import { FlagImplementationSnippet } from './flagImplementationSnippet'
+
+export function FeatureFlagsVueInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/feature-flags/webflow.tsx b/frontend/src/scenes/onboarding/sdks/feature-flags/webflow.tsx
new file mode 100644
index 0000000000000..3f4cbf0c157a7
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/feature-flags/webflow.tsx
@@ -0,0 +1,13 @@
+import { SDKKey } from '~/types'
+
+import { SDKInstallWebflowInstructions } from '../sdk-install-instructions/webflow'
+import { FlagImplementationSnippet } from './flagImplementationSnippet'
+
+export function FeatureFlagsWebflowInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/product-analytics/ProductAnalyticsSDKInstructions.tsx b/frontend/src/scenes/onboarding/sdks/product-analytics/ProductAnalyticsSDKInstructions.tsx
index 8bb54b4ff6225..d435dc8bfa3ad 100644
--- a/frontend/src/scenes/onboarding/sdks/product-analytics/ProductAnalyticsSDKInstructions.tsx
+++ b/frontend/src/scenes/onboarding/sdks/product-analytics/ProductAnalyticsSDKInstructions.tsx
@@ -6,16 +6,26 @@ import {
ProductAnalyticsAndroidInstructions,
ProductAnalyticsAngularInstructions,
ProductAnalyticsAPIInstructions,
+ ProductAnalyticsAstroInstructions,
+ ProductAnalyticsBubbleInstructions,
+ ProductAnalyticsDjangoInstructions,
ProductAnalyticsElixirInstructions,
ProductAnalyticsFlutterInstructions,
+ ProductAnalyticsFramerInstructions,
ProductAnalyticsGoInstructions,
ProductAnalyticsIOSInstructions,
+ ProductAnalyticsLaravelInstructions,
ProductAnalyticsNextJSInstructions,
ProductAnalyticsNodeInstructions,
+ ProductAnalyticsNuxtJSInstructions,
ProductAnalyticsPHPInstructions,
ProductAnalyticsPythonInstructions,
+ ProductAnalyticsRemixJSInstructions,
ProductAnalyticsRNInstructions,
ProductAnalyticsRubyInstructions,
+ ProductAnalyticsSvelteJSInstructions,
+ ProductAnalyticsVueInstructions,
+ ProductAnalyticsWebflowInstructions,
} from '.'
export const ProductAnalyticsSDKInstructions: SDKInstructionsMap = {
@@ -23,15 +33,25 @@ export const ProductAnalyticsSDKInstructions: SDKInstructionsMap = {
[SDKKey.ANDROID]: ProductAnalyticsAndroidInstructions,
[SDKKey.ANGULAR]: ProductAnalyticsAngularInstructions,
[SDKKey.API]: ProductAnalyticsAPIInstructions,
+ [SDKKey.ASTRO]: ProductAnalyticsAstroInstructions,
+ [SDKKey.BUBBLE]: ProductAnalyticsBubbleInstructions,
+ [SDKKey.DJANGO]: ProductAnalyticsDjangoInstructions,
[SDKKey.ELIXIR]: ProductAnalyticsElixirInstructions,
[SDKKey.FLUTTER]: ProductAnalyticsFlutterInstructions,
+ [SDKKey.FRAMER]: ProductAnalyticsFramerInstructions,
[SDKKey.GO]: ProductAnalyticsGoInstructions,
[SDKKey.HTML_SNIPPET]: HTMLSnippetInstructions,
[SDKKey.IOS]: ProductAnalyticsIOSInstructions,
+ [SDKKey.LARAVEL]: ProductAnalyticsLaravelInstructions,
[SDKKey.NEXT_JS]: ProductAnalyticsNextJSInstructions,
[SDKKey.NODE_JS]: ProductAnalyticsNodeInstructions,
+ [SDKKey.NUXT_JS]: ProductAnalyticsNuxtJSInstructions,
[SDKKey.PHP]: ProductAnalyticsPHPInstructions,
[SDKKey.PYTHON]: ProductAnalyticsPythonInstructions,
[SDKKey.REACT_NATIVE]: ProductAnalyticsRNInstructions,
- [SDKKey.RUBY]: ProductAnalyticsRubyInstructions,
+ [SDKKey.REMIX]: ProductAnalyticsRemixJSInstructions,
+ [SDKKey.RUBY]: ProductAnalyticsRubyInstructions,
+ [SDKKey.SVELTE]: ProductAnalyticsSvelteJSInstructions,
+ [SDKKey.VUE_JS]: ProductAnalyticsVueInstructions,
+ [SDKKey.WEBFLOW]: ProductAnalyticsWebflowInstructions,
}
diff --git a/frontend/src/scenes/onboarding/sdks/product-analytics/astro.tsx b/frontend/src/scenes/onboarding/sdks/product-analytics/astro.tsx
new file mode 100644
index 0000000000000..c2b4bbd2316c1
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/product-analytics/astro.tsx
@@ -0,0 +1,11 @@
+import { SDKInstallAstroInstructions } from '../sdk-install-instructions/astro'
+import { ProductAnalyticsAllJSFinalSteps } from './AllJSFinalSteps'
+
+export function ProductAnalyticsAstroInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/product-analytics/bubble.tsx b/frontend/src/scenes/onboarding/sdks/product-analytics/bubble.tsx
new file mode 100644
index 0000000000000..b55883bdcb27b
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/product-analytics/bubble.tsx
@@ -0,0 +1,11 @@
+import { SDKInstallBubbleInstructions } from '../sdk-install-instructions/bubble'
+import { ProductAnalyticsAllJSFinalSteps } from './AllJSFinalSteps'
+
+export function ProductAnalyticsBubbleInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/product-analytics/django.tsx b/frontend/src/scenes/onboarding/sdks/product-analytics/django.tsx
new file mode 100644
index 0000000000000..8729c42c514a1
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/product-analytics/django.tsx
@@ -0,0 +1,21 @@
+import { CodeSnippet, Language } from 'lib/components/CodeSnippet'
+
+import { SDKInstallDjangoInstructions } from '../sdk-install-instructions'
+
+function DjangoCaptureSnippet(): JSX.Element {
+ return (
+ {`import posthog
+
+posthog.capture('test-id', 'test-event')`}
+ )
+}
+
+export function ProductAnalyticsDjangoInstructions(): JSX.Element {
+ return (
+ <>
+
+ Send an Event
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/product-analytics/framer.tsx b/frontend/src/scenes/onboarding/sdks/product-analytics/framer.tsx
new file mode 100644
index 0000000000000..9b9a46b0988f0
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/product-analytics/framer.tsx
@@ -0,0 +1,11 @@
+import { SDKInstallFramerInstructions } from '../sdk-install-instructions/framer'
+import { ProductAnalyticsAllJSFinalSteps } from './AllJSFinalSteps'
+
+export function ProductAnalyticsFramerInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/product-analytics/index.tsx b/frontend/src/scenes/onboarding/sdks/product-analytics/index.tsx
index 119fcf40fa905..bf5c8678d04a1 100644
--- a/frontend/src/scenes/onboarding/sdks/product-analytics/index.tsx
+++ b/frontend/src/scenes/onboarding/sdks/product-analytics/index.tsx
@@ -1,15 +1,25 @@
export * from './android'
export * from './angular'
export * from './api'
+export * from './astro'
+export * from './bubble'
+export * from './django'
export * from './elixir'
export * from './flutter'
+export * from './framer'
export * from './go'
export * from './html-snippet'
export * from './ios'
export * from './js-web'
+export * from './laravel'
export * from './next-js'
export * from './nodejs'
+export * from './nuxt'
export * from './php'
export * from './python'
export * from './react-native'
+export * from './remix'
export * from './ruby'
+export * from './svelte'
+export * from './vue'
+export * from './webflow'
diff --git a/frontend/src/scenes/onboarding/sdks/product-analytics/laravel.tsx b/frontend/src/scenes/onboarding/sdks/product-analytics/laravel.tsx
new file mode 100644
index 0000000000000..c8bca7f9a2397
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/product-analytics/laravel.tsx
@@ -0,0 +1,21 @@
+import { CodeSnippet, Language } from 'lib/components/CodeSnippet'
+
+import { SDKInstallLaravelInstructions } from '../sdk-install-instructions'
+
+function LaravelCaptureSnippet(): JSX.Element {
+ return (
+
+ {"PostHog::capture(array(\n 'distinctId' => 'test-user',\n 'event' => 'test-event'\n));"}
+
+ )
+}
+
+export function ProductAnalyticsLaravelInstructions(): JSX.Element {
+ return (
+ <>
+
+ Send an Event
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/product-analytics/nuxt.tsx b/frontend/src/scenes/onboarding/sdks/product-analytics/nuxt.tsx
new file mode 100644
index 0000000000000..c2ddf2f83d817
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/product-analytics/nuxt.tsx
@@ -0,0 +1,11 @@
+import { SDKInstallNuxtJSInstructions } from '../sdk-install-instructions/nuxt'
+import { ProductAnalyticsAllJSFinalSteps } from './AllJSFinalSteps'
+
+export function ProductAnalyticsNuxtJSInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/product-analytics/remix.tsx b/frontend/src/scenes/onboarding/sdks/product-analytics/remix.tsx
new file mode 100644
index 0000000000000..ff093e84de046
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/product-analytics/remix.tsx
@@ -0,0 +1,11 @@
+import { SDKInstallRemixJSInstructions } from '../sdk-install-instructions/remix'
+import { ProductAnalyticsAllJSFinalSteps } from './AllJSFinalSteps'
+
+export function ProductAnalyticsRemixJSInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/product-analytics/svelte.tsx b/frontend/src/scenes/onboarding/sdks/product-analytics/svelte.tsx
new file mode 100644
index 0000000000000..8c60a6e20ee6a
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/product-analytics/svelte.tsx
@@ -0,0 +1,11 @@
+import { SDKInstallSvelteJSInstructions } from '../sdk-install-instructions/svelte'
+import { ProductAnalyticsAllJSFinalSteps } from './AllJSFinalSteps'
+
+export function ProductAnalyticsSvelteJSInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/product-analytics/vue.tsx b/frontend/src/scenes/onboarding/sdks/product-analytics/vue.tsx
new file mode 100644
index 0000000000000..f4646bb7867c2
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/product-analytics/vue.tsx
@@ -0,0 +1,11 @@
+import { SDKInstallVueInstructions } from '../sdk-install-instructions/vue'
+import { ProductAnalyticsAllJSFinalSteps } from './AllJSFinalSteps'
+
+export function ProductAnalyticsVueInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/product-analytics/webflow.tsx b/frontend/src/scenes/onboarding/sdks/product-analytics/webflow.tsx
new file mode 100644
index 0000000000000..3edc373793c54
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/product-analytics/webflow.tsx
@@ -0,0 +1,11 @@
+import { SDKInstallWebflowInstructions } from '../sdk-install-instructions/webflow'
+import { ProductAnalyticsAllJSFinalSteps } from './AllJSFinalSteps'
+
+export function ProductAnalyticsWebflowInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/astro.tsx b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/astro.tsx
new file mode 100644
index 0000000000000..1eb2b020e6d52
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/astro.tsx
@@ -0,0 +1,46 @@
+import { useValues } from 'kea'
+import { CodeSnippet, Language } from 'lib/components/CodeSnippet'
+import { apiHostOrigin } from 'lib/utils/apiHost'
+import { teamLogic } from 'scenes/teamLogic'
+
+function CreatePostHogAstroFileSnippet(): JSX.Element {
+ return (
+
+ {`cd ./src/components
+# or 'cd ./src && mkdir components && cd ./components' if your components folder doesn't exist
+touch posthog.astro`}
+
+ )
+}
+
+function AstroSetupSnippet(): JSX.Element {
+ const { currentTeam } = useValues(teamLogic)
+ return (
+ <>
+
+ {`---
+
+---
+
+`}
+
+ >
+ )
+}
+
+export function SDKInstallAstroInstructions(): JSX.Element {
+ return (
+ <>
+ Install the PostHog web snippet
+
+ In your src/components
folder, create a posthog.astro
file:
+
+
+ In this file, add your PostHog web snippet:
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/bubble.tsx b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/bubble.tsx
new file mode 100644
index 0000000000000..69c218d5a109c
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/bubble.tsx
@@ -0,0 +1,24 @@
+import { JSSnippet } from 'lib/components/JSSnippet'
+
+export function SDKInstallBubbleInstructions(): JSX.Element {
+ return (
+ <>
+ Install the PostHog web snippet
+ First copy your web snippet:
+
+
+ Go to your Bubble site settings by clicking on the icon in the left-hand menu. If you haven’t already,
+ sign up for at least the Starter site plan. This enables you to add custom code. Then:
+
+
+
+ Go to the SEO / metatags tab in site settings.
+
+
+ Paste your PostHog snippet in the Script/meta tags in header section.
+
+ Deploy your site to live.
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/django.tsx b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/django.tsx
new file mode 100644
index 0000000000000..aee7182c84c6a
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/django.tsx
@@ -0,0 +1,55 @@
+import { useValues } from 'kea'
+import { CodeSnippet, Language } from 'lib/components/CodeSnippet'
+import { apiHostOrigin } from 'lib/utils/apiHost'
+import { teamLogic } from 'scenes/teamLogic'
+
+function DjangoInstallSnippet(): JSX.Element {
+ return pip install posthog
+}
+
+function DjangoAppConfigSnippet(): JSX.Element {
+ const { currentTeam } = useValues(teamLogic)
+
+ return (
+
+ {`from django.apps import AppConfig
+import posthog
+
+class YourAppConfig(AppConfig):
+ name = "your_app_name"
+ def ready(self):
+ posthog.api_key = '${currentTeam?.api_token}'
+ posthog.host = '${apiHostOrigin()}'`}
+
+ )
+}
+
+function DjangoSettingsSnippet(): JSX.Element {
+ return (
+
+ {`INSTALLED_APPS = [
+ # other apps
+ 'your_app_name.apps.MyAppConfig', # Add your app config
+] `}
+
+ )
+}
+
+export function SDKInstallDjangoInstructions(): JSX.Element {
+ return (
+ <>
+ Install
+
+ Configure
+
+ Set the PostHog API key and host in your AppConfig
in apps.py
so that's it's
+ available everywhere:
+
+
+
+ Next, if you haven't done so already, make sure you add your AppConfig
to your{' '}
+ settings.py
under INSTALLED_APPS
:
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/framer.tsx b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/framer.tsx
new file mode 100644
index 0000000000000..3208cd09cd1ab
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/framer.tsx
@@ -0,0 +1,32 @@
+import { JSSnippet } from 'lib/components/JSSnippet'
+
+export function SDKInstallFramerInstructions(): JSX.Element {
+ return (
+ <>
+ Install the PostHog web snippet
+ First copy your web snippet:
+
+
+ Then go to your Framer project settings by clicking the gear in the top right. If you haven’t already,
+ sign up for at least the Mini site plan. This enables you to add custom code. Then:
+
+
+
+ Go to the General tab in site settings.
+
+
+ Scroll down to the Custom Code section.
+
+
+ {' '}
+ Under{' '}
+
+ End of <head>
tag
+
+ , paste your PostHog snippet.
+
+ Press save, and then publish your site.
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/index.tsx b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/index.tsx
index 5618d2f4ae886..45ffdf34a9919 100644
--- a/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/index.tsx
+++ b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/index.tsx
@@ -1,12 +1,22 @@
export * from './android'
export * from './angular'
+export * from './astro'
+export * from './bubble'
+export * from './django'
export * from './elixir'
export * from './flutter'
+export * from './framer'
export * from './go'
export * from './ios'
export * from './js-web'
+export * from './laravel'
export * from './nodejs'
+export * from './nuxt'
export * from './php'
export * from './python'
export * from './react-native'
+export * from './remix'
export * from './ruby'
+export * from './svelte'
+export * from './vue'
+export * from './webflow'
diff --git a/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/laravel.tsx b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/laravel.tsx
new file mode 100644
index 0000000000000..55ff388d95ad5
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/laravel.tsx
@@ -0,0 +1,51 @@
+import { useValues } from 'kea'
+import { CodeSnippet, Language } from 'lib/components/CodeSnippet'
+import { apiHostOrigin } from 'lib/utils/apiHost'
+import { teamLogic } from 'scenes/teamLogic'
+
+function LaravelConfigSnippet(): JSX.Element {
+ return composer require posthog/posthog-php
+}
+
+function LaravelInstallSnippet(): JSX.Element {
+ const { currentTeam } = useValues(teamLogic)
+
+ return (
+
+ {` '${apiHostOrigin()}'
+ ]
+ );
+ }
+}
+`}
+
+ )
+}
+
+export function SDKInstallLaravelInstructions(): JSX.Element {
+ return (
+ <>
+ Dependency Setup
+
+ Configure
+
+ Initialize PostHog in the boot
method of app/Providers/AppServiceProvider.php
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/nuxt.tsx b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/nuxt.tsx
new file mode 100644
index 0000000000000..188fe24cd517d
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/nuxt.tsx
@@ -0,0 +1,87 @@
+import { useValues } from 'kea'
+import { CodeSnippet, Language } from 'lib/components/CodeSnippet'
+import { Link } from 'lib/lemon-ui/Link'
+import { apiHostOrigin } from 'lib/utils/apiHost'
+import { teamLogic } from 'scenes/teamLogic'
+
+import { JSInstallSnippet } from './js-web'
+
+function NuxtEnvVarsSnippet(): JSX.Element {
+ const { currentTeam } = useValues(teamLogic)
+
+ return (
+
+ {`export default defineNuxtConfig({
+ runtimeConfig: {
+ public: {
+ posthogPublicKey: '${currentTeam?.api_token}',
+ posthogHost: '${apiHostOrigin()}'
+ }
+ }
+ })`}
+
+ )
+}
+
+function NuxtAppClientCodeSnippet(): JSX.Element {
+ return (
+
+ {`import { defineNuxtPlugin } from '#app'
+import posthog from 'posthog-js'
+export default defineNuxtPlugin(nuxtApp => {
+ const runtimeConfig = useRuntimeConfig();
+ const posthogClient = posthog.init(runtimeConfig.public.posthogPublicKey, {
+ api_host: runtimeConfig.public.posthogHost',
+ capture_pageview: false, // we add manual pageview capturing below
+ loaded: (posthog) => {
+ if (import.meta.env.MODE === 'development') posthog.debug();
+ }
+ })
+
+ // Make sure that pageviews are captured with each route change
+ const router = useRouter();
+ router.afterEach((to) => {
+ nextTick(() => {
+ posthog.capture('$pageview', {
+ current_url: to.fullPath
+ });
+ });
+ });
+
+ return {
+ provide: {
+ posthog: () => posthogClient
+ }
+ }
+})`}
+
+ )
+}
+
+export function SDKInstallNuxtJSInstructions(): JSX.Element {
+ return (
+ <>
+
+ The below guide is for Nuxt v3.0 and above. For Nuxt v2.16 and below, see our{' '}
+ Nuxt docs
+
+ Install posthog-js using your package manager
+
+ Add environment variables
+
+ Add your PostHog API key and host to your nuxt.config.js
file.
+
+
+
+ Create a plugin
+
+ Create a new plugin by creating a new file posthog.client.js
in your{' '}
+
+ plugins directory
+
+ :
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/remix.tsx b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/remix.tsx
new file mode 100644
index 0000000000000..9f2aaf5565e2a
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/remix.tsx
@@ -0,0 +1,54 @@
+import { useValues } from 'kea'
+import { CodeSnippet, Language } from 'lib/components/CodeSnippet'
+import { apiHostOrigin } from 'lib/utils/apiHost'
+import { teamLogic } from 'scenes/teamLogic'
+
+import { JSInstallSnippet } from './js-web'
+
+function RemixAppClientCodeSnippet(): JSX.Element {
+ const { currentTeam } = useValues(teamLogic)
+
+ return (
+
+ {`import { RemixBrowser } from "@remix-run/react";
+import { startTransition, StrictMode, useEffect } from "react";
+import { hydrateRoot } from "react-dom/client";
+import posthog from "posthog-js";
+
+function PosthogInit() {
+ useEffect(() => {
+ posthog.init('${currentTeam?.api_token}', {
+ api_host: '${apiHostOrigin()}',
+ });
+ }, []);
+
+ return null;
+}
+
+startTransition(() => {
+ hydrateRoot(
+ document,
+
+
+
+
+ );
+});`}
+
+ )
+}
+
+export function SDKInstallRemixJSInstructions(): JSX.Element {
+ return (
+ <>
+ Install posthog-js using your package manager
+
+
+ Initialize
+
+ Go to your app/entry.client.tsx
file and initialize PostHog as a component:
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/svelte.tsx b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/svelte.tsx
new file mode 100644
index 0000000000000..141de4ab8acc3
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/svelte.tsx
@@ -0,0 +1,49 @@
+import { Link } from '@posthog/lemon-ui'
+import { useValues } from 'kea'
+import { CodeSnippet, Language } from 'lib/components/CodeSnippet'
+import { apiHostOrigin } from 'lib/utils/apiHost'
+import { teamLogic } from 'scenes/teamLogic'
+
+import { JSInstallSnippet } from './js-web'
+
+function SvelteAppClientCodeSnippet(): JSX.Element {
+ const { currentTeam } = useValues(teamLogic)
+
+ return (
+
+ {`import posthog from 'posthog-js'
+import { browser } from '$app/environment';
+
+export const load = async () => {
+
+ if (browser) {
+ posthog.init(
+ '${currentTeam?.api_token}',
+ { api_host: "${apiHostOrigin()}" }
+ )
+ }
+ return
+};`}
+
+ )
+}
+
+export function SDKInstallSvelteJSInstructions(): JSX.Element {
+ return (
+ <>
+ Install posthog-js using your package manager
+
+
+ Initialize
+
+ If you haven't created a root{' '}
+
+ layout
+ {' '}
+ already, create a new file called +layout.js
in your src/routes
folder. In
+ this file, check the environment is the browser, and initialize PostHog if so:
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/vue.tsx b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/vue.tsx
new file mode 100644
index 0000000000000..9bd3eb224ec10
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/vue.tsx
@@ -0,0 +1,78 @@
+import { useValues } from 'kea'
+import { CodeSnippet, Language } from 'lib/components/CodeSnippet'
+import { Link } from 'lib/lemon-ui/Link'
+import { apiHostOrigin } from 'lib/utils/apiHost'
+import { teamLogic } from 'scenes/teamLogic'
+
+import { JSInstallSnippet } from './js-web'
+
+function VueCreatePluginsFileSnippet(): JSX.Element {
+ return (
+
+ {`mkdir plugins #skip if you already have one
+cd plugins
+touch posthog.js`}
+
+ )
+}
+
+function VuePluginsCodeSnippet(): JSX.Element {
+ const { currentTeam } = useValues(teamLogic)
+
+ return (
+
+ {`//./plugins/posthog.js
+import posthog from "posthog-js";
+
+export default {
+ install(app) {
+ app.config.globalProperties.$posthog = posthog.init(
+ '${currentTeam?.api_token}',
+ {
+ api_host: '${apiHostOrigin()}',
+ }
+ );
+ },
+};`}
+
+ )
+}
+
+function VueActivatePluginSnippet(): JSX.Element {
+ return (
+
+ {`//main.js
+import { createApp } from 'vue'
+import App from './App.vue'
+import posthogPlugin from "./plugins/posthog"; //import the plugin.
+
+const app = createApp(App);
+
+app.use(posthogPlugin); //install the plugin
+app.mount('#app')`}
+
+ )
+}
+
+export function SDKInstallVueInstructions(): JSX.Element {
+ return (
+ <>
+
+ The below guide is for integrating using plugins in Vue versions 3 and above. For integrating PostHog
+ using Provide/inject, Vue.prototype, or versions 2.7 and below, see our{' '}
+ Vue docs
+
+ Install posthog-js using your package manager
+
+ Create a plugin
+
+ Create a new file posthog.js
in your plugins directory:
+
+
+ Add the following code to posthog.js
:
+
+ Activate your plugin
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/webflow.tsx b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/webflow.tsx
new file mode 100644
index 0000000000000..c0f45d721f6b1
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/sdk-install-instructions/webflow.tsx
@@ -0,0 +1,24 @@
+import { JSSnippet } from 'lib/components/JSSnippet'
+
+export function SDKInstallWebflowInstructions(): JSX.Element {
+ return (
+ <>
+ Install the PostHog web snippet
+ First copy your web snippet:
+
+
+ Go to your Webflow site settings by clicking on the menu icon in the top left. If you haven’t already,
+ sign up for at least the Basic site plan. This enables you to add custom code. Then:
+
+
+
+ Go to the Custom code tab in site settings.
+
+
+ In the Head code section, paste your PostHog snippet and press save.
+
+ Publish your site.
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/session-replay/SessionReplaySDKInstructions.tsx b/frontend/src/scenes/onboarding/sdks/session-replay/SessionReplaySDKInstructions.tsx
index f5ccdac98ac8b..b8fc50a5bd38a 100644
--- a/frontend/src/scenes/onboarding/sdks/session-replay/SessionReplaySDKInstructions.tsx
+++ b/frontend/src/scenes/onboarding/sdks/session-replay/SessionReplaySDKInstructions.tsx
@@ -1,11 +1,33 @@
import { SDKInstructionsMap, SDKKey } from '~/types'
-import { HTMLSnippetInstructions, JSWebInstructions, NextJSInstructions, ReactInstructions, AngularInstructions } from '.'
+import {
+ AngularInstructions,
+ AstroInstructions,
+ BubbleInstructions,
+ FramerInstructions,
+ HTMLSnippetInstructions,
+ JSWebInstructions,
+ NextJSInstructions,
+ NuxtJSInstructions,
+ ReactInstructions,
+ RemixInstructions,
+ SvelteInstructions,
+ VueInstructions,
+ WebflowInstructions,
+} from '.'
export const SessionReplaySDKInstructions: SDKInstructionsMap = {
[SDKKey.JS_WEB]: JSWebInstructions,
[SDKKey.HTML_SNIPPET]: HTMLSnippetInstructions,
[SDKKey.ANGULAR]: AngularInstructions,
+ [SDKKey.ASTRO]: AstroInstructions,
+ [SDKKey.BUBBLE]: BubbleInstructions,
+ [SDKKey.FRAMER]: FramerInstructions,
[SDKKey.NEXT_JS]: NextJSInstructions,
+ [SDKKey.NUXT_JS]: NuxtJSInstructions,
[SDKKey.REACT]: ReactInstructions,
+ [SDKKey.REMIX]: RemixInstructions,
+ [SDKKey.SVELTE]: SvelteInstructions,
+ [SDKKey.VUE_JS]: VueInstructions,
+ [SDKKey.WEBFLOW]: WebflowInstructions,
}
diff --git a/frontend/src/scenes/onboarding/sdks/session-replay/astro.tsx b/frontend/src/scenes/onboarding/sdks/session-replay/astro.tsx
new file mode 100644
index 0000000000000..a9a01c411e2b0
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/session-replay/astro.tsx
@@ -0,0 +1,11 @@
+import { SDKInstallAstroInstructions } from '../sdk-install-instructions'
+import { SessionReplayFinalSteps } from '../shared-snippets'
+
+export function AstroInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/session-replay/bubble.tsx b/frontend/src/scenes/onboarding/sdks/session-replay/bubble.tsx
new file mode 100644
index 0000000000000..6351f47914401
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/session-replay/bubble.tsx
@@ -0,0 +1,11 @@
+import { SDKInstallBubbleInstructions } from '../sdk-install-instructions'
+import { SessionReplayFinalSteps } from '../shared-snippets'
+
+export function BubbleInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/session-replay/framer.tsx b/frontend/src/scenes/onboarding/sdks/session-replay/framer.tsx
new file mode 100644
index 0000000000000..cf242fc975ed0
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/session-replay/framer.tsx
@@ -0,0 +1,11 @@
+import { SDKInstallFramerInstructions } from '../sdk-install-instructions'
+import { SessionReplayFinalSteps } from '../shared-snippets'
+
+export function FramerInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/session-replay/index.tsx b/frontend/src/scenes/onboarding/sdks/session-replay/index.tsx
index 5b9ed08b8ce33..a1fbaef355a9c 100644
--- a/frontend/src/scenes/onboarding/sdks/session-replay/index.tsx
+++ b/frontend/src/scenes/onboarding/sdks/session-replay/index.tsx
@@ -1,5 +1,13 @@
export * from './angular'
+export * from './astro'
+export * from './bubble'
+export * from './framer'
export * from './html-snippet'
export * from './js-web'
export * from './next-js'
+export * from './nuxt'
export * from './react'
+export * from './remix'
+export * from './svelte'
+export * from './vue'
+export * from './webflow'
diff --git a/frontend/src/scenes/onboarding/sdks/session-replay/nuxt.tsx b/frontend/src/scenes/onboarding/sdks/session-replay/nuxt.tsx
new file mode 100644
index 0000000000000..0be9db5e22aa9
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/session-replay/nuxt.tsx
@@ -0,0 +1,11 @@
+import { SDKInstallNuxtJSInstructions } from '../sdk-install-instructions/nuxt'
+import { SessionReplayFinalSteps } from '../shared-snippets'
+
+export function NuxtJSInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/session-replay/remix.tsx b/frontend/src/scenes/onboarding/sdks/session-replay/remix.tsx
new file mode 100644
index 0000000000000..b8d2c95f21358
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/session-replay/remix.tsx
@@ -0,0 +1,11 @@
+import { SDKInstallRemixJSInstructions } from '../sdk-install-instructions/remix'
+import { SessionReplayFinalSteps } from '../shared-snippets'
+
+export function RemixInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/session-replay/svelte.tsx b/frontend/src/scenes/onboarding/sdks/session-replay/svelte.tsx
new file mode 100644
index 0000000000000..5908939d2ba18
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/session-replay/svelte.tsx
@@ -0,0 +1,11 @@
+import { SDKInstallSvelteJSInstructions } from '../sdk-install-instructions/svelte'
+import { SessionReplayFinalSteps } from '../shared-snippets'
+
+export function SvelteInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/session-replay/vue.tsx b/frontend/src/scenes/onboarding/sdks/session-replay/vue.tsx
new file mode 100644
index 0000000000000..3e783a11ba9fb
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/session-replay/vue.tsx
@@ -0,0 +1,11 @@
+import { SDKInstallVueInstructions } from '../sdk-install-instructions'
+import { SessionReplayFinalSteps } from '../shared-snippets'
+
+export function VueInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/session-replay/webflow.tsx b/frontend/src/scenes/onboarding/sdks/session-replay/webflow.tsx
new file mode 100644
index 0000000000000..081182e59adf3
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/session-replay/webflow.tsx
@@ -0,0 +1,11 @@
+import { SDKInstallWebflowInstructions } from '../sdk-install-instructions'
+import { SessionReplayFinalSteps } from '../shared-snippets'
+
+export function WebflowInstructions(): JSX.Element {
+ return (
+ <>
+
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/surveys/SurveysSDKInstructions.tsx b/frontend/src/scenes/onboarding/sdks/surveys/SurveysSDKInstructions.tsx
index 67f4b8c3f59d7..c0ee501fc6fe7 100644
--- a/frontend/src/scenes/onboarding/sdks/surveys/SurveysSDKInstructions.tsx
+++ b/frontend/src/scenes/onboarding/sdks/surveys/SurveysSDKInstructions.tsx
@@ -2,16 +2,32 @@ import { SDKInstructionsMap, SDKKey } from '~/types'
import {
AngularInstructions,
+ AstroInstructions,
+ BubbleInstructions,
+ FramerInstructions,
HTMLSnippetInstructions,
JSWebInstructions,
NextJSInstructions,
+ NuxtJSInstructions,
ReactInstructions,
+ RemixInstructions,
+ SvelteInstructions,
+ VueInstructions,
+ WebflowInstructions,
} from '.'
export const SurveysSDKInstructions: SDKInstructionsMap = {
[SDKKey.JS_WEB]: JSWebInstructions,
[SDKKey.HTML_SNIPPET]: HTMLSnippetInstructions,
[SDKKey.ANGULAR]: AngularInstructions,
+ [SDKKey.ASTRO]: AstroInstructions,
+ [SDKKey.BUBBLE]: BubbleInstructions,
+ [SDKKey.FRAMER]: FramerInstructions,
[SDKKey.NEXT_JS]: NextJSInstructions,
+ [SDKKey.NUXT_JS]: NuxtJSInstructions,
[SDKKey.REACT]: ReactInstructions,
+ [SDKKey.REMIX]: RemixInstructions,
+ [SDKKey.SVELTE]: SvelteInstructions,
+ [SDKKey.VUE_JS]: VueInstructions,
+ [SDKKey.WEBFLOW]: WebflowInstructions,
}
diff --git a/frontend/src/scenes/onboarding/sdks/surveys/astro.tsx b/frontend/src/scenes/onboarding/sdks/surveys/astro.tsx
new file mode 100644
index 0000000000000..7984a762ee433
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/surveys/astro.tsx
@@ -0,0 +1,9 @@
+import { SDKInstallAstroInstructions } from '../sdk-install-instructions/astro'
+
+export function AstroInstructions(): JSX.Element {
+ return (
+ <>
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/surveys/bubble.tsx b/frontend/src/scenes/onboarding/sdks/surveys/bubble.tsx
new file mode 100644
index 0000000000000..1fcc159344c6b
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/surveys/bubble.tsx
@@ -0,0 +1,9 @@
+import { SDKInstallBubbleInstructions } from '../sdk-install-instructions/bubble'
+
+export function BubbleInstructions(): JSX.Element {
+ return (
+ <>
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/surveys/framer.tsx b/frontend/src/scenes/onboarding/sdks/surveys/framer.tsx
new file mode 100644
index 0000000000000..90acbfc4773ae
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/surveys/framer.tsx
@@ -0,0 +1,9 @@
+import { SDKInstallFramerInstructions } from '../sdk-install-instructions/framer'
+
+export function FramerInstructions(): JSX.Element {
+ return (
+ <>
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/surveys/index.tsx b/frontend/src/scenes/onboarding/sdks/surveys/index.tsx
index 5b9ed08b8ce33..a1fbaef355a9c 100644
--- a/frontend/src/scenes/onboarding/sdks/surveys/index.tsx
+++ b/frontend/src/scenes/onboarding/sdks/surveys/index.tsx
@@ -1,5 +1,13 @@
export * from './angular'
+export * from './astro'
+export * from './bubble'
+export * from './framer'
export * from './html-snippet'
export * from './js-web'
export * from './next-js'
+export * from './nuxt'
export * from './react'
+export * from './remix'
+export * from './svelte'
+export * from './vue'
+export * from './webflow'
diff --git a/frontend/src/scenes/onboarding/sdks/surveys/nuxt.tsx b/frontend/src/scenes/onboarding/sdks/surveys/nuxt.tsx
new file mode 100644
index 0000000000000..ceddb9c49744d
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/surveys/nuxt.tsx
@@ -0,0 +1,9 @@
+import { SDKInstallNuxtJSInstructions } from '../sdk-install-instructions/nuxt'
+
+export function NuxtJSInstructions(): JSX.Element {
+ return (
+ <>
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/surveys/remix.tsx b/frontend/src/scenes/onboarding/sdks/surveys/remix.tsx
new file mode 100644
index 0000000000000..1a6f96abae481
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/surveys/remix.tsx
@@ -0,0 +1,9 @@
+import { SDKInstallRemixJSInstructions } from '../sdk-install-instructions/remix'
+
+export function RemixInstructions(): JSX.Element {
+ return (
+ <>
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/surveys/svelte.tsx b/frontend/src/scenes/onboarding/sdks/surveys/svelte.tsx
new file mode 100644
index 0000000000000..3faf6bbbd394f
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/surveys/svelte.tsx
@@ -0,0 +1,9 @@
+import { SDKInstallSvelteJSInstructions } from '../sdk-install-instructions/svelte'
+
+export function SvelteInstructions(): JSX.Element {
+ return (
+ <>
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/surveys/vue.tsx b/frontend/src/scenes/onboarding/sdks/surveys/vue.tsx
new file mode 100644
index 0000000000000..1714535074989
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/surveys/vue.tsx
@@ -0,0 +1,9 @@
+import { SDKInstallVueInstructions } from '../sdk-install-instructions/vue'
+
+export function VueInstructions(): JSX.Element {
+ return (
+ <>
+
+ >
+ )
+}
diff --git a/frontend/src/scenes/onboarding/sdks/surveys/webflow.tsx b/frontend/src/scenes/onboarding/sdks/surveys/webflow.tsx
new file mode 100644
index 0000000000000..d7431d7b7d307
--- /dev/null
+++ b/frontend/src/scenes/onboarding/sdks/surveys/webflow.tsx
@@ -0,0 +1,9 @@
+import { SDKInstallWebflowInstructions } from '../sdk-install-instructions/webflow'
+
+export function WebflowInstructions(): JSX.Element {
+ return (
+ <>
+
+ >
+ )
+}
diff --git a/frontend/src/types.ts b/frontend/src/types.ts
index 4e2b03eb3e89b..00ad4a8cdbfe7 100644
--- a/frontend/src/types.ts
+++ b/frontend/src/types.ts
@@ -3741,9 +3741,13 @@ export type SDK = {
export enum SDKKey {
ANDROID = 'android',
ANGULAR = 'angular',
+ ASTRO = 'astro',
API = 'api',
+ BUBBLE = 'bubble',
+ DJANGO = 'django',
DOCUSAURUS = 'docusaurus',
ELIXIR = 'elixir',
+ FRAMER = 'framer',
FLUTTER = 'flutter',
GATSBY = 'gatsby',
GO = 'go',
@@ -3752,6 +3756,7 @@ export enum SDKKey {
IOS = 'ios',
JAVA = 'java',
JS_WEB = 'javascript_web',
+ LARAVEL = 'laravel',
NEXT_JS = 'nextjs',
NODE_JS = 'nodejs',
NUXT_JS = 'nuxtjs',
@@ -3759,6 +3764,7 @@ export enum SDKKey {
PYTHON = 'python',
REACT = 'react',
REACT_NATIVE = 'react_native',
+ REMIX = 'remix',
RETOOL = 'retool',
RUBY = 'ruby',
RUDDERSTACK = 'rudderstack',
@@ -3766,7 +3772,9 @@ export enum SDKKey {
SEGMENT = 'segment',
SENTRY = 'sentry',
SHOPIFY = 'shopify',
+ SVELTE = 'svelte',
VUE_JS = 'vuejs',
+ WEBFLOW = 'webflow',
WORDPRESS = 'wordpress',
}