Framework mode or library mode. Works in loaders, layouts, and root routes.
Drop the widget into your root route so it persists across navigations. The component is render-safe under React Router 7 framework mode (formerly Remix) and library mode.
npm install @usero/sdkimport { Outlet, Scripts, ScrollRestoration } from 'react-router'
import { UseroFeedbackWidget } from '@usero/sdk/react'
export default function Root() {
return (
<html lang='en'>
<body>
<Outlet />
<UseroFeedbackWidget clientId='YOUR_CLIENT_ID' />
<ScrollRestoration />
<Scripts />
</body>
</html>
)
}Replace YOUR_CLIENT_ID with the id from your Usero dashboard.
Built for React Router 7
Works under react-router dev (SSR + hydration) and in pure client-side React Router apps.
Placed in root.tsx, the widget keeps its state through every loader, action, and navigation.
The widget is a leaf component, so it does not need a clientLoader or hydrateFallback to render.
No Node-only APIs. The widget renders the same on Workers, Vercel, Netlify, and self-hosted Node.
Frill ships an iframe that loses state on every soft navigation. Usero stays mounted across React Router transitions.
FAQ
Yes. Mount it inside the <body> of your root.tsx, alongside <Outlet />, <ScrollRestoration />, and <Scripts />.
Render the widget anywhere outside <RouterProvider />, or inside a root layout route. Either works.
No. The trigger renders identically on server and client. Hydration is a no-op.
It does not. The widget has its own POST to /api/feedback at usero.io, separate from your React Router data flow.
Free tier. No credit card. Two-minute install. Cancel by deleting two lines of code.
Install guides