June 30, 2026
rrweb 2.0 released
Four years, 344 PRs and a new hosted cloud service!
Eoghan Murray
@eoghanmurrayWe'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
Assetevent 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/recordis 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/replayis 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 existingrrweb-playerpackage which adds the player UI and timeline.@rrweb/typesshared types used by multiple packages@rrweb/utilscommon 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
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:
- rrweb [the most comprehensive list of changes from all packages]
- record [breaking change vs. alpha]
- replay [breaking change vs. alpha]
- rrweb-snapshot [breaking change]
- browser-client [new cloud client]
- packer
- rrdom
- rrdom-nodejs
- rrvideo
- rrweb-player
- types
- utils
- all [breaking change; dropped plugins]
- plugins/rrweb-plugin-canvas-webrtc-record
- plugins/rrweb-plugin-canvas-webrtc-replay
- plugins/rrweb-plugin-console-record
- plugins/rrweb-plugin-console-replay
- plugins/rrweb-plugin-network-record
- plugins/rrweb-plugin-network-replay
- plugins/rrweb-plugin-sequential-id-record
- plugins/rrweb-plugin-sequential-id-replay
Written by Eoghan Murray
@eoghanmurray on GitHubGet started
Ready to try rrweb Cloud?
Free tier, no credit card required. Start recording sessions in minutes.
Sign up free