Remix

Feedback widget
for Remix.

Mount in root.tsx and the widget survives every navigation.

Remix's nested layouts mean a widget in root.tsx is rendered once and persists for the lifetime of the session. Works with Remix Vite and the legacy classic compiler.

~12kb
gzipped
0
config
MIT
license
Install2 steps
> ~ install· bash
npm install @usero/sdk
> app/root.tsx· tsx
import { Links, Meta, Outlet, Scripts, ScrollRestoration } from '@remix-run/react'
import { UseroFeedbackWidget } from '@usero/sdk/react'

export default function App() {
  return (
    <html lang='en'>
      <head>
        <Meta />
        <Links />
      </head>
      <body>
        <Outlet />
        <UseroFeedbackWidget clientId='YOUR_CLIENT_ID' />
        <ScrollRestoration />
        <Scripts />
      </body>
    </html>
  )
}

Replace YOUR_CLIENT_ID with the id from your Usero dashboard.

Built for Remix

Why teams shipping with Remix pick Usero.

Remix Vite ready

No special transforms or vite-plugin shims. The widget ships as standard ESM with package "exports".

No loader required

The widget needs no Remix loader. It manages its own data fetching against the Usero API.

Persists across navigations

In root.tsx, the widget stays mounted through every <Outlet /> swap. Half-typed feedback survives a redirect.

Works on Cloudflare, Vercel, Netlify

No Node-only APIs in the runtime path. The widget renders identically across every Remix adapter.

Beamer injects a script that initializes after hydration, causing a layout shift. Usero is a Remix component, no shift.
vs Beamer popup

FAQ

Quick answers, Remix edition.

Where exactly should I put the widget in root.tsx?

Inside <body>, after <Outlet /> and before <ScrollRestoration />. That keeps it above your route content in the DOM order.

Does it work with the Remix legacy compiler?

Yes, but Remix Vite is recommended. The widget ESM bundle has package "exports", which the legacy compiler resolves correctly.

Will the widget cause a hydration mismatch?

No. The trigger is a deterministic button. Server and client render the same markup.

Can I tag feedback with the current route?

Yes. Pass metadata={{ route: useLocation().pathname }} and the route appears on every submission in your Usero inbox.

Ship a feedback widget in your Remix app today.

Free tier. No credit card. Two-minute install. Cancel by deleting two lines of code.

Get started free