Open Source
Record & Replay

Leave your screen recorders behind. Record and replay your user journey perfectly in one simple JSON file.

Live application screen being recorded
{
  "type": 2,
  "data": {
    "node": { "type": 0, "childNodes": […] }
  },
  "timestamp": 1716220800123
},
{
  "type": 3,
  "data": {
    "source": 2, "type": 1,
    "id": 42, "x": 320, "y": 180
  },
  "timestamp": 1716220801456
},
{
  "type": 3,
  "data": {
    "source": 5, "id": 84,
    "text": "hello@example.com"
  },
  "timestamp": 1716220802789
}

The session recording and replay engine powering entire industries.

SentryGold Sponsor
PostHogGold Sponsor
PendoGold Sponsor
HighlightGold Sponsor
Mixpanel
Datadog
Amplitude
New Relic

Record

A browser library that captures the DOM and user interactions as a structured event stream, designed to run quietly on your pages at any scale.

Lightweight

Smaller than video, by orders of magnitude
  • DOM events stay cheap to capture, transmit, store, and retain at scale.
  • Minimal CPU overhead in the browser, so recording stays invisible to the user even on busy pages.

Reliable

Deterministic and private by design
A strongly-typed event stream means a recording made today replays the same way tomorrow. Sensitive fields can be masked, blocked, or ignored in the browser, so you decide exactly what ever gets captured.

Battle-tested

Hardened by years in production
The recording engine inside Sentry, PostHog, Datadog, and other products teams already rely on. MIT-licensed, with ~20k GitHub stars.

Extensible at the record side

Custom events
Add your own application semantics onto the same timeline with one call, record.addCustomEvent(tag, payload). Events like "checkout started" or a caught error live alongside the DOM mutations.
Record plugins
A small, typed contract (a unique name, an observer function, and options) passed into record({ plugins }). The observer hooks a timer, a socket, or a third-party SDK and folds its output into the stream.
Packer hook
Compress events on the way out with packFn, for smaller storage and faster transfer.
Bundled plugins
console-record captures console logs, warnings, and errors with their arguments; canvas-webrtc-record streams <canvas> contents over WebRTC; sequential-id-record stamps ordering IDs for cross-session correlation.
// start recording, emit the structured event stream
import { record } from '@rrweb/record';

record({
  emit(event) { send(event); },        // store however you like
  maskAllInputs: true,                  // privacy at the source
  plugins: [ getRecordConsolePlugin() ] // opt-in extensions
});

// annotate the timeline with your own semantics
record.addCustomEvent('checkout-started', { cartId });

Replay

A deterministic engine that rebuilds a recorded session and plays it back with pixel-perfect fidelity, ready to embed in your product and adapt to your needs.

Extensible and customizable

Replay plugins
A typed handler receives each event during playback, so an extension can render its own data on top of the reconstructed session.
Customizable player
rrweb-player ships with pause, fast-forward, variable speed, skip-inactivity, and drag-to-seek. Restyle it, or build your own player on the same engine.
Annotated timelines
Custom events you recorded can be styled and surfaced as markers on the timeline, so business moments are visible during playback.
Interactive playback
Interaction is off during replay by default, and can be enabled or disabled programmatically for use cases that call for it.
Bundled plugins
console-replay renders captured console output during playback; canvas-webrtc-replay plays back <canvas> streamed over WebRTC; sequential-id-replay validates event order using the IDs stamped at record time.
session-replay.rrweb.com
00:42 / 01:36

Color scheme

Common use cases

Bug reproduction

Replay the exact session behind a bug, with the actions, console output, and DOM state that produced it.

Product & UX analysis

Watch real sessions tied to your product events to understand where and why users hesitate or abandon a flow.

Support & dispute evidence

Resolve tickets and disputes from the customer's actual session.

Behavioral data for AI agents

Feed structured session data to agents that can reason over real browser behavior.

Live modereal-time

Replay events as they arrive with liveMode and startLive(), the foundation for live debugging and support while a session is still in progress.

Co-browsingbeta

Combine live mode with the canvas-WebRTC plugin to watch a session as it happens and collaborate in real time, in the browser, with no installs for the end user. Cloud will package this for you.

Get rrweb your way

Self-host rrweb

MIT-licensed and free to run in your own stack.

Star on GitHub19.8k

rrweb Cloud

Hosted ingestion, storage, replay, and AI. We run the pipeline so you can ship.

Explore Cloud