Skip to main content

Session Replay

Watch exactly what users did before an error occurred. Session replay captures DOM changes, clicks, scrolls, and inputs to recreate the user experience.

Enabling Session Replay

Session replay is disabled by default. Enable it in your SDK initialization:

import { Syntropy } from '@eclosion-tech/syntropy-browser';

Syntropy.init({
projectId: 'your-project-id',
recording: {
enabled: true,
},
});

Configuration Options

Syntropy.init({
projectId: 'your-project-id',
recording: {
// Enable recording (default: false)
enabled: true,

// Mask all input values (default: true)
maskAllInputs: true,

// CSS class to mask text content
maskTextClass: 'syntropy-mask',

// CSS selector for elements to mask
maskTextSelector: '.sensitive-data',

// CSS class to block recording entirely
blockClass: 'syntropy-block',

// CSS selector for elements to block
blockSelector: '.private-section',

// CSS class for elements to ignore
ignoreClass: 'syntropy-ignore',

// Sample rate for recordings (0.0 - 1.0)
sampleRate: 1.0,
},
});

Privacy Controls

Session replay is designed with privacy in mind.

Masking Inputs

By default, all input values are masked. Users will see *** instead of actual typed values:

recording: {
maskAllInputs: true, // Default
}

Masking Specific Elements

Add the syntropy-mask class to mask text content:

<span class="syntropy-mask">John Doe</span>
<!-- Appears as: ******* -->

<p class="syntropy-mask">user@example.com</p>
<!-- Appears as: ***************** -->

Blocking Elements

Add the syntropy-block class to completely hide elements:

<div class="syntropy-block">
<!-- This entire element will be hidden in replays -->
<img src="profile.jpg" />
<p>Private information</p>
</div>

Custom Selectors

Use CSS selectors for more control:

recording: {
maskTextSelector: '[data-sensitive], .pii',
blockSelector: '.credit-card-form, #ssn-input',
}

Viewing Replays

Sessions List

Navigate to Sessions in the dashboard sidebar to see all recorded sessions:

  • Filter by project
  • See session duration, page count, and click count
  • Identify sessions with errors
  • Watch replays

From Error Details

When viewing an error, if the session has a recording, you'll see a "Watch Session Replay" button that takes you directly to the replay.

Replay Controls

The replay player includes:

  • Play/pause
  • Speed control (1x, 2x, 4x, 8x)
  • Skip inactive periods
  • Timeline scrubbing
  • Full-screen mode

How It Works

Session replay uses rrweb to capture DOM changes efficiently:

  1. Initial snapshot - Captures the full DOM on page load
  2. Incremental updates - Records only changes (mutations, inputs, scrolls)
  3. Chunked upload - Sends data in batches to minimize network overhead
  4. Playback - Reconstructs the session in the dashboard

Performance Impact

Session recording is designed to be lightweight:

  • ~50KB added to bundle (rrweb library)
  • Minimal CPU usage - Uses MutationObserver, not polling
  • Batched uploads - Sends every 10 seconds or 100 events
  • Beacon on unload - Uses navigator.sendBeacon for reliability

Sampling

To reduce data volume, you can sample recordings:

recording: {
enabled: true,
sampleRate: 0.5, // Record 50% of sessions
}

Manual Control

Start and stop recording programmatically:

// Start recording manually
Syntropy.startRecording();

// Stop recording
await Syntropy.stopRecording();

// Check if recording
if (Syntropy.isRecording()) {
console.log('Recording in progress');
}

Storage Considerations

Session recordings require more storage than regular events:

Data TypeTypical Size
Error event1-5 KB
Session recording1-5 MB

Plan your storage accordingly when enabling recording.