Record from a browser

@revero/recorder records microphone audio into durable local chunks and uploads it only after explicit confirmation. It never accepts a Revero OAuth client secret or service access token. Its adapter calls your backend for short-lived instructions.

Ready-made React component

1"use client"
2
3import { IndexedDbRecorderStore } from "@revero/recorder/indexeddb"
4import { ReveroRecorder } from "@revero/recorder/react"
5
6const store = new IndexedDbRecorderStore({ databaseName: `meeting-${meetingId}` })
7
8<ReveroRecorder
9 store={store}
10 adapter={{
11 prepareRecording: async ({ contentType, sessionId }) =>
12 fetch(`/api/meetings/${meetingId}/recordings`, {
13 method: "POST",
14 headers: { "Content-Type": "application/json" },
15 body: JSON.stringify({ contentType, sessionId }),
16 }).then((response) => response.json()),
17 completeRecording: async ({ recordingId, idempotencyKey }) =>
18 fetch(`/api/recordings/${recordingId}/complete`, {
19 method: "POST",
20 headers: { "Idempotency-Key": idempotencyKey },
21 }).then((response) => response.json()),
22 }}
23/>

The component exposes explicit start, stop, confirm, retry and discard actions. Chunks remain in IndexedDB until your backend acknowledges the idempotent completion command.

Headless interface

Use useReveroRecorder(options) from @revero/recorder/react for a custom React interface, or createRecorder(options) from @revero/recorder/core when the UI is not React. Both interfaces use the same state machine and RecorderStore contract.

Support matrix

EnvironmentSupported contract
React18 and 19
Next.js SSRImporting the package is safe; recording begins only in a client component
ChromiumCurrent stable and previous stable
FirefoxCurrent stable and previous stable
SafariCurrent stable and previous stable

The release gate builds a clean Next.js fixture, imports all four package entrypoints during SSR, and exercises the user-visible recorder actions in Chromium, Firefox and WebKit.