On iOS and Android, the native side keeps a rolling window of what the app rendered in memory. When a report is filed that window is frozen and attached; the rest is discarded. Nothing is uploaded unless someone files a report, and there is no screen-recording permission prompt.
Turning it on
Server-gated — enable it for the app in the dashboard, and the SDK picks it up
from GET /api/config on the next start. There is
no client-side switch for replay in the React Native SDK — the server gate
is the only control. If you need it off for a particular build, turn it off for
that app in the dashboard.
Crash-only sessions
An app can turn the on-device reporter off with reporter: { disabled: true } to report crashes
from production builds without recording every session. Each session is one of
two kinds, and the Session replay card in the dashboard sets a replay
coverage for each:
| Session | Reporter | Replay coverage |
|---|---|---|
| Report session | On | Sessions that can file a report (samplingRate) |
| Crash-only session | Off | Crash-only sessions (crashOnlySamplingRate, default 0%) |
Each session draws once, when it starts, and keeps the result: a later rate change applies to new sessions, not to ones already running.
The on-device reporter stays off for the whole session: open() rejects.
An error carries a replay only while its session records. At the default crash-only coverage of 0%, errors from crash-only sessions carry no replay. At 5%, errors from about 5% of crash-only sessions do. See Configuration for the switch.
Format
Native React Native replays are everframe-vtree-v1. On web, the package
re-exports the React SDK and uses rrweb DOM replay. See React session replay
for browser capture behavior.
The recorder runs below your JS, so it captures what the device actually
rendered rather than what React thought it rendered.
It is a frame timeline, not video: a viewport, a list of frames, and per-frame
operations on a lightweight node tree carrying role, frame, text, bg and
masked. That keeps a replay in the tens of kilobytes and means text stays
text — searchable, and redactable before it leaves the device.
Images are content-addressed and optional; the server’s asset mode decides whether they travel at all. See Server config.
Privacy
Views marked sensitive carry masked: true and paint as a solid block. The
masking happens in the producer, before the blob is written — masked content
never exists in the buffer. See Sensitive content.
Cost
The recorder runs on the native UI thread’s cadence, not on every React render,
so a chatty render tree does not multiply the work. replayDurationSec on
the server bounds the window; samplingRate decides what fraction of sessions
allocate a buffer at all.