---
title: "Framework integrations"
description: "Initialize Tracwell once in a framework's browser lifecycle."
documentation: "https://tracwell.app/docs/frameworks"
markdown: "https://tracwell.app/docs/frameworks.md"
---

# Framework integrations

> Initialize Tracwell once in a framework's browser lifecycle.

Tracwell is a framework-neutral browser SDK. Routing, batching, validation, and delivery remain inside the SDK.

## Web integrations

- [React](https://tracwell.app/docs/frameworks/react.md): Mount one client-only component near the root. The module-level client prevents React Strict Mode from initializing Tracwell twice in development.
- [Next.js](https://tracwell.app/docs/frameworks/nextjs.md): Keep initialization in a small Client Component and render it from the root layout. The rest of the layout can remain a Server Component.
- [React Router](https://tracwell.app/docs/frameworks/react-router.md): Initialize from the root route or application shell. Effects run only in the browser, including framework-mode applications that render on the server.
- [Remix](https://tracwell.app/docs/frameworks/remix.md): Initialize from app/root.tsx. The effect is skipped during server rendering and stays mounted across nested routes.
- [Vue](https://tracwell.app/docs/frameworks/vue.md): Create the analytics client in the browser entry before mounting the application. Provide it when components need direct event tracking.
- [Nuxt](https://tracwell.app/docs/frameworks/nuxt.md): Use a client-only Nuxt plugin. The .client suffix keeps browser initialization out of server rendering.
- [Svelte](https://tracwell.app/docs/frameworks/svelte.md): Initialize Tracwell in the browser entry before mounting the Svelte application.
- [SvelteKit](https://tracwell.app/docs/frameworks/sveltekit.md): Initialize from the root layout with onMount. The callback runs in the browser and is skipped during server rendering.
- [Astro](https://tracwell.app/docs/frameworks/astro.md): For Astro, the CDN script is the simplest integration. Put it once in the shared layout.
- [Angular](https://tracwell.app/docs/frameworks/angular.md): Use a root-provided service and guard initialization with isPlatformBrowser when the application uses server rendering.
- [Solid and SolidStart](https://tracwell.app/docs/frameworks/solid.md): Initialize from a root component with onMount. Solid runs onMount once in the browser and skips it during server rendering.
- [Qwik](https://tracwell.app/docs/frameworks/qwik.md): Analytics needs eager browser initialization in Qwik, so use a root-level visible task with the document-ready strategy.

Do not add a router page-view hook unless the router avoids the History API. Manual tracking on standard routes creates duplicate page views.
