diff --git a/app/integrations/[slug]/page.tsx b/app/integrations/[slug]/page.tsx new file mode 100644 index 0000000..f9ce901 --- /dev/null +++ b/app/integrations/[slug]/page.tsx @@ -0,0 +1,111 @@ +/** + * @file Dynamic route for individual integration guide pages. + * + * Handles all 50 integration routes via [slug]. + * Exports generateStaticParams for static generation and + * generateMetadata for per-page SEO (title, description, OG, JSON-LD). + */ + +import type { Metadata } from 'next' +import { notFound } from 'next/navigation' +import { integrations, getIntegration } from '@/lib/integrations' +import { getGuideContent } from '@/lib/integration-guides' +import { IntegrationGuide } from '@/components/IntegrationGuide' + +// * ─── Static Params ─────────────────────────────────────────────── +export function generateStaticParams() { + return integrations.map((i) => ({ slug: i.id })) +} + +// * ─── SEO Metadata ──────────────────────────────────────────────── +interface PageProps { + params: Promise<{ slug: string }> +} + +export async function generateMetadata({ params }: PageProps): Promise { + const { slug } = await params + const integration = getIntegration(slug) + if (!integration) return {} + + const title = `How to Add Pulse Analytics to ${integration.name} | Pulse by Ciphera` + const description = integration.seoDescription + const url = `https://pulse.ciphera.net/integrations/${integration.id}` + + return { + title, + description, + keywords: [ + `${integration.name} analytics`, + `${integration.name} Pulse`, + 'privacy-first analytics', + 'website analytics', + 'Ciphera Pulse', + integration.name, + ], + alternates: { canonical: url }, + openGraph: { + title, + description, + url, + siteName: 'Pulse by Ciphera', + type: 'article', + }, + twitter: { + card: 'summary', + title, + description, + }, + } +} + +// * ─── Page Component ────────────────────────────────────────────── +export default async function IntegrationPage({ params }: PageProps) { + const { slug } = await params + const integration = getIntegration(slug) + if (!integration) return notFound() + + const content = getGuideContent(slug) + if (!content) return notFound() + + // * HowTo JSON-LD for rich search snippets + const jsonLd = { + '@context': 'https://schema.org', + '@type': 'HowTo', + name: `How to Add Pulse Analytics to ${integration.name}`, + description: integration.seoDescription, + step: [ + { + '@type': 'HowToStep', + name: `Open your ${integration.name} project`, + text: `Navigate to your ${integration.name} project and locate the file where you manage the HTML head or layout.`, + }, + { + '@type': 'HowToStep', + name: 'Add the Pulse tracking script', + text: 'Insert the Pulse analytics script tag with your data-domain attribute into the head section of your page.', + }, + { + '@type': 'HowToStep', + name: 'Deploy and verify', + text: 'Deploy your changes and visit your Pulse dashboard to verify that page views are being recorded.', + }, + ], + tool: { + '@type': 'HowToTool', + name: 'Pulse by Ciphera', + url: 'https://pulse.ciphera.net', + }, + } + + return ( + <> + - - My React App - - -
- -`} - - - - -

Method 2: Programmatic Injection

-

- If you need to load the script dynamically (e.g., only in production), you can use a useEffect hook in your main App component. -

- -
-
- src/App.tsx -
-
-
-{`import { useEffect } from 'react'
-
-function App() {
-  useEffect(() => {
-    // Only load in production
-    if (process.env.NODE_ENV === 'production') {
-      const script = document.createElement('script')
-      script.defer = true
-      script.setAttribute('data-domain', 'your-site.com')
-      script.src = 'https://pulse.ciphera.net/script.js'
-      document.head.appendChild(script)
-    }
-  }, [])
-
-  return (
-    
-

Hello World

-
- ) -}`} -
-
-
- - - - ) -} diff --git a/app/integrations/vue/page.tsx b/app/integrations/vue/page.tsx deleted file mode 100644 index f5bd66e..0000000 --- a/app/integrations/vue/page.tsx +++ /dev/null @@ -1,113 +0,0 @@ -'use client' - -import Link from 'next/link' -import { ArrowLeftIcon } from '@ciphera-net/ui' - -export default function VueIntegrationPage() { - return ( -
- {/* * --- ATMOSPHERE (Background) --- */} -
-
-
-
-
- -
- - - Back to Integrations - - -
-
- - - - -
-

- Vue.js Integration -

-
- -
-

- Integrating Pulse with Vue.js is straightforward. You can add the script to your index.html file. -

- -
- -

Method 1: index.html (Recommended)

-

- Add the script tag to the <head> section of your index.html file. This works for both Vue 2 and Vue 3 projects created with Vue CLI or Vite. -

- -
-
- index.html -
-
-
-{`
-
-  
-    
-    
-    
-    
-    
-    
-    My Vue App
-  
-  
-    
- - -`} -
-
-
- -

Method 2: Nuxt.js

-

- For Nuxt.js applications, you should add the script to your nuxt.config.js or nuxt.config.ts file. -

- -
-
- nuxt.config.ts -
-
-
-{`export default defineNuxtConfig({
-  app: {
-    head: {
-      script: [
-        {
-          src: 'https://pulse.ciphera.net/script.js',
-          defer: true,
-          'data-domain': 'your-site.com'
-        }
-      ]
-    }
-  }
-})`}
-              
-
-
-
-
-
- ) -} diff --git a/app/integrations/wordpress/page.tsx b/app/integrations/wordpress/page.tsx deleted file mode 100644 index 873a2cf..0000000 --- a/app/integrations/wordpress/page.tsx +++ /dev/null @@ -1,81 +0,0 @@ -'use client' - -import Link from 'next/link' -import { ArrowLeftIcon } from '@ciphera-net/ui' - -export default function WordPressIntegrationPage() { - return ( -
- {/* * --- ATMOSPHERE (Background) --- */} -
-
-
-
-
- -
- - - Back to Integrations - - -
-
- - - -
-

- WordPress Integration -

-
- -
-

- You can add Pulse to your WordPress site without installing any heavy plugins, or by using a simple code snippet plugin. -

- -
- -

Method 1: Using a Plugin (Easiest)

-
    -
  1. Install a plugin like "Insert Headers and Footers" (WPCode).
  2. -
  3. Go to the plugin settings and find the "Scripts in Header" section.
  4. -
  5. Paste the following code snippet:
  6. -
- -
-
- Header Script -
-
-
-{``}
-              
-
-
- -

Method 2: Edit Theme Files (Advanced)

-

- If you are comfortable editing your theme files, you can add the script directly to your header.php file. -

-
    -
  1. Go to Appearance > Theme File Editor.
  2. -
  3. Select header.php from the right sidebar.
  4. -
  5. Paste the script tag just before the closing </head> tag.
  6. -
-
-
-
- ) -} diff --git a/components/CodeBlock.tsx b/components/CodeBlock.tsx new file mode 100644 index 0000000..8379a41 --- /dev/null +++ b/components/CodeBlock.tsx @@ -0,0 +1,28 @@ +/** + * @file Reusable code block component for integration guide pages. + * + * Renders a VS-Code-style code block with a filename tab header. + */ + +interface CodeBlockProps { + /** Filename displayed in the tab header */ + filename: string + /** The code string to render inside the block */ + children: string +} + +/** + * Renders a dark-themed code snippet with a filename tab. + */ +export function CodeBlock({ filename, children }: CodeBlockProps) { + return ( +
+
+ {filename} +
+
+
{children}
+
+
+ ) +} diff --git a/components/IntegrationGuide.tsx b/components/IntegrationGuide.tsx new file mode 100644 index 0000000..e78c408 --- /dev/null +++ b/components/IntegrationGuide.tsx @@ -0,0 +1,105 @@ +/** + * @file Shared layout component for individual integration guide pages. + * + * Provides the background atmosphere, back-link, header (logo + title), + * prose-styled content area, and a related integrations section. + */ + +import Link from 'next/link' +import { ArrowLeftIcon, ArrowRightIcon } from '@ciphera-net/ui' +import { type ReactNode } from 'react' +import { type Integration, getIntegration } from '@/lib/integrations' + +interface IntegrationGuideProps { + /** Integration metadata (name, icon, etc.) */ + integration: Integration + /** Guide content rendered inside the prose area */ + children: ReactNode +} + +/** + * Renders the full-page layout for a single integration guide, + * including related integrations at the bottom. + */ +export function IntegrationGuide({ integration, children }: IntegrationGuideProps) { + // * Scale the icon up for the detail-page header (w-10 h-10) + const headerIcon = ( +
+ {integration.icon} +
+ ) + + // * Resolve related integrations from IDs + const relatedIntegrations = integration.relatedIds + .map((id) => getIntegration(id)) + .filter((i): i is Integration => i !== undefined) + .slice(0, 4) + + return ( +
+ {/* * --- ATMOSPHERE (Background) --- */} +
+
+
+
+
+ +
+ + + Back to Integrations + + +
+
+ {headerIcon} +
+

+ {integration.name} Integration +

+
+ +
+ {children} +
+ + {/* * --- Related Integrations --- */} + {relatedIntegrations.length > 0 && ( +
+

+ Related Integrations +

+
+ {relatedIntegrations.map((related) => ( + +
+ {related.icon} +
+
+ + {related.name} + + + {related.description} + +
+ + + ))} +
+
+ )} +
+
+ ) +} diff --git a/lib/integration-guides.tsx b/lib/integration-guides.tsx new file mode 100644 index 0000000..43dba84 --- /dev/null +++ b/lib/integration-guides.tsx @@ -0,0 +1,3590 @@ +/** + * @file Integration guide content — full JSX guide for every supported platform. + * + * Each guide is keyed by the integration slug and rendered on the + * `/integrations/[slug]` page. + * + * * 75 guides across 7 categories. + */ + +import { type ReactNode } from 'react' +import { CodeBlock } from '@/components/CodeBlock' + +// * ─── Guide registry ───────────────────────────────────────────────────────── + +const guides: Record = { + /* ──────────────────────────────────────────────────────────────────────────── + * 1. Next.js + * ──────────────────────────────────────────────────────────────────────────── */ + 'nextjs': ( + <> +

+ The best way to add Pulse to your Next.js application is using the + built-in next/script component. +

+ +
+ +

Method 1: App Router

+

+ Add the Pulse script to your root layout so it loads on every page. +

+ {`import Script from 'next/script' + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { + return ( + + + + + My React App + + +
+ +`}
+ +

Method 2: Programmatic injection via useEffect

+

+ If you prefer to inject the script programmatically (e.g. only in + production), use a useEffect hook. +

+ {`import { useEffect } from 'react' + +function App() { + useEffect(() => { + if (process.env.NODE_ENV === 'production') { + const script = document.createElement('script') + script.defer = true + script.setAttribute('data-domain', 'your-site.com') + script.src = 'https://pulse.ciphera.net/script.js' + document.head.appendChild(script) + } + }, []) + + return

Hello World

+}`}
+ +

+ Related Integrations:{' '} + Next.js,{' '} + Remix,{' '} + Gatsby,{' '} + Preact +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 3. Vue.js + * ──────────────────────────────────────────────────────────────────────────── */ + 'vue': ( + <> +

+ Add the script to your index.html — works for both Vue CLI + and Vite-based projects. +

+ +
+ +

Add the Pulse script to index.html

+

+ Both Vue CLI and Vite use an index.html as the entry point. + Simply add the Pulse script inside the <head> tag. +

+ {` + + + + + + + + My Vue App + + +
+ + +`}
+ +

+ Looking for Nuxt? Check the dedicated{' '} + Nuxt guide. +

+ +

+ Related Integrations:{' '} + Nuxt,{' '} + VitePress +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 4. Angular + * ──────────────────────────────────────────────────────────────────────────── */ + 'angular': ( + <> +

+ Add the script to your src/index.html — the single entry + point for all Angular applications. +

+ +
+ +

Add the Pulse script to index.html

+

+ Place the Pulse script inside the <head> tag of your + Angular app's src/index.html. +

+ {` + + + + + + + + My Angular App + + + + + +`} + +

+ For more details, see the{' '} + + Angular docs + . +

+ +

+ Related Integrations:{' '} + React,{' '} + Vue.js +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 5. Svelte + * ──────────────────────────────────────────────────────────────────────────── */ + 'svelte': ( + <> +

+ Add the script to your index.html for Vite-based Svelte, or + use <svelte:head> in SvelteKit. +

+ +
+ +

Method 1: Svelte (Vite)

+

+ For standard Svelte projects using Vite, add the Pulse script to your{' '} + index.html. +

+ {` + + + + + + + + My Svelte App + + +
+ + +`}
+ +

Method 2: SvelteKit

+

+ In SvelteKit, use <svelte:head> in your root layout + to add the script to every page. +

+ {` + + + +`} + +

+ Alternatively, you can add the script directly to{' '} + src/app.html in your SvelteKit project. +

+ +

+ Related Integrations:{' '} + Astro,{' '} + Vue.js +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 6. Nuxt + * ──────────────────────────────────────────────────────────────────────────── */ + 'nuxt': ( + <> +

+ Configure Pulse analytics in your nuxt.config for a + framework-native setup. +

+ +
+ +

Method 1: Nuxt 3

+

+ Add the Pulse script via the app.head option in your Nuxt 3 + config. +

+ {`export default defineNuxtConfig({ + app: { + head: { + script: [ + { + defer: true, + 'data-domain': 'your-site.com', + src: 'https://pulse.ciphera.net/script.js', + }, + ], + }, + }, +})`} + +

Method 2: Nuxt 2

+

+ In Nuxt 2, use the head property in your config. +

+ {`export default { + head: { + script: [ + { + defer: true, + 'data-domain': 'your-site.com', + src: 'https://pulse.ciphera.net/script.js', + }, + ], + }, +}`} + +

+ For more details, see the{' '} + + Nuxt head config docs + . +

+ +

+ Related Integrations:{' '} + Vue.js,{' '} + Next.js,{' '} + VitePress +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 7. Remix + * ──────────────────────────────────────────────────────────────────────────── */ + 'remix': ( + <> +

+ Add the Pulse script to your app/root.tsx so it's + included on every route. +

+ +
+ +

Add script to app/root.tsx

+

+ The root route is the top-level layout in Remix. Add the Pulse script + inside the <head> section. +

+ {`import { + Links, + Meta, + Outlet, + Scripts, + ScrollRestoration, +} from '@remix-run/react' + +export default function App() { + return ( + + + + + + + + + {title} + + + + +`} + +

+ If you're using Astro's View Transitions, the script will + persist across navigations by default since it's in the{' '} + <head>. +

+ +

+ For more details, see the{' '} + + Astro scripts docs + . +

+ +

+ Related Integrations:{' '} + Svelte,{' '} + Hugo,{' '} + Eleventy +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 9. Solid.js + * ──────────────────────────────────────────────────────────────────────────── */ + 'solidjs': ( + <> +

+ Add the Pulse script to your index.html like any Vite-based + project. +

+ +
+ +

Add the Pulse script to index.html

+

+ Solid.js uses Vite under the hood, so simply add the Pulse script to + your HTML entry file. +

+ {` + + + + + + + + My Solid App + + +
+ + +`}
+ +

+ Related Integrations:{' '} + React,{' '} + Qwik,{' '} + Preact +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 10. Qwik + * ──────────────────────────────────────────────────────────────────────────── */ + 'qwik': ( + <> +

+ Add the Pulse script to your root entry component so it loads on every + page. +

+ +
+ +

Add to src/root.tsx

+

+ In Qwik, add the Pulse script to the <head> section + of your root component. +

+ {`import { component$ } from '@builder.io/qwik' +import { QwikCityProvider, RouterOutlet } from '@builder.io/qwik-city' + +export default component$(() => { + return ( + + + + + + + My Preact App + + +
+ + +`}
+ +

+ Related Integrations:{' '} + React,{' '} + Solid.js +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 12. HTMX + * ──────────────────────────────────────────────────────────────────────────── */ + 'htmx': ( + <> +

+ Since HTMX is used with server-rendered HTML, add the Pulse script to + your server's base template. +

+ +
+ +

Add to your base HTML template

+

+ HTMX works with any backend — Django, Flask, Laravel, Rails, Express, + and more. Add the Pulse script to whichever base template your server + renders. +

+ {` + + + + + + + + + My HTMX App + + + + +`} + +

+ See the backend-specific guides for template syntax details:{' '} + Django,{' '} + Flask,{' '} + Laravel,{' '} + Rails,{' '} + Express. +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 13. Ember.js + * ──────────────────────────────────────────────────────────────────────────── */ + 'ember': ( + <> +

+ Add the Pulse script to your app/index.html. +

+ +
+ +

Add the Pulse script to index.html

+

+ Ember uses app/index.html as its entry point. Add the + script inside the <head> tag. +

+ {` + + + + + + + + My Ember App + + {{content-for "head"}} + + + + {{content-for "body"}} + + + +`} + +

+ For more details, see the{' '} + + Ember docs + . +

+ +

+ Related Integrations:{' '} + React,{' '} + Angular +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 14. Laravel + * ──────────────────────────────────────────────────────────────────────────── */ + 'laravel': ( + <> +

+ Add the Pulse script to your Blade layout template with a production + guard. +

+ +
+ +

Add to your Blade layout

+

+ Use Laravel's @production directive to only load the + script in production. +

+ {` + + + + + + @production + + @endproduction + + @yield('title') + @vite(['resources/css/app.css', 'resources/js/app.js']) + + + @yield('content') + +`} + +

+ For more details, see the{' '} + + Laravel @production docs + . +

+ +

+ Related Integrations:{' '} + Django,{' '} + Rails,{' '} + WordPress +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 15. Django + * ──────────────────────────────────────────────────────────────────────────── */ + 'django': ( + <> +

+ Add the Pulse script to your base template with a debug guard. +

+ +
+ +

Add to your base template

+

+ Use Django's template tags to only load the script when{' '} + DEBUG is False. +

+ {` + + + + + + {% if not debug %} + + {% endif %} + + {% block title %}My Django App{% endblock %} + + + {% block content %}{% endblock %} + +`} + +

+ Make sure to pass debug to the template context via{' '} + settings.DEBUG, or use a context processor to make it + available globally. +

+ +

+ For more details, see the{' '} + + Django template docs + . +

+ +

+ Related Integrations:{' '} + Flask,{' '} + Laravel,{' '} + HTMX +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 16. Ruby on Rails + * ──────────────────────────────────────────────────────────────────────────── */ + 'rails': ( + <> +

+ Add the Pulse script to your application layout with a production + environment guard. +

+ +
+ +

Add to your application layout

+

+ Use an if guard to only load the script in production. +

+ {` + + + + + + <% if Rails.env.production? %> + + <% end %> + + <%= yield(:title) || "My Rails App" %> + <%= csrf_meta_tags %> + <%= stylesheet_link_tag "application" %> + + + <%= yield %> + +`} + +

+ For more details, see the{' '} + + Rails layout docs + . +

+ +

+ Related Integrations:{' '} + Laravel,{' '} + Django,{' '} + Jekyll +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 17. Flask + * ──────────────────────────────────────────────────────────────────────────── */ + 'flask': ( + <> +

+ Add the Pulse script to your Jinja2 base template with a debug guard. +

+ +
+ +

Add to your base template

+

+ Use Jinja2's conditional to only load the script when{' '} + DEBUG is off. +

+ {` + + + + + + {% if not config.DEBUG %} + + {% endif %} + + {% block title %}My Flask App{% endblock %} + + + {% block content %}{% endblock %} + +`} + +

+ For more details, see the{' '} + + Flask template docs + . +

+ +

+ Related Integrations:{' '} + Django,{' '} + HTMX,{' '} + Express +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 18. Express + * ──────────────────────────────────────────────────────────────────────────── */ + 'express': ( + <> +

+ Add the Pulse script to your template engine's layout (EJS, Pug, + Handlebars) or serve it via static HTML. +

+ +
+ +

Method 1: EJS template

+

+ If you use EJS as your template engine, add the script to your layout + with a production guard. +

+ {` + + + + + + <% if (process.env.NODE_ENV === 'production') { %> + + <% } %> + + <%= title %> + + + <%- body %> + +`} + +

Method 2: Static HTML

+

+ If you serve static HTML files via Express, add the script directly. +

+ {` + + + + + + + + My Express App + + +

Hello World

+ +`}
+ +

+ Related Integrations:{' '} + Flask,{' '} + Next.js,{' '} + React +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 19. Gatsby + * ──────────────────────────────────────────────────────────────────────────── */ + 'gatsby': ( + <> +

+ Use the Gatsby SSR API or the Gatsby Head API to add Pulse to your site. +

+ +
+ +

Method 1: gatsby-ssr.js

+

+ Use the onRenderBody hook to inject the Pulse script into + every page's <head>. +

+ {`import React from "react" + +export const onRenderBody = ({ setHeadComponents }) => { + setHeadComponents([ + +{{ end }}`} + +

Method 2: Include the partial in your base layout

+

+ Add the partial to your baseof.html layout. +

+ {` + + + + + {{ partial "analytics.html" . }} + {{ .Title }} + + + {{ block "main" . }}{{ end }} + +`} + +

+ For more details, see the{' '} + + Hugo partials docs + . +

+ +

+ Related Integrations:{' '} + Jekyll,{' '} + Eleventy,{' '} + Astro +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 21. Eleventy + * ──────────────────────────────────────────────────────────────────────────── */ + 'eleventy': ( + <> +

+ Add the Pulse script to your base Nunjucks or Liquid layout. +

+ +
+ +

Add to your base layout

+

+ Place the Pulse script inside the <head> of your + shared base template. +

+ {` + + + + + + + + {{ title }} + + + {{ content | safe }} + +`} + +

+ For more details, see the{' '} + + Eleventy layouts docs + . +

+ +

+ Related Integrations:{' '} + Hugo,{' '} + Jekyll,{' '} + Astro +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 22. Jekyll + * ──────────────────────────────────────────────────────────────────────────── */ + 'jekyll': ( + <> +

+ Add the Pulse script to your default layout or an _includes{' '} + partial. +

+ +
+ +

Method 1: Create an analytics include

+

+ Create a reusable include with a production environment guard. +

+ {`{% if jekyll.environment == "production" %} + +{% endif %}`} + +

Method 2: Include in your default layout

+

+ Reference the include in your default layout's{' '} + <head>. +

+ {` + + + + + {% include analytics.html %} + {{ page.title }} + + + {{ content }} + +`} + +

+ For more details, see the{' '} + + Jekyll includes docs + . +

+ +

+ Related Integrations:{' '} + Hugo,{' '} + Eleventy,{' '} + GitHub Pages +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 23. Docusaurus + * ──────────────────────────────────────────────────────────────────────────── */ + 'docusaurus': ( + <> +

+ Add the Pulse script via the scripts array in your + Docusaurus config. +

+ +
+ +

Configure in docusaurus.config.js

+

+ Docusaurus supports a scripts config option that injects + script tags into every page. +

+ {`module.exports = { + scripts: [ + { + src: 'https://pulse.ciphera.net/script.js', + defer: true, + 'data-domain': 'your-site.com', + }, + ], + // ... rest of config +}`} + +

+ For more details, see the{' '} + + Docusaurus scripts config docs + . +

+ +

+ Related Integrations:{' '} + VitePress,{' '} + MkDocs,{' '} + Gatsby +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 24. VitePress + * ──────────────────────────────────────────────────────────────────────────── */ + 'vitepress': ( + <> +

+ Add the Pulse script via VitePress's head config + option. +

+ +
+ +

Configure in .vitepress/config.ts

+

+ VitePress lets you inject tags into the <head> of + every page via the head array. +

+ {`import { defineConfig } from 'vitepress' + +export default defineConfig({ + head: [ + [ + 'script', + { + defer: '', + 'data-domain': 'your-site.com', + src: 'https://pulse.ciphera.net/script.js', + }, + ], + ], +})`} + +

+ For more details, see the{' '} + + VitePress head config docs + . +

+ +

+ Related Integrations:{' '} + Docusaurus,{' '} + Vue.js,{' '} + Nuxt +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 25. Hexo + * ──────────────────────────────────────────────────────────────────────────── */ + 'hexo': ( + <> +

+ Add the Pulse script to your Hexo theme's layout file. +

+ +
+ +

Edit your theme's layout

+

+ Open the layout file for your active theme and add the Pulse script + inside the <head>. +

+ {` + + + + + + + + <%= config.title %> + <%- css('css/style') %> + + + <%- body %> + <%- js('js/script') %> + +`} + +

+ Alternatively, you can use Hexo's after_render filter + to inject the script programmatically. +

+ +

+ For more details, see the{' '} + + Hexo templates docs + . +

+ +

+ Related Integrations:{' '} + Hugo,{' '} + Jekyll,{' '} + Eleventy +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 26. MkDocs + * ──────────────────────────────────────────────────────────────────────────── */ + 'mkdocs': ( + <> +

+ Add the Pulse script to your MkDocs site using a custom template + override. +

+ +
+ +

Step 1: Create a custom template override

+

+ To include the data-domain attribute, create a template + override file. +

+ {`{% extends "base.html" %} + +{% block extrahead %} + +{% endblock %}`} + +

Step 2: Configure mkdocs.yml

+

+ Set the custom_dir to your overrides folder in your + MkDocs configuration. +

+ {`theme: + name: material + custom_dir: overrides`} + +

+ For more details, see the{' '} + + MkDocs customization docs + . +

+ +

+ Related Integrations:{' '} + Docusaurus,{' '} + VitePress,{' '} + Django +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 27. WordPress + * ──────────────────────────────────────────────────────────────────────────── */ + 'wordpress': ( + <> +

+ Add the Pulse script via a plugin or by editing your theme's header + file directly. +

+ +
+ +

Method 1: Using a plugin (Recommended)

+

+ The easiest way is to use the{' '} + + WPCode (Insert Headers and Footers) + {' '} + plugin. Install it, then go to Code Snippets → Header & Footer{' '} + and paste the Pulse script into the Header section. +

+ {``} + +

Method 2: Edit header.php directly

+

+ Go to Appearance → Theme File Editor and edit{' '} + header.php. Add the Pulse script before the closing{' '} + </head> tag. +

+ +

+ Related Integrations:{' '} + Ghost,{' '} + Drupal,{' '} + WooCommerce +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 28. Ghost + * ──────────────────────────────────────────────────────────────────────────── */ + 'ghost': ( + <> +

+ Use Ghost's built-in Code Injection feature to add the Pulse + script — no theme editing required. +

+ +
+ +

Add via Code Injection

+

+ Go to Settings → Code injection → Site Header{' '} + and paste the Pulse script. +

+ {``} + +

+ Alternatively, you can add the script directly to your theme's{' '} + default.hbs template file. +

+ +

+ For more details, see the{' '} + + Ghost themes docs + . +

+ +

+ Related Integrations:{' '} + WordPress,{' '} + Blogger +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 29. Drupal + * ──────────────────────────────────────────────────────────────────────────── */ + 'drupal': ( + <> +

+ Add the Pulse script via a contributed module or by editing your + theme's Twig template. +

+ +
+ +

Method 1: Using Asset Injector module

+

+ Install the{' '} + + Asset Injector + {' '} + module and create a new JS injector with the Pulse script. Set it to + load on all pages in the header region. +

+ +

Method 2: Edit html.html.twig

+

+ Add the script directly to your theme's{' '} + html.html.twig template in the head area. +

+ {` + + + + {{ head_title|safe_join(' | ') }} + + + + + + + {{ page_top }} + {{ page }} + {{ page_bottom }} + + +`} + +

+ For more details, see the{' '} + + Drupal theming docs + . +

+ +

+ Related Integrations:{' '} + WordPress,{' '} + Joomla +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 30. Joomla + * ──────────────────────────────────────────────────────────────────────────── */ + 'joomla': ( + <> +

+ Add the Pulse script via your Joomla template or a custom HTML module. +

+ +
+ +

Method 1: Edit template index.php

+

+ Go to Extensions → Templates → Your Template{' '} + and edit index.php. Add the Pulse script before the + closing </head> tag. +

+ {` + + + + + + + + + + +`} + +

Method 2: Custom HTML module

+

+ Create a “Custom HTML” module and assign it to the head + position of your template. Paste the Pulse script as the content. +

+ +

+ For more details, see the{' '} + + Joomla template docs + . +

+ +

+ Related Integrations:{' '} + WordPress,{' '} + Drupal +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 31. Strapi + * ──────────────────────────────────────────────────────────────────────────── */ + 'strapi': ( + <> +

+ Strapi is a headless CMS — add Pulse to the frontend{' '} + that consumes your Strapi API, not to Strapi itself. +

+ +
+ +

Where to add the script

+

+ Since Strapi is an API-only backend, the analytics script belongs in + your frontend application. Follow the guide for whichever framework + you're using to render your Strapi content: +

+ + +

+ Related Integrations:{' '} + Contentful,{' '} + Sanity,{' '} + Next.js +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 32. Sanity + * ──────────────────────────────────────────────────────────────────────────── */ + 'sanity': ( + <> +

+ Sanity is a headless CMS — add Pulse to the frontend{' '} + that renders your Sanity content, not to Sanity Studio. +

+ +
+ +

Where to add the script

+

+ Since Sanity is a headless content platform, the analytics script + belongs in your frontend application. Follow the guide for whichever + framework you're using: +

+ + +

+ Related Integrations:{' '} + Strapi,{' '} + Contentful,{' '} + Next.js +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 33. Contentful + * ──────────────────────────────────────────────────────────────────────────── */ + 'contentful': ( + <> +

+ Contentful is a headless CMS — add Pulse to the{' '} + frontend that displays your Contentful content. +

+ +
+ +

Where to add the script

+

+ Since Contentful is an API-first content platform, the analytics script + belongs in your frontend application. Follow the guide for your + framework: +

+ + +

+ Related Integrations:{' '} + Strapi,{' '} + Sanity,{' '} + Next.js +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 34. Payload CMS + * ──────────────────────────────────────────────────────────────────────────── */ + 'payload': ( + <> +

+ Payload CMS is a headless CMS — add Pulse to the{' '} + frontend application that renders your content. +

+ +
+ +

Where to add the script

+

+ Since Payload is a headless CMS, the analytics script belongs in your + frontend. Payload is most commonly used with Next.js, so the{' '} + Next.js guide{' '} + is the best starting point. +

+ + +

+ Related Integrations:{' '} + Strapi,{' '} + Contentful,{' '} + Next.js +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 35. Shopify + * ──────────────────────────────────────────────────────────────────────────── */ + 'shopify': ( + <> +

+ Add the Pulse script via the Shopify theme editor — no app needed. +

+ +
+ +

Method 1: Edit theme code

+

+ Go to Online Store → Themes → Edit code and + open layout/theme.liquid. Add the Pulse script before the + closing </head> tag. +

+ {` +`} + +

Method 2: Shopify Plus — Customer Events

+

+ If you're on Shopify Plus, you can add the Pulse script via{' '} + Settings → Customer Events → Custom Pixels. +

+ +

+ Use your custom domain or .myshopify.com domain as the{' '} + data-domain value. +

+ +

+ For more details, see the{' '} + + Shopify theme docs + . +

+ +

+ Related Integrations:{' '} + WooCommerce,{' '} + BigCommerce,{' '} + PrestaShop +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 36. WooCommerce + * ──────────────────────────────────────────────────────────────────────────── */ + 'woocommerce': ( + <> +

+ WooCommerce runs on WordPress. Use WordPress methods to add the Pulse + script. +

+ +
+ +

Method 1: Using a plugin (Recommended)

+

+ Install the{' '} + + WPCode plugin + {' '} + and paste the Pulse script into the Header section. +

+ {``} + +

Method 2: Edit header.php

+

+ Go to Appearance → Theme File Editor and add the + Pulse script to your theme's header.php before{' '} + </head>. +

+ +

+ Use the same domain you track your main WordPress site with. +

+ +

+ For the full WordPress setup, see the{' '} + WordPress guide. +

+ +

+ Related Integrations:{' '} + Shopify,{' '} + WordPress,{' '} + BigCommerce +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 37. BigCommerce + * ──────────────────────────────────────────────────────────────────────────── */ + 'bigcommerce': ( + <> +

+ Add the Pulse script via BigCommerce's Script Manager. +

+ +
+ +

Add via Script Manager

+

+ Go to Storefront → Script Manager → Create a Script{' '} + and configure it as follows: +

+
    +
  • Placement: Head
  • +
  • Location: All Pages
  • +
  • Script type: Script tag
  • +
+ {``} + +

+ For more details, see the{' '} + + BigCommerce Script Manager docs + . +

+ +

+ Related Integrations:{' '} + Shopify,{' '} + WooCommerce,{' '} + PrestaShop +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 38. PrestaShop + * ──────────────────────────────────────────────────────────────────────────── */ + 'prestashop': ( + <> +

+ Add the Pulse script to your PrestaShop theme template. +

+ +
+ +

Edit your theme's head template

+

+ Open the head partial for your active theme and add the Pulse script. +

+ {`{block name='head_seo'} + {$page.meta.title} + +{/block} + + + +{block name='head_stylesheets'} + {include file='_partials/stylesheets.tpl'} +{/block}`} + +

+ For more details, see the{' '} + + PrestaShop theme docs + . +

+ +

+ Related Integrations:{' '} + Shopify,{' '} + WooCommerce,{' '} + BigCommerce +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 39. Webflow + * ──────────────────────────────────────────────────────────────────────────── */ + 'webflow': ( + <> +

+ Paste the Pulse script into your Webflow project's custom code + settings. +

+ +
+ +

Add via Project Settings

+

+ Go to Project Settings → Custom Code → Head Code{' '} + and paste the Pulse script. +

+ {``} + +

+ Note: Custom code requires a paid Webflow site plan. The + script won't appear in the Designer preview — publish your site to + see it in action. +

+ +

+ For more details, see the{' '} + + Webflow custom code docs + . +

+ +

+ Related Integrations:{' '} + Squarespace,{' '} + Wix,{' '} + Framer +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 40. Squarespace + * ──────────────────────────────────────────────────────────────────────────── */ + 'squarespace': ( + <> +

+ Use Squarespace's Code Injection feature to add the Pulse script. +

+ +
+ +

Add via Code Injection

+

+ Go to Settings → Developer Tools → Code Injection → Header{' '} + and paste the Pulse script. +

+ {``} + +

+ Note: Code Injection requires a Business or Commerce + plan. +

+ +

+ For more details, see the{' '} + + Squarespace code injection docs + . +

+ +

+ Related Integrations:{' '} + Webflow,{' '} + Wix,{' '} + Carrd +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 41. Wix + * ──────────────────────────────────────────────────────────────────────────── */ + 'wix': ( + <> +

+ Use Wix's Custom Code settings to add the Pulse script. +

+ +
+ +

Add via Custom Code

+

+ Go to Settings → Custom Code → Add Custom Code. + Set the placement to Head and apply it to{' '} + All pages. +

+ {``} + +

+ Note: Custom Code requires a Wix Premium plan. +

+ +

+ For more details, see the{' '} + + Wix custom code docs + . +

+ +

+ Related Integrations:{' '} + Webflow,{' '} + Squarespace,{' '} + Framer +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 42. Framer + * ──────────────────────────────────────────────────────────────────────────── */ + 'framer': ( + <> +

+ Add the Pulse script to your Framer project's custom code settings. +

+ +
+ +

Add via Project Settings

+

+ Go to Project Settings → General → Custom Code → Head{' '} + and paste the Pulse script. +

+ {``} + +

+ For more details, see the{' '} + + Framer custom code docs + . +

+ +

+ Related Integrations:{' '} + Webflow,{' '} + Squarespace,{' '} + Wix +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 43. Carrd + * ──────────────────────────────────────────────────────────────────────────── */ + 'carrd': ( + <> +

+ Add the Pulse script to your Carrd site's head code section. +

+ +
+ +

Add via Settings

+

+ Open your site's Settings panel and navigate to the{' '} + Head section. Paste the Pulse script there. +

+ {``} + +

+ Note: Custom code requires a Carrd Pro plan. +

+ +

+ For more details, see the{' '} + + Carrd head settings docs + . +

+ +

+ Related Integrations:{' '} + Framer,{' '} + Webflow +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 44. Blogger + * ──────────────────────────────────────────────────────────────────────────── */ + 'blogger': ( + <> +

+ Add the Pulse script via Blogger's Theme HTML editor. +

+ +
+ +

Edit your theme HTML

+

+ Go to Theme → Edit HTML and paste the Pulse script + before the closing </head> tag. +

+ {` +`} + +

+ For more details, see the{' '} + + Blogger HTML editing docs + . +

+ +

+ Related Integrations:{' '} + WordPress,{' '} + Ghost +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 45. Google Tag Manager + * ──────────────────────────────────────────────────────────────────────────── */ + 'gtm': ( + <> +

+ Add Pulse via Google Tag Manager — works with any site that already has + GTM installed. +

+ +
+ +

Create a Custom HTML tag

+

Follow these steps to add Pulse through GTM:

+
    +
  1. Go to Tags → New → Custom HTML
  2. +
  3. Paste the Pulse script
  4. +
  5. Set the trigger to All Pages
  6. +
  7. Publish your container
  8. +
+ {``} + +

+ For more details, see the{' '} + + GTM Custom HTML tag docs + . +

+ +

+ Related Integrations:{' '} + WordPress,{' '} + Shopify,{' '} + Webflow +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 46. Notion + * ──────────────────────────────────────────────────────────────────────────── */ + 'notion': ( + <> +

+ Notion itself doesn't support custom scripts, but tools like{' '} + Super.so,{' '} + Potion, and{' '} + Feather{' '} + let you turn Notion pages into websites with custom code support. +

+ +
+ +

Super.so

+

+ Go to Site Settings → Code → Head and paste + the Pulse script. +

+ {``} + +

Potion

+

+ Go to Project Settings → Custom Code → Head{' '} + and paste the Pulse script. +

+ +

+ For more details, see the{' '} + + Super.so docs + . +

+ +

+ Related Integrations:{' '} + Webflow,{' '} + Framer,{' '} + Carrd +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 47. Cloudflare Pages + * ──────────────────────────────────────────────────────────────────────────── */ + 'cloudflare-pages': ( + <> +

+ Add Pulse to your project's HTML or follow your framework's + guide. +

+ +
+ +

Method 1: Framework-based setup (Recommended)

+

+ If you're deploying a framework (Next.js, Astro, Nuxt, etc.) to + Cloudflare Pages, follow that framework's integration guide: +

+ + +

Method 2: Static HTML

+

+ For static HTML sites, add the Pulse script directly to your{' '} + index.html. +

+ {` + + + + + + + + My Site + + +

Hello World

+ +`}
+ +

+ For more details, see the{' '} + + Cloudflare Pages docs + . +

+ +

+ Related Integrations:{' '} + Netlify,{' '} + Vercel,{' '} + GitHub Pages +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 48. Netlify + * ──────────────────────────────────────────────────────────────────────────── */ + 'netlify': ( + <> +

+ Add Pulse via your framework's setup or Netlify's snippet + injection feature. +

+ +
+ +

Method 1: Framework guide (Recommended)

+

+ The best approach is to follow your framework's integration guide. + Netlify deploys framework projects, so the script setup happens in your + source code: +

+ + +

Method 2: Snippet injection (via Netlify UI)

+

+ Go to Site settings → Build & deploy → Post processing → Snippet injection{' '} + and add the Pulse script to the <head> of your + pages. +

+ {``} + +

+ For more details, see the{' '} + + Netlify snippet injection docs + . +

+ +

+ Related Integrations:{' '} + Cloudflare Pages,{' '} + Vercel,{' '} + GitHub Pages +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 49. Vercel + * ──────────────────────────────────────────────────────────────────────────── */ + 'vercel': ( + <> +

+ Add Pulse via your framework's setup. Vercel deploys framework + projects, so the script is added in your source code. +

+ +
+ +

Follow your framework's guide

+

+ Vercel is a deployment platform — it doesn't have a built-in + mechanism for injecting scripts. Add the Pulse script following + your framework's integration guide: +

+ + +

+ Note: Vercel's Edge Middleware cannot inject + scripts by design. Use the framework-level approach instead. +

+ +

+ For more details, see the{' '} + + Vercel frameworks docs + . +

+ +

+ Related Integrations:{' '} + Netlify,{' '} + Cloudflare Pages,{' '} + Next.js +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 50. GitHub Pages + * ──────────────────────────────────────────────────────────────────────────── */ + 'github-pages': ( + <> +

+ Add the Pulse script to your static site's HTML template on GitHub + Pages. +

+ +
+ +

Method 1: Jekyll (default for GitHub Pages)

+

+ Create an analytics include with a production guard and reference it in + your default layout. +

+ {`{% if jekyll.environment == "production" %} + +{% endif %}`} + +

+ Then include it in your layout's <head>: +

+ {` + + + + + {% include analytics.html %} + {{ page.title }} + + + {{ content }} + +`} + +

Method 2: Plain HTML

+

+ For simple static sites, add the Pulse script directly to your{' '} + index.html. +

+ {` + + + + + + + + My Site + + +

Hello World

+ +`}
+ +

Method 3: Hugo on GitHub Pages

+

+ If you're using Hugo with GitHub Pages, follow the{' '} + Hugo guide. +

+ +

+ For more details, see the{' '} + + GitHub Pages docs + . +

+ +

+ Related Integrations:{' '} + Jekyll,{' '} + Hugo,{' '} + Netlify +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 51. Craft CMS + * ──────────────────────────────────────────────────────────────────────────── */ + 'craftcms': ( + <> +

+ Add Pulse to your Craft CMS site by editing your Twig layout template. +

+ +
+ +

Add the Pulse Script to Your Layout

+

+ Edit your main Twig layout template at{' '} + templates/_layout.twig and add the Pulse script inside the{' '} + <head> section. +

+ {` + + + + + + + + {{ siteName }} + + + {% block content %}{% endblock %} + +`} + +

+ For more details, see the{' '} + + Craft CMS docs + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 52. Statamic + * ──────────────────────────────────────────────────────────────────────────── */ + 'statamic': ( + <> +

+ Statamic is a Laravel-based CMS. Add Pulse to your Antlers or Blade + layout. +

+ +
+ +

Add the Pulse Script to Your Layout

+

+ Edit your Antlers layout at{' '} + resources/views/layout.antlers.html and add the Pulse + script inside the <head> section. +

+ {` + + + + + + + + {{ title }} + + + {{ template_content }} + +`} + +

+ For more details, see the{' '} + + Statamic views docs + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 53. TYPO3 + * ──────────────────────────────────────────────────────────────────────────── */ + 'typo3': ( + <> +

+ Add Pulse to your TYPO3 site via TypoScript setup. +

+ +
+ +

Add the Pulse Script via TypoScript

+

+ Add the following to your setup.typoscript file to inject + the Pulse script into the page header. +

+ {`page.headerData.999 = TEXT +page.headerData.999.value = `} + +

+ For more details, see the{' '} + + TypoScript reference + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 54. Kirby + * ──────────────────────────────────────────────────────────────────────────── */ + 'kirby': ( + <> +

+ Add Pulse to your Kirby site via a PHP snippet. +

+ +
+ +

Add the Pulse Script to Your Header Snippet

+

+ Edit site/snippets/header.php or{' '} + site/templates/default.php and add the Pulse script before + the closing </head> tag. +

+ {` + + + + + + + + <?= $page->title() ?> +`} + +

+ For more details, see the{' '} + + Kirby snippets docs + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 55. Grav + * ──────────────────────────────────────────────────────────────────────────── */ + 'grav': ( + <> +

+ Add Pulse to your Grav site via Twig templates. +

+ +
+ +

Add the Pulse Script to Your Base Template

+

+ Edit your theme's base template at{' '} + templates/partials/base.html.twig and add the Pulse script + inside the head block. +

+ {` + + + {% block head %} + + + + + + {{ page.title }} + {% endblock %} + + + {% block content %}{% endblock %} + +`} + +

+ For more details, see the{' '} + + Grav Twig docs + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 56. Umbraco + * ──────────────────────────────────────────────────────────────────────────── */ + 'umbraco': ( + <> +

+ Add Pulse to your Umbraco site via a Razor layout view. +

+ +
+ +

Add the Pulse Script to Your Layout

+

+ Edit Views/Shared/_Layout.cshtml and add the Pulse script + before the closing </head> tag. Use an environment + tag guard to only load in production. +

+ {` + + + + + + + + + + @ViewData["Title"] + + + @RenderBody() + +`} + +

+ For more details, see the{' '} + + Umbraco templates docs + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 57. Storyblok + * ──────────────────────────────────────────────────────────────────────────── */ + 'storyblok': ( + <> +

+ Storyblok is a headless CMS — add Pulse to the frontend that renders + your Storyblok content. +

+ +
+ +

Add Pulse to Your Frontend

+

+ Since Storyblok is a headless CMS, the analytics script goes in your + frontend framework. Follow the guide for your framework: +

+ + +

+ For more details, see the{' '} + + Storyblok docs + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 58. Prismic + * ──────────────────────────────────────────────────────────────────────────── */ + 'prismic': ( + <> +

+ Prismic is a headless CMS — add Pulse to the frontend that displays + your Prismic content. +

+ +
+ +

Add Pulse to Your Frontend

+

+ Since Prismic is a headless CMS, the analytics script goes in your + frontend framework. Follow the guide for your framework: +

+ + +

+ For more details, see the{' '} + + Prismic docs + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 59. Shopware + * ──────────────────────────────────────────────────────────────────────────── */ + 'shopware': ( + <> +

+ Add Pulse to your Shopware 6 store via theme template. +

+ +
+ +

Add the Pulse Script to Your Theme

+

+ Edit{' '} + Resources/views/storefront/layout/meta.html.twig in your + theme and add the Pulse script in the base_header block. +

+ {`{% sw_extends '@Storefront/storefront/layout/meta.html.twig' %} + +{% block base_header %} + {{ parent() }} + + +{% endblock %}`} + +

+ For more details, see the{' '} + + Shopware themes docs + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 60. Magento / Adobe Commerce + * ──────────────────────────────────────────────────────────────────────────── */ + 'magento': ( + <> +

+ Add Pulse to your Magento / Adobe Commerce store via layout XML. +

+ +
+ +

Method 1: Layout XML

+

+ Add the Pulse script to your theme's layout XML at{' '} + app/design/frontend/YOUR_THEME/default/Magento_Theme/layout/default_head_blocks.xml. +

+ {` + + `} + +

+ For more details, see the{' '} + + Magento layout docs + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 61. Bubble + * ──────────────────────────────────────────────────────────────────────────── */ + 'bubble': ( + <> +

+ Add Pulse to your Bubble app via the SEO / Meta tags section. +

+ +
+ +

Add the Pulse Script via Settings

+

+ Go to Settings → SEO / Metatags → Script/meta tags in + header and paste the Pulse script. +

+ {``} + +

+ For more details, see the{' '} + + Bubble settings docs + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 62. Discourse + * ──────────────────────────────────────────────────────────────────────────── */ + 'discourse': ( + <> +

+ Add Pulse to your Discourse forum via admin customization. +

+ +
+ +

Add the Pulse Script via Theme Customization

+

+ Go to Admin → Customize → Themes → Edit + CSS/HTML and add the Pulse script in the{' '} + </head> section. +

+ {``} + +

+ For more details, see the{' '} + + Discourse themes guide + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 63. HubSpot + * ──────────────────────────────────────────────────────────────────────────── */ + 'hubspot': ( + <> +

+ Add Pulse to your HubSpot-hosted pages via site settings. +

+ +
+ +

Add the Pulse Script via Site Settings

+

+ Go to Settings → Website → Pages → Site Header + HTML and paste the Pulse script. +

+ {``} + +

+ Works for HubSpot CMS Free, Starter, Pro, and Enterprise. +

+ +

+ For more details, see the{' '} + + HubSpot header code docs + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 64. Substack + * ──────────────────────────────────────────────────────────────────────────── */ + 'substack': ( + <> +

+ Substack supports custom domains. Add Pulse tracking for your custom + domain. +

+ +
+ +

Track Your Substack via a Custom Domain

+

+ Substack doesn't allow custom scripts directly. You can track your + Substack via your custom domain by configuring Pulse to track the custom + domain. +

+
    +
  1. Set up your custom domain in Substack.
  2. +
  3. Add your custom domain in the Pulse dashboard.
  4. +
  5. Pulse will automatically track page views on your custom domain.
  6. +
+ +

+ For more details, see the{' '} + + Substack custom domain docs + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 65. Linktree + * ──────────────────────────────────────────────────────────────────────────── */ + 'linktree': ( + <> +

+ Add Pulse to your Linktree page via custom code (Business plan + required). +

+ +
+ +

Add the Pulse Script via Custom Meta Tags

+

+ Go to Settings → SEO → Custom Meta Tags and + add the Pulse script to the head. +

+ {``} + +

+ Note: Requires Linktree Business or Enterprise plan. +

+ +

+ For more details, see{' '} + + Linktree Business + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 66. Weebly + * ──────────────────────────────────────────────────────────────────────────── */ + 'weebly': ( + <> +

+ Add Pulse to your Weebly site via the header code settings. +

+ +
+ +

Add the Pulse Script via SEO Settings

+

+ Go to Settings → SEO → Header Code and paste + the Pulse script. +

+ {``} + +

+ For more details, see the{' '} + + Weebly SEO docs + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 67. GitBook + * ──────────────────────────────────────────────────────────────────────────── */ + 'gitbook': ( + <> +

+ Add Pulse to your GitBook documentation site. +

+ +
+ +

Add the Pulse Script via Custom Scripts

+

+ GitBook supports custom header integrations. Go to{' '} + Space settings → Integrations → Custom + scripts and add the Pulse script. +

+ {``} + +

+ For more details, see the{' '} + + GitBook customization docs + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 68. Gridsome + * ──────────────────────────────────────────────────────────────────────────── */ + 'gridsome': ( + <> +

+ Add Pulse to your Gridsome site via the HTML template or a plugin. +

+ +
+ +

Method 1: HTML Template

+

+ Edit src/index.html and add the Pulse script to the head + section. +

+ {` + + + \${head} + + + + + \${app} + +`} + +

Method 2: Server Configuration

+

+ Use gridsome.server.js to inject the script + programmatically. +

+ {`module.exports = function (api) { + api.afterBuild(({ queue }) => { + // Script injection logic + }) +}`} + +

+ For more details, see the{' '} + + Gridsome head management docs + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 69. Read the Docs + * ──────────────────────────────────────────────────────────────────────────── */ + 'readthedocs': ( + <> +

+ Add Pulse to your Read the Docs documentation. +

+ +
+ +

Add the Pulse Script via Sphinx Configuration

+

+ Create a custom template override. In your Sphinx{' '} + conf.py, add the Pulse script as a JavaScript file. +

+ {`html_js_files = [ + ('https://pulse.ciphera.net/script.js', {'defer': 'defer', 'data-domain': 'your-site.com'}), +]`} + +

+ For more details, see the{' '} + + Read the Docs customization + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 70. Sphinx + * ──────────────────────────────────────────────────────────────────────────── */ + 'sphinx': ( + <> +

+ Add Pulse to your Sphinx documentation via conf.py. +

+ +
+ +

Add the Pulse Script via Configuration

+

+ In your conf.py, add the Pulse script using{' '} + html_js_files. +

+ {`html_js_files = [ + ('https://pulse.ciphera.net/script.js', {'defer': 'defer', 'data-domain': 'your-site.com'}), +]`} + +

+ For more details, see the{' '} + + Sphinx html_js_files docs + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 71. ReadMe + * ──────────────────────────────────────────────────────────────────────────── */ + 'readme': ( + <> +

+ Add Pulse to your ReadMe API documentation portal. +

+ +
+ +

Add the Pulse Script via Custom JavaScript

+

+ Go to Project Settings → Custom JavaScript and + paste the Pulse script. +

+ {``} + +

+ For more details, see the{' '} + + ReadMe custom JavaScript docs + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 72. Flutter Web + * ──────────────────────────────────────────────────────────────────────────── */ + 'flutter': ( + <> +

+ Add Pulse to your Flutter web application via{' '} + web/index.html. +

+ +
+ +

Add the Pulse Script to Your HTML Template

+

+ Edit web/index.html in your Flutter project and add the + Pulse script to the <head> section. +

+ {` + + + + + + + + My Flutter App + + + + +`} + +

+ Note: This only applies to Flutter Web. For Flutter + mobile apps, Pulse tracks web views only. +

+ +

+ For more details, see the{' '} + + Flutter Web docs + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 73. Render + * ──────────────────────────────────────────────────────────────────────────── */ + 'render': ( + <> +

+ Add Pulse via your framework setup. Render deploys framework projects. +

+ +
+ +

Follow Your Framework's Guide

+

+ The analytics script goes in your source code, not in Render's + dashboard. Follow your framework's integration guide: +

+ + +

+ For more details, see the{' '} + + Render deployment docs + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 74. Firebase Hosting + * ──────────────────────────────────────────────────────────────────────────── */ + 'firebase': ( + <> +

+ Add Pulse to sites deployed on Firebase Hosting. +

+ +
+ +

Add the Pulse Script to Your Source Code

+

+ Follow your framework's integration guide. The analytics script + goes in your source code. Firebase Hosting serves static files, so add + the script to your index.html or framework layout. +

+ {` + + + + + + + + My App + + +
+ +`}
+ +

+ For more details, see the{' '} + + Firebase Hosting docs + . +

+ + ), + + /* ──────────────────────────────────────────────────────────────────────────── + * 75. AMP + * ──────────────────────────────────────────────────────────────────────────── */ + 'amp': ( + <> +

+ Add Pulse to your AMP pages using the amp-analytics{' '} + component. +

+ +
+ +

Add Pulse via amp-analytics

+

+ AMP pages have restrictions on JavaScript. The{' '} + amp-analytics component is the standard way to add + analytics. Add the following to your AMP page. +

+ {` + +`} + +

+ Note: AMP pages have restrictions on JavaScript. The{' '} + amp-analytics component is the standard way to add + analytics. +

+ +

+ For more details, see the{' '} + + amp-analytics docs + . +

+ + ), +} + +// * ─── Public API ───────────────────────────────────────────────────────────── + +export function getGuideContent(slug: string): ReactNode | undefined { + return guides[slug] +} diff --git a/lib/integrations.tsx b/lib/integrations.tsx new file mode 100644 index 0000000..0c6c8fc --- /dev/null +++ b/lib/integrations.tsx @@ -0,0 +1,1337 @@ +/** + * @file Integration registry — metadata, official SVG logos, and SEO data for + * every platform Pulse supports. + * + * ! SVG paths sourced from simple-icons (https://simpleicons.org). + * ! All icons use a 24×24 viewBox. + * + * * 75 integrations across 7 categories. + */ + +import { type ReactNode } from 'react' + +// * ─── Types ────────────────────────────────────────────────────────────────── + +export type IntegrationCategory = + | 'framework' + | 'backend' + | 'ssg' + | 'cms' + | 'ecommerce' + | 'platform' + | 'hosting' + +export interface Integration { + id: string + name: string + description: string + category: IntegrationCategory + /** Brand hex colour (with #) */ + brandColor: string + /** Whether the icon needs `dark:invert` (black-only logos) */ + invertInDark?: boolean + /** Official 24×24 SVG as a React node */ + icon: ReactNode + /** URL to official documentation / website */ + officialUrl: string + /** SEO meta description for this integration's guide page */ + seoDescription: string + /** Related integration IDs for cross-linking */ + relatedIds: string[] +} + +// * ─── Category labels (for UI grouping) ────────────────────────────────────── + +export const categoryLabels: Record = { + framework: 'JavaScript Frameworks', + backend: 'Backend Frameworks', + ssg: 'Static Sites & Documentation', + cms: 'CMS & Blogging', + ecommerce: 'eCommerce', + platform: 'Platforms & Tools', + hosting: 'Hosting & Deployment', +} + +export const categoryOrder: IntegrationCategory[] = [ + 'framework', + 'backend', + 'ssg', + 'cms', + 'ecommerce', + 'platform', + 'hosting', +] + +// * ─── Integration registry ────────────────────────────────────────────────── + +export const integrations: Integration[] = [ + // * ─── JavaScript Frameworks ──────────────────────────────────────────────── + { + id: 'nextjs', + name: 'Next.js', + description: 'Add privacy-friendly analytics to your Next.js application using next/script.', + category: 'framework', + brandColor: '#000000', + invertInDark: true, + icon: ( + + + + ), + officialUrl: 'https://nextjs.org/docs', + seoDescription: + 'Step-by-step guide to adding Pulse privacy-first analytics to your Next.js app with next/script. Covers App Router and Pages Router.', + relatedIds: ['react', 'vercel', 'nuxt'], + }, + { + id: 'react', + name: 'React', + description: 'Integrate Pulse with any React SPA (Create React App, Vite, etc).', + category: 'framework', + brandColor: '#61DAFB', + icon: ( + + + + ), + officialUrl: 'https://react.dev', + seoDescription: + 'Integrate Pulse analytics with any React SPA — Create React App, Vite, or custom setups. Two easy methods.', + relatedIds: ['nextjs', 'remix', 'gatsby', 'preact'], + }, + { + id: 'vue', + name: 'Vue.js', + description: 'Simple setup for Vue 2 and Vue 3 applications.', + category: 'framework', + brandColor: '#4FC08D', + icon: ( + + + + ), + officialUrl: 'https://vuejs.org', + seoDescription: + 'Add Pulse privacy-first analytics to your Vue.js app. Works with Vue 2, Vue 3, Vue CLI, and Vite.', + relatedIds: ['nuxt', 'vitepress'], + }, + { + id: 'angular', + name: 'Angular', + description: 'Add Pulse analytics to your Angular application with a simple script tag.', + category: 'framework', + brandColor: '#0F0F11', + invertInDark: true, + icon: ( + + + + ), + officialUrl: 'https://angular.dev', + seoDescription: + 'Add Pulse analytics to your Angular application. Simple index.html setup for all Angular versions.', + relatedIds: ['react', 'vue'], + }, + { + id: 'svelte', + name: 'Svelte', + description: 'Integrate Pulse with Svelte or SvelteKit in under a minute.', + category: 'framework', + brandColor: '#FF3E00', + icon: ( + + + + ), + officialUrl: 'https://svelte.dev', + seoDescription: + 'Add Pulse analytics to Svelte or SvelteKit. Simple setup for both Vite-based Svelte and SvelteKit applications.', + relatedIds: ['astro', 'vue'], + }, + { + id: 'nuxt', + name: 'Nuxt', + description: 'Configure Pulse in your Nuxt application via nuxt.config.', + category: 'framework', + brandColor: '#00DC82', + icon: ( + + + + ), + officialUrl: 'https://nuxt.com/docs', + seoDescription: + 'Configure Pulse analytics in Nuxt 2 or Nuxt 3 via nuxt.config. Simple, framework-native setup.', + relatedIds: ['vue', 'nextjs', 'vitepress'], + }, + { + id: 'remix', + name: 'Remix', + description: 'Add Pulse to your Remix app via the root route loader.', + category: 'framework', + brandColor: '#000000', + invertInDark: true, + icon: ( + + + + ), + officialUrl: 'https://remix.run/docs', + seoDescription: + 'Add Pulse analytics to your Remix application via the root route. Simple script tag in app/root.tsx.', + relatedIds: ['react', 'nextjs'], + }, + { + id: 'astro', + name: 'Astro', + description: 'Integrate Pulse with your Astro site for lightning-fast analytics.', + category: 'framework', + brandColor: '#BC52EE', + icon: ( + + + + ), + officialUrl: 'https://docs.astro.build', + seoDescription: + 'Integrate Pulse analytics with Astro. Add the script to your base layout for all pages.', + relatedIds: ['svelte', 'hugo', 'eleventy'], + }, + { + id: 'solidjs', + name: 'Solid.js', + description: 'Add Pulse analytics to your Solid.js application.', + category: 'framework', + brandColor: '#2C4F7C', + icon: ( + + + + ), + officialUrl: 'https://www.solidjs.com/docs', + seoDescription: + 'Add Pulse analytics to your Solid.js application. Simple index.html script tag setup.', + relatedIds: ['react', 'qwik', 'preact'], + }, + { + id: 'qwik', + name: 'Qwik', + description: 'Integrate Pulse analytics with your Qwik application.', + category: 'framework', + brandColor: '#AC7EF4', + icon: ( + + + + ), + officialUrl: 'https://qwik.dev/docs', + seoDescription: + 'Integrate Pulse analytics with Qwik. Add the script to your root entry file.', + relatedIds: ['react', 'solidjs', 'astro'], + }, + { + id: 'preact', + name: 'Preact', + description: 'Add Pulse analytics to your lightweight Preact application.', + category: 'framework', + brandColor: '#673AB8', + icon: ( + + + + ), + officialUrl: 'https://preactjs.com/guide', + seoDescription: + 'Add Pulse analytics to your Preact application. Same simple setup as any Vite or HTML project.', + relatedIds: ['react', 'solidjs'], + }, + { + id: 'htmx', + name: 'HTMX', + description: 'Add Pulse analytics to your HTMX-powered site.', + category: 'framework', + brandColor: '#3366CC', + icon: ( + + + + ), + officialUrl: 'https://htmx.org/docs', + seoDescription: + 'Add Pulse analytics to your HTMX-powered site. Works with any backend serving HTML.', + relatedIds: ['django', 'flask', 'laravel', 'rails'], + }, + { + id: 'ember', + name: 'Ember.js', + description: 'Add Pulse analytics to your Ember.js application.', + category: 'framework', + brandColor: '#E04E39', + icon: ( + + + + ), + officialUrl: 'https://guides.emberjs.com', + seoDescription: + 'Add Pulse analytics to your Ember.js app. Simple index.html script tag setup.', + relatedIds: ['react', 'angular'], + }, + + // * ─── Backend Frameworks ─────────────────────────────────────────────────── + { + id: 'laravel', + name: 'Laravel', + description: 'Add Pulse analytics to your Laravel app via Blade templates.', + category: 'backend', + brandColor: '#FF2D20', + icon: ( + + + + ), + officialUrl: 'https://laravel.com/docs', + seoDescription: + 'Add Pulse analytics to your Laravel app. Blade template integration for all Laravel versions.', + relatedIds: ['django', 'rails', 'wordpress'], + }, + { + id: 'django', + name: 'Django', + description: 'Add Pulse analytics to your Django app via templates.', + category: 'backend', + brandColor: '#092E20', + icon: ( + + + + ), + officialUrl: 'https://docs.djangoproject.com', + seoDescription: + 'Add Pulse analytics to your Django app. Template-based integration for all Django versions.', + relatedIds: ['flask', 'laravel', 'htmx'], + }, + { + id: 'rails', + name: 'Ruby on Rails', + description: 'Add Pulse analytics to your Rails app via ERB layouts.', + category: 'backend', + brandColor: '#D30001', + icon: ( + + + + ), + officialUrl: 'https://guides.rubyonrails.org', + seoDescription: + 'Add Pulse analytics to your Ruby on Rails app. ERB layout integration.', + relatedIds: ['laravel', 'django', 'jekyll'], + }, + { + id: 'flask', + name: 'Flask', + description: 'Add Pulse analytics to your Flask app via Jinja2 templates.', + category: 'backend', + brandColor: '#3BABC3', + icon: ( + + + + ), + officialUrl: 'https://flask.palletsprojects.com', + seoDescription: + 'Add Pulse analytics to your Flask app. Jinja2 template integration.', + relatedIds: ['django', 'htmx', 'express'], + }, + { + id: 'express', + name: 'Express', + description: 'Serve Pulse analytics from your Express.js application.', + category: 'backend', + brandColor: '#000000', + invertInDark: true, + icon: ( + + + + ), + officialUrl: 'https://expressjs.com', + seoDescription: + 'Serve Pulse analytics from your Express.js app. Middleware or template-based setup.', + relatedIds: ['flask', 'nextjs', 'react'], + }, + + // * ─── Static Sites & Documentation ───────────────────────────────────────── + { + id: 'gatsby', + name: 'Gatsby', + description: 'Add Pulse to your Gatsby site via gatsby-ssr or a plugin.', + category: 'ssg', + brandColor: '#663399', + icon: ( + + + + ), + officialUrl: 'https://www.gatsbyjs.com/docs', + seoDescription: + 'Add Pulse analytics to your Gatsby site using gatsby-ssr or the Gatsby Head API.', + relatedIds: ['react', 'nextjs', 'hugo'], + }, + { + id: 'hugo', + name: 'Hugo', + description: 'Drop the Pulse script into your Hugo partial or base template.', + category: 'ssg', + brandColor: '#FF4088', + icon: ( + + + + ), + officialUrl: 'https://gohugo.io/documentation', + seoDescription: + 'Add Pulse analytics to your Hugo site via a partial or base template.', + relatedIds: ['jekyll', 'eleventy', 'astro'], + }, + { + id: 'eleventy', + name: 'Eleventy', + description: 'Add Pulse analytics to your Eleventy (11ty) static site.', + category: 'ssg', + brandColor: '#222222', + invertInDark: true, + icon: ( + + + + ), + officialUrl: 'https://www.11ty.dev/docs', + seoDescription: + 'Add Pulse analytics to your Eleventy (11ty) site. Template-based integration.', + relatedIds: ['hugo', 'jekyll', 'astro'], + }, + { + id: 'jekyll', + name: 'Jekyll', + description: 'Add Pulse analytics to your Jekyll site via Liquid templates.', + category: 'ssg', + brandColor: '#CC0000', + icon: ( + + + + ), + officialUrl: 'https://jekyllrb.com/docs', + seoDescription: + 'Add Pulse analytics to your Jekyll site. Liquid template integration for GitHub Pages and beyond.', + relatedIds: ['hugo', 'eleventy', 'github-pages'], + }, + { + id: 'docusaurus', + name: 'Docusaurus', + description: 'Add Pulse analytics to your Docusaurus documentation site.', + category: 'ssg', + brandColor: '#3ECC5F', + icon: ( + + + + ), + officialUrl: 'https://docusaurus.io/docs', + seoDescription: + 'Add Pulse analytics to your Docusaurus documentation site via docusaurus.config.js.', + relatedIds: ['vitepress', 'mkdocs', 'gatsby'], + }, + { + id: 'vitepress', + name: 'VitePress', + description: 'Add Pulse analytics to your VitePress documentation site.', + category: 'ssg', + brandColor: '#5C73E7', + icon: ( + + + + ), + officialUrl: 'https://vitepress.dev', + seoDescription: + 'Add Pulse analytics to your VitePress documentation site via config.', + relatedIds: ['docusaurus', 'vue', 'nuxt'], + }, + { + id: 'hexo', + name: 'Hexo', + description: 'Add Pulse analytics to your Hexo blog or documentation site.', + category: 'ssg', + brandColor: '#0E83CD', + icon: ( + + + + ), + officialUrl: 'https://hexo.io/docs', + seoDescription: + 'Add Pulse analytics to your Hexo blog or documentation site.', + relatedIds: ['hugo', 'jekyll', 'eleventy'], + }, + { + id: 'mkdocs', + name: 'MkDocs', + description: 'Add Pulse analytics to your MkDocs documentation site.', + category: 'ssg', + brandColor: '#526CFE', + icon: ( + + + + ), + officialUrl: 'https://www.mkdocs.org', + seoDescription: + 'Add Pulse analytics to your MkDocs documentation site.', + relatedIds: ['docusaurus', 'vitepress', 'django'], + }, + + // * ─── CMS & Blogging ────────────────────────────────────────────────────── + { + id: 'wordpress', + name: 'WordPress', + description: 'Add the tracking script to your WordPress header or use a plugin.', + category: 'cms', + brandColor: '#21759B', + icon: ( + + + + ), + officialUrl: 'https://wordpress.org/documentation', + seoDescription: + 'Add Pulse analytics to your WordPress site via a plugin or theme header code.', + relatedIds: ['ghost', 'drupal', 'woocommerce'], + }, + { + id: 'ghost', + name: 'Ghost', + description: 'Inject Pulse into your Ghost theme via Code Injection settings.', + category: 'cms', + brandColor: '#15171A', + invertInDark: true, + icon: ( + + + + ), + officialUrl: 'https://ghost.org/docs', + seoDescription: + 'Add Pulse analytics to your Ghost blog via Code Injection settings.', + relatedIds: ['wordpress', 'blogger'], + }, + { + id: 'drupal', + name: 'Drupal', + description: 'Add Pulse analytics to your Drupal site using a module or theme.', + category: 'cms', + brandColor: '#0678BE', + icon: ( + + + + ), + officialUrl: 'https://www.drupal.org/docs', + seoDescription: + 'Add Pulse analytics to your Drupal site using a module or theme template.', + relatedIds: ['wordpress', 'joomla'], + }, + { + id: 'joomla', + name: 'Joomla', + description: 'Add Pulse analytics to your Joomla site via template or extension.', + category: 'cms', + brandColor: '#5091CD', + icon: ( + + + + ), + officialUrl: 'https://docs.joomla.org', + seoDescription: + 'Add Pulse analytics to your Joomla site via template or extension.', + relatedIds: ['wordpress', 'drupal'], + }, + { + id: 'strapi', + name: 'Strapi', + description: 'Add Pulse analytics to your Strapi-powered frontend.', + category: 'cms', + brandColor: '#4945FF', + icon: ( + + + + ), + officialUrl: 'https://docs.strapi.io', + seoDescription: + 'Add Pulse analytics to your Strapi-powered frontend.', + relatedIds: ['contentful', 'sanity', 'nextjs'], + }, + { + id: 'sanity', + name: 'Sanity', + description: 'Add Pulse analytics to your Sanity-powered frontend.', + category: 'cms', + brandColor: '#0D0E12', + invertInDark: true, + icon: ( + + + + ), + officialUrl: 'https://www.sanity.io/docs', + seoDescription: + 'Add Pulse analytics to your Sanity-powered frontend application.', + relatedIds: ['strapi', 'contentful', 'nextjs'], + }, + { + id: 'contentful', + name: 'Contentful', + description: 'Add Pulse analytics to your Contentful-powered frontend.', + category: 'cms', + brandColor: '#2478CC', + icon: ( + + + + ), + officialUrl: 'https://www.contentful.com/developers/docs', + seoDescription: + 'Add Pulse analytics to your Contentful-powered frontend.', + relatedIds: ['strapi', 'sanity', 'nextjs'], + }, + { + id: 'payload', + name: 'Payload CMS', + description: 'Add Pulse analytics to your Payload CMS frontend.', + category: 'cms', + brandColor: '#000000', + invertInDark: true, + icon: ( + + + + ), + officialUrl: 'https://payloadcms.com/docs', + seoDescription: + 'Add Pulse analytics to your Payload CMS frontend application.', + relatedIds: ['strapi', 'contentful', 'nextjs'], + }, + + // * ─── eCommerce ──────────────────────────────────────────────────────────── + { + id: 'shopify', + name: 'Shopify', + description: 'Add privacy-first analytics to your Shopify store via theme editor.', + category: 'ecommerce', + brandColor: '#7AB55C', + icon: ( + + + + ), + officialUrl: 'https://shopify.dev/docs', + seoDescription: + 'Add Pulse privacy-first analytics to your Shopify store via the theme editor.', + relatedIds: ['woocommerce', 'bigcommerce', 'prestashop'], + }, + { + id: 'woocommerce', + name: 'WooCommerce', + description: 'Add Pulse analytics to your WooCommerce store.', + category: 'ecommerce', + brandColor: '#96588A', + icon: ( + + + + ), + officialUrl: 'https://woocommerce.com/documentation', + seoDescription: + 'Add Pulse analytics to your WooCommerce store. WordPress-based setup.', + relatedIds: ['shopify', 'wordpress', 'bigcommerce'], + }, + { + id: 'bigcommerce', + name: 'BigCommerce', + description: 'Add Pulse analytics to your BigCommerce store.', + category: 'ecommerce', + brandColor: '#121118', + invertInDark: true, + icon: ( + + + + ), + officialUrl: 'https://developer.bigcommerce.com/docs', + seoDescription: + 'Add Pulse analytics to your BigCommerce store via Script Manager.', + relatedIds: ['shopify', 'woocommerce', 'prestashop'], + }, + { + id: 'prestashop', + name: 'PrestaShop', + description: 'Add Pulse analytics to your PrestaShop store.', + category: 'ecommerce', + brandColor: '#DF0067', + icon: ( + + + + ), + officialUrl: 'https://devdocs.prestashop-project.org', + seoDescription: + 'Add Pulse analytics to your PrestaShop store via theme template.', + relatedIds: ['shopify', 'woocommerce', 'bigcommerce'], + }, + + // * ─── Platforms & Tools ──────────────────────────────────────────────────── + { + id: 'webflow', + name: 'Webflow', + description: 'Paste the Pulse snippet into your Webflow project custom code.', + category: 'platform', + brandColor: '#146EF5', + icon: ( + + + + ), + officialUrl: 'https://university.webflow.com', + seoDescription: + 'Add Pulse analytics to your Webflow site via project custom code settings.', + relatedIds: ['squarespace', 'wix', 'framer'], + }, + { + id: 'squarespace', + name: 'Squarespace', + description: 'Add Pulse to Squarespace via the Code Injection panel.', + category: 'platform', + brandColor: '#000000', + invertInDark: true, + icon: ( + + + + ), + officialUrl: 'https://support.squarespace.com', + seoDescription: + 'Add Pulse analytics to your Squarespace site via the Code Injection panel.', + relatedIds: ['webflow', 'wix', 'carrd'], + }, + { + id: 'wix', + name: 'Wix', + description: 'Add Pulse to your Wix site via the Custom Code settings.', + category: 'platform', + brandColor: '#0C6EFC', + icon: ( + + + + ), + officialUrl: 'https://support.wix.com', + seoDescription: + 'Add Pulse analytics to your Wix site via Custom Code settings.', + relatedIds: ['webflow', 'squarespace', 'framer'], + }, + { + id: 'framer', + name: 'Framer', + description: 'Add Pulse analytics to your Framer site via custom code.', + category: 'platform', + brandColor: '#0055FF', + icon: ( + + + + ), + officialUrl: 'https://www.framer.com/help', + seoDescription: + 'Add Pulse analytics to your Framer site via custom code settings.', + relatedIds: ['webflow', 'squarespace', 'wix'], + }, + { + id: 'carrd', + name: 'Carrd', + description: 'Add Pulse analytics to your Carrd one-page site.', + category: 'platform', + brandColor: '#596CAF', + icon: ( + + + + ), + officialUrl: 'https://carrd.co/docs', + seoDescription: + 'Add Pulse analytics to your Carrd one-page site via head code.', + relatedIds: ['framer', 'webflow'], + }, + { + id: 'blogger', + name: 'Blogger', + description: 'Add Pulse analytics to your Blogger blog.', + category: 'platform', + brandColor: '#FF5722', + icon: ( + + + + ), + officialUrl: 'https://support.google.com/blogger', + seoDescription: + 'Add Pulse analytics to your Blogger blog via theme HTML editor.', + relatedIds: ['wordpress', 'ghost'], + }, + { + id: 'gtm', + name: 'Google Tag Manager', + description: 'Add Pulse analytics via Google Tag Manager.', + category: 'platform', + brandColor: '#246FDB', + icon: ( + + + + ), + officialUrl: 'https://tagmanager.google.com', + seoDescription: + 'Add Pulse analytics via Google Tag Manager. Works with any site using GTM.', + relatedIds: ['wordpress', 'shopify', 'webflow'], + }, + { + id: 'notion', + name: 'Notion', + description: 'Add Pulse analytics to Notion-powered websites.', + category: 'platform', + brandColor: '#000000', + invertInDark: true, + icon: ( + + + + ), + officialUrl: 'https://www.notion.so', + seoDescription: + 'Add Pulse analytics to Notion-powered websites using Super.so, Potion, or similar tools.', + relatedIds: ['webflow', 'framer', 'carrd'], + }, + + // * ─── Hosting & Deployment ───────────────────────────────────────────────── + { + id: 'cloudflare-pages', + name: 'Cloudflare Pages', + description: 'Deploy with Pulse analytics on Cloudflare Pages.', + category: 'hosting', + brandColor: '#F38020', + icon: ( + + + + ), + officialUrl: 'https://developers.cloudflare.com/pages', + seoDescription: + 'Deploy with Pulse analytics on Cloudflare Pages. Works with any framework.', + relatedIds: ['netlify', 'vercel', 'github-pages'], + }, + { + id: 'netlify', + name: 'Netlify', + description: 'Add Pulse analytics to sites deployed on Netlify.', + category: 'hosting', + brandColor: '#00C7B7', + icon: ( + + + + ), + officialUrl: 'https://docs.netlify.com', + seoDescription: + 'Add Pulse analytics to sites deployed on Netlify. Snippet injection and build-based methods.', + relatedIds: ['cloudflare-pages', 'vercel', 'github-pages'], + }, + { + id: 'vercel', + name: 'Vercel', + description: 'Add Pulse analytics to sites deployed on Vercel.', + category: 'hosting', + brandColor: '#000000', + invertInDark: true, + icon: ( + + + + ), + officialUrl: 'https://vercel.com/docs', + seoDescription: + 'Add Pulse analytics to sites deployed on Vercel. Works with any framework.', + relatedIds: ['netlify', 'cloudflare-pages', 'nextjs'], + }, + { + id: 'github-pages', + name: 'GitHub Pages', + description: 'Add Pulse analytics to your GitHub Pages site.', + category: 'hosting', + brandColor: '#222222', + invertInDark: true, + icon: ( + + + + ), + officialUrl: 'https://docs.github.com/en/pages', + seoDescription: + 'Add Pulse analytics to your GitHub Pages site. Works with Jekyll, Hugo, or plain HTML.', + relatedIds: ['jekyll', 'hugo', 'netlify'], + }, + + // * ─── CMS & Blogging (continued) ────────────────────────────────────────── + { + id: 'craftcms', + name: 'Craft CMS', + description: 'Add Pulse to your Craft CMS site with a simple template tag.', + category: 'cms', + brandColor: '#E5422B', + icon: ( + + + + ), + officialUrl: 'https://craftcms.com/docs', + seoDescription: + 'Add Pulse analytics to your Craft CMS site via Twig templates. Simple installation.', + relatedIds: ['wordpress', 'statamic', 'drupal'], + }, + { + id: 'statamic', + name: 'Statamic', + description: 'Integrate Pulse with your Statamic site via Antlers templates.', + category: 'cms', + brandColor: '#FF269E', + icon: ( + + + + ), + officialUrl: 'https://statamic.dev/docs', + seoDescription: + 'Add Pulse analytics to your Statamic site. Antlers template integration.', + relatedIds: ['craftcms', 'laravel', 'wordpress'], + }, + { + id: 'typo3', + name: 'TYPO3', + description: 'Add Pulse to your TYPO3 site via TypoScript or Fluid templates.', + category: 'cms', + brandColor: '#FF8700', + icon: ( + + + + ), + officialUrl: 'https://docs.typo3.org', + seoDescription: + 'Add Pulse analytics to your TYPO3 CMS site. TypoScript and Fluid template integration.', + relatedIds: ['wordpress', 'drupal', 'joomla'], + }, + { + id: 'kirby', + name: 'Kirby', + description: 'Add Pulse to your Kirby site via PHP snippets.', + category: 'cms', + brandColor: '#000000', + invertInDark: true, + icon: ( + + + + ), + officialUrl: 'https://getkirby.com/docs', + seoDescription: + 'Add Pulse analytics to your Kirby CMS site. Simple PHP snippet integration.', + relatedIds: ['craftcms', 'statamic', 'grav'], + }, + { + id: 'grav', + name: 'Grav', + description: 'Add Pulse to your Grav site via Twig templates.', + category: 'cms', + brandColor: '#221E1F', + invertInDark: true, + icon: ( + + + + ), + officialUrl: 'https://learn.getgrav.org', + seoDescription: + 'Add Pulse analytics to your Grav flat-file CMS. Twig template integration.', + relatedIds: ['kirby', 'craftcms', 'hugo'], + }, + { + id: 'umbraco', + name: 'Umbraco', + description: 'Add Pulse to your Umbraco site via Razor views.', + category: 'cms', + brandColor: '#3544B1', + icon: ( + + + + ), + officialUrl: 'https://docs.umbraco.com', + seoDescription: + 'Add Pulse analytics to your Umbraco CMS site. Razor view integration for .NET.', + relatedIds: ['wordpress', 'drupal', 'typo3'], + }, + { + id: 'storyblok', + name: 'Storyblok', + description: 'Add Pulse to the frontend of your Storyblok-powered site.', + category: 'cms', + brandColor: '#09B3AF', + icon: ( + + + + ), + officialUrl: 'https://www.storyblok.com/docs', + seoDescription: + 'Add Pulse analytics to your Storyblok-powered frontend application.', + relatedIds: ['contentful', 'prismic', 'nextjs'], + }, + { + id: 'prismic', + name: 'Prismic', + description: 'Add Pulse to the frontend of your Prismic-powered site.', + category: 'cms', + brandColor: '#5163BA', + icon: ( + + + + ), + officialUrl: 'https://prismic.io/docs', + seoDescription: + 'Add Pulse analytics to your Prismic-powered frontend application.', + relatedIds: ['contentful', 'storyblok', 'nextjs'], + }, + + // * ─── eCommerce (continued) ─────────────────────────────────────────────── + { + id: 'shopware', + name: 'Shopware', + description: 'Add Pulse analytics to your Shopware 6 store.', + category: 'ecommerce', + brandColor: '#189EFF', + icon: ( + + + + ), + officialUrl: 'https://developer.shopware.com/docs', + seoDescription: + 'Add Pulse analytics to your Shopware 6 store via theme template.', + relatedIds: ['shopify', 'woocommerce', 'magento'], + }, + { + id: 'magento', + name: 'Magento', + description: 'Add Pulse analytics to your Magento / Adobe Commerce store.', + category: 'ecommerce', + brandColor: '#F46F25', + icon: ( + + + + ), + officialUrl: 'https://developer.adobe.com/commerce', + seoDescription: + 'Add Pulse analytics to your Magento or Adobe Commerce store via layout XML.', + relatedIds: ['shopify', 'woocommerce', 'shopware'], + }, + + // * ─── Platforms & Tools (continued) ─────────────────────────────────────── + { + id: 'bubble', + name: 'Bubble', + description: 'Add Pulse to your Bubble no-code application.', + category: 'platform', + brandColor: '#000000', + invertInDark: true, + icon: ( + + + + ), + officialUrl: 'https://manual.bubble.io', + seoDescription: + 'Add Pulse analytics to your Bubble no-code app via the SEO/Meta tags section.', + relatedIds: ['webflow', 'framer', 'wix'], + }, + { + id: 'discourse', + name: 'Discourse', + description: 'Add Pulse to your Discourse community forum.', + category: 'platform', + brandColor: '#000000', + invertInDark: true, + icon: ( + + + + ), + officialUrl: 'https://meta.discourse.org/docs', + seoDescription: + 'Add Pulse analytics to your Discourse forum via admin customization.', + relatedIds: ['wordpress', 'ghost'], + }, + { + id: 'hubspot', + name: 'HubSpot', + description: 'Add Pulse to your HubSpot-hosted pages.', + category: 'platform', + brandColor: '#FF7A59', + icon: ( + + + + ), + officialUrl: 'https://knowledge.hubspot.com', + seoDescription: + 'Add Pulse analytics to HubSpot landing pages and website via Settings.', + relatedIds: ['wordpress', 'webflow'], + }, + { + id: 'substack', + name: 'Substack', + description: 'Add Pulse to your Substack publication with a custom domain.', + category: 'platform', + brandColor: '#FF6719', + icon: ( + + + + ), + officialUrl: 'https://substack.com', + seoDescription: + 'Add Pulse analytics to your Substack publication using custom domain settings.', + relatedIds: ['ghost', 'blogger', 'wordpress'], + }, + { + id: 'linktree', + name: 'Linktree', + description: 'Add Pulse to your Linktree page via custom code.', + category: 'platform', + brandColor: '#43E55E', + icon: ( + + + + ), + officialUrl: 'https://linktr.ee', + seoDescription: + 'Add Pulse analytics to your Linktree link-in-bio page.', + relatedIds: ['carrd', 'framer', 'webflow'], + }, + { + id: 'weebly', + name: 'Weebly', + description: 'Add Pulse to your Weebly site via header code.', + category: 'platform', + brandColor: '#2C5CC5', + icon: ( + + + + ), + officialUrl: 'https://www.weebly.com', + seoDescription: + 'Add Pulse analytics to your Weebly website via the header code settings.', + relatedIds: ['squarespace', 'wix', 'webflow'], + }, + + // * ─── Static Sites & Documentation (continued) ─────────────────────────── + { + id: 'gitbook', + name: 'GitBook', + description: 'Add Pulse to your GitBook documentation site.', + category: 'ssg', + brandColor: '#BBDDE5', + icon: ( + + + + ), + officialUrl: 'https://docs.gitbook.com', + seoDescription: + 'Add Pulse analytics to your GitBook-hosted documentation.', + relatedIds: ['docusaurus', 'readme', 'readthedocs'], + }, + { + id: 'gridsome', + name: 'Gridsome', + description: 'Add Pulse to your Gridsome static site.', + category: 'ssg', + brandColor: '#00A672', + icon: ( + + + + ), + officialUrl: 'https://gridsome.org/docs', + seoDescription: + 'Add Pulse analytics to your Gridsome Vue-based static site.', + relatedIds: ['gatsby', 'vue', 'nuxt'], + }, + { + id: 'readthedocs', + name: 'Read the Docs', + description: 'Add Pulse to your Read the Docs documentation.', + category: 'ssg', + brandColor: '#000000', + invertInDark: true, + icon: ( + + + + ), + officialUrl: 'https://docs.readthedocs.io', + seoDescription: + 'Add Pulse analytics to your Read the Docs documentation site.', + relatedIds: ['sphinx', 'mkdocs', 'docusaurus'], + }, + { + id: 'sphinx', + name: 'Sphinx', + description: 'Add Pulse to your Sphinx documentation via conf.py.', + category: 'ssg', + brandColor: '#000000', + invertInDark: true, + icon: ( + + + + ), + officialUrl: 'https://www.sphinx-doc.org', + seoDescription: + 'Add Pulse analytics to your Sphinx-generated documentation.', + relatedIds: ['readthedocs', 'mkdocs', 'docusaurus'], + }, + { + id: 'readme', + name: 'ReadMe', + description: 'Add Pulse to your ReadMe API documentation.', + category: 'ssg', + brandColor: '#018EF5', + icon: ( + + + + ), + officialUrl: 'https://docs.readme.com', + seoDescription: + 'Add Pulse analytics to your ReadMe API documentation portal.', + relatedIds: ['gitbook', 'docusaurus', 'readthedocs'], + }, + + // * ─── JavaScript Frameworks (continued) ─────────────────────────────────── + { + id: 'flutter', + name: 'Flutter', + description: 'Add Pulse to your Flutter web application.', + category: 'framework', + brandColor: '#02569B', + icon: ( + + + + ), + officialUrl: 'https://docs.flutter.dev', + seoDescription: + 'Add Pulse analytics to your Flutter web app via web/index.html.', + relatedIds: ['react', 'angular', 'preact'], + }, + + // * ─── Hosting & Deployment (continued) ──────────────────────────────────── + { + id: 'render', + name: 'Render', + description: 'Deploy with Pulse analytics on Render.', + category: 'hosting', + brandColor: '#000000', + invertInDark: true, + icon: ( + + + + ), + officialUrl: 'https://docs.render.com', + seoDescription: + 'Add Pulse analytics to sites deployed on Render. Works with any framework.', + relatedIds: ['netlify', 'vercel', 'cloudflare-pages'], + }, + { + id: 'firebase', + name: 'Firebase Hosting', + description: 'Deploy with Pulse analytics on Firebase Hosting.', + category: 'hosting', + brandColor: '#DD2C00', + icon: ( + + + + ), + officialUrl: 'https://firebase.google.com/docs/hosting', + seoDescription: + 'Add Pulse analytics to sites deployed on Firebase Hosting.', + relatedIds: ['netlify', 'vercel', 'render'], + }, + + // * ─── Platforms & Tools (continued) ─────────────────────────────────────── + { + id: 'amp', + name: 'Google AMP', + description: 'Add Pulse to your AMP (Accelerated Mobile Pages) site.', + category: 'platform', + brandColor: '#005AF0', + icon: ( + + + + ), + officialUrl: 'https://amp.dev/documentation', + seoDescription: + 'Add Pulse analytics to Google AMP pages using amp-analytics.', + relatedIds: ['gtm', 'wordpress', 'webflow'], + }, +] + +// * ─── Helpers ──────────────────────────────────────────────────────────────── + +/** Retrieve a single integration by its route slug. */ +export function getIntegration(id: string): Integration | undefined { + return integrations.find((i) => i.id === id) +} + +/** Group integrations by category, preserving category ordering. */ +export function getGroupedIntegrations(): { + category: IntegrationCategory + label: string + items: Integration[] +}[] { + return categoryOrder + .map((cat) => ({ + category: cat, + label: categoryLabels[cat], + items: integrations.filter((i) => i.category === cat), + })) + .filter((group) => group.items.length > 0) +} diff --git a/public/Icon Padding left & right 192x192.png b/public/Icon Padding left & right 192x192.png new file mode 100644 index 0000000..c3b532c Binary files /dev/null and b/public/Icon Padding left & right 192x192.png differ diff --git a/public/Icon Padding left & right 512x512.png b/public/Icon Padding left & right 512x512.png new file mode 100644 index 0000000..a9bf4b0 Binary files /dev/null and b/public/Icon Padding left & right 512x512.png differ diff --git a/public/sw 2.js b/public/sw 2.js new file mode 100644 index 0000000..15a7685 --- /dev/null +++ b/public/sw 2.js @@ -0,0 +1 @@ +if(!self.define){let e,s={};const a=(a,n)=>(a=new URL(a+".js",n).href,s[a]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=a,e.onload=s,document.head.appendChild(e)}else e=a,importScripts(a),s()}).then(()=>{let e=s[a];if(!e)throw new Error(`Module ${a} didn’t register its module`);return e}));self.define=(n,c)=>{const i=e||("document"in self?document.currentScript.src:"")||location.href;if(s[i])return;let t={};const r=e=>a(e,i),d={module:{uri:i},exports:t,require:r};s[i]=Promise.all(n.map(e=>d[e]||r(e))).then(e=>(c(...e),t))}}define(["./workbox-f1770938"],function(e){"use strict";importScripts(),self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"/Icon Padding left & right 192x192.png",revision:"a9bae788a2253361a0e295deadbcc083"},{url:"/Icon Padding left & right 512x512.png",revision:"d2efb02d7b9a0a627387d334201e6ea7"},{url:"/_next/static/chunks/0e5ce63c-0d9b48ee367f70a2.js",revision:"0d9b48ee367f70a2"},{url:"/_next/static/chunks/164f4fb6-67211e558fa5de32.js",revision:"67211e558fa5de32"},{url:"/_next/static/chunks/1795-59339c2cb7f5fe6c.js",revision:"59339c2cb7f5fe6c"},{url:"/_next/static/chunks/1992.d220c685821eae19.js",revision:"d220c685821eae19"},{url:"/_next/static/chunks/201a89a4-3d566664e60259ff.js",revision:"3d566664e60259ff"},{url:"/_next/static/chunks/2170a4aa-a1f2fd30878a3e91.js",revision:"a1f2fd30878a3e91"},{url:"/_next/static/chunks/2f0b94e8-ce53c98b232310fc.js",revision:"ce53c98b232310fc"},{url:"/_next/static/chunks/30a37ab2-30992cf05be9404a.js",revision:"30992cf05be9404a"},{url:"/_next/static/chunks/4573-3b13da9808e514ac.js",revision:"3b13da9808e514ac"},{url:"/_next/static/chunks/4bd1b696-e5d7c65570c947b7.js",revision:"e5d7c65570c947b7"},{url:"/_next/static/chunks/5902.6a7448e0dec4f9e1.js",revision:"6a7448e0dec4f9e1"},{url:"/_next/static/chunks/5909-cf645368838a6b20.js",revision:"cf645368838a6b20"},{url:"/_next/static/chunks/7620-7f79d135fa03ba32.js",revision:"7f79d135fa03ba32"},{url:"/_next/static/chunks/795d4814-4c5954750245c540.js",revision:"4c5954750245c540"},{url:"/_next/static/chunks/8500-98e13bcce54aa7a0.js",revision:"98e13bcce54aa7a0"},{url:"/_next/static/chunks/8928-835918834d3b3798.js",revision:"835918834d3b3798"},{url:"/_next/static/chunks/8e1d74a4-407f656e5bcc2171.js",revision:"407f656e5bcc2171"},{url:"/_next/static/chunks/ad2866b8.6c51983a1eb56136.js",revision:"6c51983a1eb56136"},{url:"/_next/static/chunks/app/_global-error/page-85628b53985e66de.js",revision:"85628b53985e66de"},{url:"/_next/static/chunks/app/_not-found/page-85628b53985e66de.js",revision:"85628b53985e66de"},{url:"/_next/static/chunks/app/about/page-961134dbb15bfcbf.js",revision:"961134dbb15bfcbf"},{url:"/_next/static/chunks/app/api/auth/refresh/route-85628b53985e66de.js",revision:"85628b53985e66de"},{url:"/_next/static/chunks/app/auth/callback/page-e02d5207bc967b15.js",revision:"e02d5207bc967b15"},{url:"/_next/static/chunks/app/faq/page-fac70f1a93ec3606.js",revision:"fac70f1a93ec3606"},{url:"/_next/static/chunks/app/installation/page-f2243076dd49d3d4.js",revision:"f2243076dd49d3d4"},{url:"/_next/static/chunks/app/integrations/nextjs/page-ba7437bf718723f9.js",revision:"ba7437bf718723f9"},{url:"/_next/static/chunks/app/integrations/page-cef8333acda65483.js",revision:"cef8333acda65483"},{url:"/_next/static/chunks/app/integrations/react/page-410fd66b109e333c.js",revision:"410fd66b109e333c"},{url:"/_next/static/chunks/app/integrations/vue/page-d815efd4c9a39306.js",revision:"d815efd4c9a39306"},{url:"/_next/static/chunks/app/integrations/wordpress/page-f03e2378c00b904a.js",revision:"f03e2378c00b904a"},{url:"/_next/static/chunks/app/layout-ce4924adc7c42dcc.js",revision:"ce4924adc7c42dcc"},{url:"/_next/static/chunks/app/login/page-96640fc203cae231.js",revision:"96640fc203cae231"},{url:"/_next/static/chunks/app/not-found-833b37ab1663c8a1.js",revision:"833b37ab1663c8a1"},{url:"/_next/static/chunks/app/onboarding/page-091dd498ed5d5805.js",revision:"091dd498ed5d5805"},{url:"/_next/static/chunks/app/org-settings/page-c3e177ad6171617e.js",revision:"c3e177ad6171617e"},{url:"/_next/static/chunks/app/page-1d0749d506de7405.js",revision:"1d0749d506de7405"},{url:"/_next/static/chunks/app/pricing/page-ff5fab384b0203d3.js",revision:"ff5fab384b0203d3"},{url:"/_next/static/chunks/app/settings/page-890f2c485c894bb2.js",revision:"890f2c485c894bb2"},{url:"/_next/static/chunks/app/share/%5Bid%5D/page-88df4e94e7b55109.js",revision:"88df4e94e7b55109"},{url:"/_next/static/chunks/app/signup/page-b17cb3afb210ddbb.js",revision:"b17cb3afb210ddbb"},{url:"/_next/static/chunks/app/sites/%5Bid%5D/page-616162d6a1d6e47c.js",revision:"616162d6a1d6e47c"},{url:"/_next/static/chunks/app/sites/%5Bid%5D/realtime/page-2a2d04563947fa67.js",revision:"2a2d04563947fa67"},{url:"/_next/static/chunks/app/sites/%5Bid%5D/settings/page-b0fd17efb70e114b.js",revision:"b0fd17efb70e114b"},{url:"/_next/static/chunks/app/sites/new/page-c8dddbd443e2a8ac.js",revision:"c8dddbd443e2a8ac"},{url:"/_next/static/chunks/bc98253f.1c4ca5773e357da2.js",revision:"1c4ca5773e357da2"},{url:"/_next/static/chunks/c9d33fe5-86a53cc7ffd40559.js",revision:"86a53cc7ffd40559"},{url:"/_next/static/chunks/ee560e2c-d269d85d3d10b933.js",revision:"d269d85d3d10b933"},{url:"/_next/static/chunks/f4898fe8-8bc2ae55335cc57d.js",revision:"8bc2ae55335cc57d"},{url:"/_next/static/chunks/framework-81b2e59ffe13bb24.js",revision:"81b2e59ffe13bb24"},{url:"/_next/static/chunks/main-2aa77a4a2c547977.js",revision:"2aa77a4a2c547977"},{url:"/_next/static/chunks/main-app-e646227faa58df82.js",revision:"e646227faa58df82"},{url:"/_next/static/chunks/next/dist/client/components/builtin/app-error-85628b53985e66de.js",revision:"85628b53985e66de"},{url:"/_next/static/chunks/next/dist/client/components/builtin/forbidden-85628b53985e66de.js",revision:"85628b53985e66de"},{url:"/_next/static/chunks/next/dist/client/components/builtin/global-error-68b36e74ca32f8b6.js",revision:"68b36e74ca32f8b6"},{url:"/_next/static/chunks/next/dist/client/components/builtin/unauthorized-85628b53985e66de.js",revision:"85628b53985e66de"},{url:"/_next/static/chunks/polyfills-42372ed130431b0a.js",revision:"846118c33b2c0e922d7b3a7676f81f6f"},{url:"/_next/static/chunks/webpack-4c5e072e59638097.js",revision:"4c5e072e59638097"},{url:"/_next/static/css/9f42e6b7c3cab03c.css",revision:"9f42e6b7c3cab03c"},{url:"/_next/static/media/636a5ac981f94f8b-s.p.woff2",revision:"52d04440a9faae0db9adc6cdc844099b"},{url:"/_next/static/media/6fe53d21e6e7ebd8-s.woff2",revision:"2591db816b61d44b6e87ba79d13622b2"},{url:"/_next/static/media/8ebc6e9dde468c4a-s.woff2",revision:"196acbb650c75807ea2f0ef36edbd186"},{url:"/_next/static/media/9e7b0a821b9dfcb4-s.woff2",revision:"5ffe46eeb00dd9fa8a70cb10ccc3817e"},{url:"/_next/static/yV0hJZnpczr3hupoivroz/_buildManifest.js",revision:"f603baae985f0e99def0a2c51922a169"},{url:"/_next/static/yV0hJZnpczr3hupoivroz/_ssgManifest.js",revision:"b6652df95db52feb4daf4eca35380933"},{url:"/ciphera_icon_no_margins.png",revision:"eccd951fa34bd0901dcc37461b605e5b"},{url:"/favicon.ico",revision:"d256b0f8c516bbd3e93edf343876b462"},{url:"/icon-192x192.png",revision:"a9bae788a2253361a0e295deadbcc083"},{url:"/icon-512x512.png",revision:"d2efb02d7b9a0a627387d334201e6ea7"},{url:"/manifest.json",revision:"9c84335d179dcab05bf43ff586f2420d"},{url:"/pulse_icon_no_margins.png",revision:"a7cd4faa1c8e42ea5654451a31565642"},{url:"/pulse_logo_no_margins.png",revision:"6d6553cc7ea96597ffdcb69db9e0d11f"},{url:"/script.js",revision:"c579f58e59235c8575fb8262a26f411f"}],{ignoreURLParametersMatching:[/^utm_/,/^fbclid$/]}),e.cleanupOutdatedCaches(),e.registerRoute("/",new e.NetworkFirst({cacheName:"start-url",plugins:[{cacheWillUpdate:async({response:e})=>e&&"opaqueredirect"===e.type?new Response(e.body,{status:200,statusText:"OK",headers:e.headers}):e}]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:gstatic)\.com\/.*/i,new e.CacheFirst({cacheName:"google-fonts-webfonts",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:31536e3})]}),"GET"),e.registerRoute(/^https:\/\/fonts\.(?:googleapis)\.com\/.*/i,new e.StaleWhileRevalidate({cacheName:"google-fonts-stylesheets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:eot|otf|ttc|ttf|woff|woff2|font.css)$/i,new e.StaleWhileRevalidate({cacheName:"static-font-assets",plugins:[new e.ExpirationPlugin({maxEntries:4,maxAgeSeconds:604800})]}),"GET"),e.registerRoute(/\.(?:jpg|jpeg|gif|png|svg|ico|webp)$/i,new e.StaleWhileRevalidate({cacheName:"static-image-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:2592e3})]}),"GET"),e.registerRoute(/\/_next\/static.+\.js$/i,new e.CacheFirst({cacheName:"next-static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/image\?url=.+$/i,new e.StaleWhileRevalidate({cacheName:"next-image",plugins:[new e.ExpirationPlugin({maxEntries:64,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp3|wav|ogg)$/i,new e.CacheFirst({cacheName:"static-audio-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:mp4|webm)$/i,new e.CacheFirst({cacheName:"static-video-assets",plugins:[new e.RangeRequestsPlugin,new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:js)$/i,new e.StaleWhileRevalidate({cacheName:"static-js-assets",plugins:[new e.ExpirationPlugin({maxEntries:48,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:css|less)$/i,new e.StaleWhileRevalidate({cacheName:"static-style-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\/_next\/data\/.+\/.+\.json$/i,new e.StaleWhileRevalidate({cacheName:"next-data",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(/\.(?:json|xml|csv)$/i,new e.NetworkFirst({cacheName:"static-data-assets",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({sameOrigin:e,url:{pathname:s}})=>!(!e||s.startsWith("/api/auth/callback")||!s.startsWith("/api/")),new e.NetworkFirst({cacheName:"apis",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:16,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({request:e,url:{pathname:s},sameOrigin:a})=>"1"===e.headers.get("RSC")&&"1"===e.headers.get("Next-Router-Prefetch")&&a&&!s.startsWith("/api/"),new e.NetworkFirst({cacheName:"pages-rsc-prefetch",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({request:e,url:{pathname:s},sameOrigin:a})=>"1"===e.headers.get("RSC")&&a&&!s.startsWith("/api/"),new e.NetworkFirst({cacheName:"pages-rsc",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({url:{pathname:e},sameOrigin:s})=>s&&!e.startsWith("/api/"),new e.NetworkFirst({cacheName:"pages",plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:86400})]}),"GET"),e.registerRoute(({sameOrigin:e})=>!e,new e.NetworkFirst({cacheName:"cross-origin",networkTimeoutSeconds:10,plugins:[new e.ExpirationPlugin({maxEntries:32,maxAgeSeconds:3600})]}),"GET")});