Why standard session replay fails on Flutter
Standard session replay fails on Flutter web because nearly every popular tool reconstructs sessions from the DOM, and a Flutter web app paints to a canvas with no DOM to reconstruct.
Almost every popular session-replay tool (FullStory, LogRocket, Hotjar, Microsoft Clarity, PostHog) reconstructs sessions from the DOM. Most build on rrweb or an rrweb-style engine, an open-source approach that serializes DOM mutations and replays them as a faithful re-render of the page.
The reason is how Flutter web renders. It does not draw your interface to the DOM. With the CanvasKit renderer (a WebAssembly build of Google’s Skia graphics engine, and the production default for most Flutter web apps) and the newer Skwasm renderer, Flutter paints the entire UI as pixels onto one HTML canvas element. To the browser, and to any tool that reads the DOM, your app is a single opaque rectangle. No buttons, no text nodes, nothing to attach to.
On a Flutter web app there is no DOM to serialize. These tools produce a blank replay, or at best a very low frame-rate video that is hard to act on.
Frame-based recording: the approach that works
The reliable way to do session replay on Flutter web is to record what the engine paints, the rendered frames, rather than reconstruct a DOM that does not exist. That sidesteps the canvas problem entirely. You capture the same pixels your user saw.
The engineering challenge is doing this without wrecking performance. A naive screenshot-every-frame approach can tank frame rate. The goal is capture that stays inside your frame budget so the app still feels native while recording.
What good Flutter session replay looks like
Frame-accurate scrubbing, near-native capture overhead, privacy masking for sensitive fields before anything leaves the device, and a lightweight SDK with minimal bundle impact. Those are the properties Pixeltrace is being built around.
Pixeltrace is in development. Join the waitlist to try it when it launches.