faq

short answers. if something here points at a bigger problem, link follows.

check that <Remediate /> is mounted (not gated behind a false), no parent has display: none, and no global z-index rule is overriding [data-remediate-widget].

check that your endpoint exists in production and isn't caught by a redirect. log the response status from the network tab.

the package emits "use client" on entry points. import it from a client or server component, both work.

check that you're not rendering <Remediate /> conditionally on something that differs between server and client (e.g. window.innerWidth). the widget itself is hydration-safe.

yes.

the widget is a client component. the server helper (parseFeedback) is server-only.

safe.

types ship with the package.

screenshots and text notes work over plain http. video and voice require https or localhost.

the user denied mic access. tell them to click the lock icon in the address bar and re-enable. there's no way to re-prompt programmatically.

desktop safari uses video/mp4; chrome and firefox use video/webm. the blob is valid either way. key your file extensions off the mime type. mobile safari has no getDisplayMedia at all; the video button is hidden there.

the failure is server-side. log inside your route handler. the most common causes are missing env vars, malformed payloads, and oversized request bodies.

vercel serverless functions cap bodies at 4.5mb. a 30-second screen recording will exceed this. options: switch to edge runtime, upload blobs to storage from the client, or compress recordings before sending.

vercel functions time out at 10s on hobby, 60s on pro. for big uploads, stream blobs to storage from the client and POST only the json envelope to your route.

see reference > csp for required directives.

don't. the widget assumes a single instance per app. mount once at the root.

use <RemediateTrigger asChild>. see reference.

remediate.open() from the imperative api. or use controlled open / onOpenChange props.

post a multipart body with a submission field and zero or more file parts.

add allow="display-capture; microphone" on the iframe. without it, video and voice silently fail.

add a header via the headers prop, validate it server-side.

yes. nothing in the widget prevents abuse. use your platform's rate limiter on the route.

remediate is the client + server helper. you bring the storage. the postgres + drizzle recipe is the all-yours stack.

mit.

github issues. include browser, os, and a minimal repro.

~14kb gzipped core, +8kb for video, +2kb for voice. video and voice are lazy-loaded on first open.

keyboard accessible. focus traps inside the widget when open. screen reader labels overrideable via the messages prop.

yes. pass a messages object. all user-visible strings are keys.

you own everything. remediate has no servers, no telemetry, no phone-home. see privacy.

Made by Parth Patel