InvergeDocs

Session replay

Watch what the person actually did — screens, taps, console and network — with text masked by default and correlated to the session.

Replay records an rrweb-compatible stream — screenshot frames and pointer events on Flutter (every platform), the DOM on the web — and plays it back in the console next to the session's events, logs and errors. It is opt-in, because it is billed per event and privacy-sensitive.

Flutter

await Nexus.init(const NexusConfig(
  apiKey: 'nxs_live_xxx',
  replayEnabled: true,
  replayMaskTextFields: true,     // default — every text input redacted
  replayInterval: Duration(seconds: 1),
));
runApp(const NexusScope(child: MyApp()));   // installs the capture boundary
NexusMask(child: CreditCardWidget());                 // never in frames
MaterialApp(navigatorObservers: [NexusNavigatorObserver()]);   // Pages tab
Nexus.instance.replay.observeRouter(router, () => currentPath);  // GoRouter, nested routes
Nexus.instance.replay.trackScreen('checkout');        // manual
Nexus.instance.replay.pause();  Nexus.instance.replay.resume();

Console (debugPrint) and HTTP are captured automatically (replayCaptureConsole, replayCaptureNetwork). With Dio, add NexusDioInterceptor from package:nexus_flutter/nexus_dio.dart; for other clients call replay.recordNetwork(url:, method:, status:, durationMs:).

Web

npm install rrweb
const nexus = Nexus.init({
  apiKey: 'nxs_live_xxx',
  replayEnabled: true,               // starts automatically in the browser
  replayMaskAllInputs: true,         // default
  replayBlockClass: 'nexus-block',
  replayMaskTextClass: 'nexus-mask',
});
await nexus.replay.stop();  await nexus.replay.start();
<div class="nexus-block">never captured</div>
<span class="nexus-mask">4111 1111 1111 1111</span>

Replay is a no-op on Node.

Proxying through your backend

The Python and .NET SDKs can forward replay chunks your clients send to your own backend — for example when the app cannot reach Nexus directly:

client.replay.ingest(recording_id, rrweb_events, distinct_id="user_1", href="/checkout", width=1440, height=900)
await nexus.Replay.IngestAsync("rec_42", events, href: "/checkout", width: 1440, height: 900);

Keep recordingId stable across every chunk of one recording (a new id starts a new recording); at most 5000 events per chunk.

Reference

Flutter · JavaScript · Python · .NET · REST

On this page