Next.js
Install the Clarm widget in a Next.js App Router or Pages Router project.
Using the npm SDK (recommended)
Installbash
npm install @clarm/widgetApp Router
Add the Clarm initializer to your root layout. Since it accesses the DOM, it must run on the client:
app/providers.tsxtypescript
'use client'
import { useEffect } from 'react'
import { initClarm } from '@clarm/widget'
export function ClarmProvider({ children }: { children: React.ReactNode }) {
useEffect(() => {
initClarm({
apiKey: process.env.NEXT_PUBLIC_CLARM_API_KEY!,
agentId: process.env.NEXT_PUBLIC_CLARM_AGENT_ID!,
theme: 'auto',
})
}, [])
return <>{children}</>
}app/layout.tsxtypescript
import { ClarmProvider } from './providers'
export default function RootLayout({ children }) {
return (
<html>
<body>
<ClarmProvider>{children}</ClarmProvider>
</body>
</html>
)
}Pages Router
pages/_app.tsxtypescript
import { useEffect } from 'react'
import { initClarm } from '@clarm/widget'
export default function App({ Component, pageProps }) {
useEffect(() => {
initClarm({
apiKey: process.env.NEXT_PUBLIC_CLARM_API_KEY!,
agentId: process.env.NEXT_PUBLIC_CLARM_AGENT_ID!,
})
}, [])
return <Component {...pageProps} />
}Using the script tag
Alternatively, add the script tag via Next.js Script component:
app/layout.tsxtypescript
import Script from 'next/script'
export default function RootLayout({ children }) {
return (
<html>
<body>
{children}
<Script
id="clarm-config"
strategy="beforeInteractive"
dangerouslySetInnerHTML={{
__html: `window.__CLARM_CONFIG__ = {
apiKey: '${process.env.NEXT_PUBLIC_CLARM_API_KEY}',
agentId: '${process.env.NEXT_PUBLIC_CLARM_AGENT_ID}'
}`
}}
/>
<Script
src="https://cdn.clarm.com/widget/clarm-widget.min.js"
strategy="afterInteractive"
/>
</body>
</html>
)
}Environment variables
.env.localbash
NEXT_PUBLIC_CLARM_API_KEY=clarm_pk_your_key_here
NEXT_PUBLIC_CLARM_AGENT_ID=your_agent_id_here