Every recipe below is the same [Quickstart](/quickstart/) snippet — the only
thing that changes is _where_ you inject it so it lands at the top of `<head>`,
before any tracker.

## Recipes being migrated

Detailed, copy-paste recipes for each platform are being migrated from
`docs/INSTALL.md` § _“Platform & framework recipes”_:

- **Plain HTML** — paste at the top of `<head>`.
- **WordPress** — mu-plugin, a header plugin, or child-theme `functions.php`.
- **Drupal** — `html.html.twig` or a module `hook_page_attachments`.
- **React** (Vite/CRA) — inject in `index.html`; a `useConsent` hook for app code.
- **Next.js** — App Router (`dangerouslySetInnerHTML` in the layout head +
  `next/script`) and Pages Router (`_document.tsx` + `_app.tsx`).
- **Vue 3 / Nuxt 3** — `index.html` or `app.head` in `nuxt.config.ts`.
- **Shopify** — `theme.liquid`, before `content_for_header`.
- **Webflow / Squarespace / Wix** — custom-code / header-injection fields.

:::tip[The rule that makes every recipe work]
Whatever the stack, the goal is identical: the Consent Mode default runs
**first**, and `cmp.js` loads `async`. If your platform has a “defer/optimise
JavaScript” feature, exclude the Lightning scripts from it — see
[Troubleshooting](/guides/troubleshooting/).
:::