Session Replay records what a user saw and did in your Flutter application, so you can watch a bug happen instead of reconstructing it from a stack trace. Replays are linked to the RUM session they belong to, so you can move from an error straight to the recording. Session Replay ships as a separate package, atatus_session_replay, and runs on top of RUM.
Session Replay for Flutter is in preview, and parts of its public API may change without a major version update.

Prerequisites

  • RUM is set up in your application. See Flutter Monitoring Setup.
  • Flutter 3.27.0 or higher and Dart SDK 3.6.0 or higher.
  • Android 6.0 (API level 23) or higher, or iOS 15.0 or higher.

Setup

1. Add the package

Add atatus_session_replay alongside the plugin in your pubspec.yaml:
Then fetch the packages:

2. Enable Session Replay

Call enableSessionReplay on your AtatusConfiguration. RUM must be configured for replay to record anything:

3. Add the capture widget

Add a SessionReplayCapture widget at the root of your widget tree, above MaterialApp or your equivalent application widget. A Key is required:
Important: SessionReplayCapture already includes a RumUserActionDetector. If you added one during RUM setup, remove it and keep the one inside SessionReplayCapture, otherwise user actions are recorded twice.

Configuration Options

AtatusSessionReplayConfiguration accepts the following options:
The replay sample rate applies to sessions that sessionSamplingRate already kept, so the two multiply. With the default session rate of 100, a replay sample rate of 30 records a replay for 30% of all sessions. At a session rate of 80, the same replay rate records 24%.

Privacy

Session Replay masks everything by default. Loosen the defaults only for the parts of your application you are sure carry no personal data.

Default privacy levels

TextAndInputPrivacyLevel controls text and input widgets: ImagePrivacyLevel controls images: TouchPrivacyLevel controls touch indicators:

Override privacy for part of the tree

Wrap a subtree in SessionReplayPrivacy to change the privacy level for that part of the application, or to hide it entirely:
Setting an option to null leaves that level unchanged for the subtree.
Important: A hidden subtree is replaced by a placeholder labelled “Hidden” in the replay and its children are never processed, so a widget deeper in the tree cannot be un-hidden. The same applies to TouchPrivacyLevel.hide: touch recording is cancelled for the whole subtree and cannot be re-enabled further down.

Validate That Replay Data Is Being Sent

To confirm the SDK is recording and uploading replays, raise its verbosity before you initialize it:
Verbosity defaults to CoreLoggerLevel.warn, and internal logging only runs in debug builds. Session Replay upload messages from the underlying Android SDK then appear in the device log. Session Replay follows the same tracking consent value as the rest of the SDK, which you set at initialization and can update at any time. See Set Tracking Consent (GDPR).

Current Limitations

  • Recording cannot be started or stopped at runtime. Recording begins when Session Replay is enabled and continues for the session. Use replaySampleRate to control which sessions are recorded, or call enableSessionReplay conditionally to decide at startup.
  • Web view content is not captured in the replay. The recorder walks the Flutter widget tree, so anything a web view renders appears as an opaque region. RUM events from web views are still collected (use the atatus_webview_tracking package for that), but they do not produce replay footage.

Next steps