Skip to content
Everframe Docs
Documentation

Session replay

Native VTree replay on iOS and Android; rrweb DOM replay on web.

Updated

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:

SessionReporterReplay coverage
Report sessionOnSessions that can file a report (samplingRate)
Crash-only sessionOffCrash-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.