All posts
Updates

June 30, 2026

rrweb 2.0 released

Four years, 344 PRs and a new hosted cloud service!

Eoghan Murray

Eoghan Murray

@eoghanmurray

We're writing this from our new home at rrweb.com — find out what's new in 2.0 and see how we are progressing the project into the future.

An alpha that has been through production

This 2.0 release has been "just around the corner" for an embarrassingly long time. We entered the 2.0 alpha back in 2022, soon after unifying rrweb-snapshot & rrweb into a monorepo, and we postponed rubberstamping the final 2.0 release until we finalized the unified build and test environment.

In the meantime rrweb quietly grew into the most widely adopted session replay library on the web, and our alphas are what the largest downstream deployments have been running in production. We aim to establish 2.0 as a stable baseline of battle-tested code that has already been deployed at scale. The only intentional breaking change versus the last alpha (alpha.20) is a security fix in rrweb-snapshot, which doesn't affect direct use of the main record & replay packages.

We're excited to be making this release, have already built on it with a minor 2.0.1 bump, and now have a clear path to getting open PRs merged. We've also shipped the other major part of the equation we've been working on; rrweb Cloud.

Brand new in 2.0

If you are coming from 1.x, here are some big-ticket items in this release:

  • new dedicated record and replay packages (see below)
  • A bunch of performance and bundle-size improvements
  • Incremental improvements in recording coverage (e.g. shadowDOM, AdoptedStylesheets, Custom elements, <dialog>)
  • Canvas and WebGL recording (off by default)
  • Overhauled <audio>/<video> recording
  • Better privacy and masking (see the privacy section and record options)
  • A more mature browser extension
  • The rrvideo package
  • A new websockets based browser-client which interfaces with rrweb Cloud
  • Addition of a placeholder Asset event type to prepare for the Assets PR

Upgrading from 1.x? Please see the release notes section which links to per-package changelogs and highlights breaking & major changes.

Packages, bundling & new build system

Compared with 1.x, we have significantly improved how rrweb is distributed, built and tested.

We've reorganized the published package layout and build outputs. Standard imports should keep working, but deep imports, old typings paths, dist file references, or hardcoded browser bundle filenames may need updating.

Dedicated packages

We removed extra build outputs from the primary rrweb package and moved them into their own dedicated packages.

  • @rrweb/record is where recording-focused code now lives, cutting down on bloat and cross-contamination from the replay package. Note: if coming from 2.x alpha, be sure to check out the release notes.

  • @rrweb/replay is a dedicated package for replay without the recording code included. Note: if coming from 2.0.0-alpha.X, be sure to check out the release notes. Please note this package is distinct from the existing rrweb-player package which adds the player UI and timeline.

  • @rrweb/types shared types used by multiple packages

  • @rrweb/utils common helper code, can be reused outside of rrweb

As well as the main rrweb package which includes all of the above, the @rrweb/all package also includes the packer code to replicate the old dist/rrweb-all.js output, but unlike in 1.x, 'all' does not include any of the plugins.

Plugins

Plugins have been moved into their own standalone packages, keeping optional functionality out of the core bundles unless explicitly required. Each plugin comes as a package pair, one for record and one for replay:

Console Log Capture: capture javascript errors and log info for offline analysis

Sequential IDs: tag each event with an incrementing number to detect missing events

WebRTC canvas streaming: stream canvas content over WebRTC and replay that stream

Update: we've also recently merged the network plugin which will be appearing in the next version!

Dev experience

We unified the build system around a centralized Vite based config across all packages in the monorepo, replacing the previous patchwork of per-package Rollup configs. We also swapped Jest for Vitest giving every package a consistent, stable testing environment.

The default branch in rrweb has recently been renamed from master to main. GitHub should prompt with instructions on how to update your local repository or fork when logged in at github.com/rrweb-io/rrweb.

We hope that the new system is easier to navigate and will encourage more contributions. This release has given us renewed energy to address open PRs and we intend to be more responsive to new issues coming in on GitHub. We have also set up a dedicated email address for responsible vulnerability disclosure.

Hosting it for you: rrweb Cloud

We've recently launched a dedicated rrweb.com domain for the project (including this blog!) and this is all part of a larger effort to make it much easier for your company or startup to embed session replay into your offering, even if your core product is not related to analytics or observability.

The open source packages have thus far been agnostic on how to upload, store and replay the rrweb recording data, and both myself and Justin have found ourselves solving these problems multiple times as part of our consulting work.

We've taken some time out this year to put all this knowledge together and offer it as a commercial service, which we are calling rrweb Cloud. We have built all the gnarly frontend connection and backend storage components so that you can run a web scale session replay product without having to build it yourself. If that interests you, check out the rrweb Cloud product page or get started with the 'Sign Up' button above!

In 2.0 we have shipped the @rrweb/browser-client package which provides realtime websocket connectivity to the cloud backend, full cloud api compatibility, and which, in conjunction with rrweb Cloud, reduces the upload burden for your end users by taking advantage of our server tech.

Our cloud offering builds on the best practices we have developed over the years consulting on rrweb as core team members.

Thank you to our contributors!

rrweb 2.0 was a genuinely collective effort. 344 pull requests went into this release, and none of it would have been possible without the people who reported issues, reviewed code, fixed bugs, and built features alongside the core team of Juice10, eoghanmurray (myself) and YunFeng0817. We're deeply grateful to everyone who contributed and have added a wall of fame on our about page.

Thanks to Yuyz0112 who authored 1.x and has contributed to 2.0 but has since moved on to other projects.

Thank you to:

mydea, wfk007, billyvg, pauldambra, daibhin, benjackwhite, QuentinLowe, dbseel, huangkairan, JonasBa, QxQstar, alailsonko, arredgroup, avillegasn, colingm, dengelke, lele0108, xujiujiu, 0jinxing, AdnaneKhan, AlfieJones, AntonioStipic, BelenLuo-tech, Code-Crash, Cristy94, DexxDing, H4ad, HurricaHjz, KentoMoriwaki, MengZihan712, ababik, andrewpomeroy, boehlerlukas, charliegracie, dkozlovskyi, eliyabar, guntherjh, jeffdnguyen, jlalmes, juliecheng, kevinatown, kirankunigiri, marandaneto, mdellanoce, megboehlert, nafees87n, neilhan, okejminja, patlopes, rahulrelicx, re-fort, riadhmouamnia, rotemreiss, samber, stefansundin, wrongsahil, and zhaobosky.

If you contributed and don't see your name here, please reach out - we want to make sure everyone gets the credit they deserve.

Versioning & open PRs

As mentioned, the code we are graduating from alpha to stable 2.0 today is intentionally very close to the last released alpha (alpha.20). In hindsight those alpha increments would have been better communicated as regular minor, or where appropriate, major releases. Now that we're back on regular versioning, it is much more straightforward to address open PRs, merge and release with discrete versioning. If you are frustrated that yours hasn't landed, now is a great time to flag it for review; likely we just haven't hit the issue ourselves, or haven't had a chance to write the tests we need to keep quality high and prevent future regressions. This release is primarily about giving users a clear stable baseline, not about bundling in a new wave of changes; stay tuned to this blog to hear about those!

Release notes

2.0.0 package-by-package release notes on github:


Eoghan Murray

Written by Eoghan Murray

@eoghanmurray on GitHub
More posts

Get started

Ready to try rrweb Cloud?

Free tier, no credit card required. Start recording sessions in minutes.

Sign up free