Menu Home
ProductReplay & DevToolsSignalsCall qualityWhy (AI)Live AssistCanvas recordingPrivacy & complianceSelf-hosted
SolutionsHealthcare & virtual careEngineeringSupportProduct teamsKiosks & monitoring
MorePricingDocsCompareTrust centerGlossaryAboutContactPress kit
Log inStart free
Canvas recording

Canvas and WebGL, recorded the smart way.

A canvas is a bitmap with no DOM inside it. Naive approaches freeze the page and eat memory. Backstory treats each visible canvas as a separately budgeted media stream with three capture strategies and a seven-level quality ladder.

Strategies

Chosen automatically, re-evaluated every five seconds.

A

Command recording

For 2D canvases with fewer than about 2,000 draw calls a second: record the drawing commands, replay them exactly. Tiny bandwidth, resolution independent. Image sources are captured once by hash.

B

Frame snapshot

WebCodecs captures a VideoFrame and encodes AV1, VP9, or H.264 in a worker, with keyframes aligned to checkpoints. Unchanged frames are hashed away, so idle dashboards cost nothing.

C

WebGL and WebGPU

No readPixels. Frames are captured as VideoFrames inside the same animation frame, or the app calls markFrame when a scene is complete.

Only what the user saw

Hidden canvases doing background work are never recorded.

Canvas visibility gating rules
TestEffect of failing
Attached to the documentScratch canvases created in JavaScript and never appended are ignored
RenderedNo display none, visibility hidden, opacity zero, or content-visibility hidden on the canvas or an ancestor
Non-zero sizeOn screen and in the backing store
In or near the viewportScrolling out pauses; scrolling in captures a keyframe and resumes
Page visibleA background tab pauses every canvas
Allowlisted or auto-detectStrict privacy mode requires an explicit allowlist

When a visible canvas draws a hidden one onto itself, the source bitmap is captured at that moment. The replay shows what the visible canvas showed; the background work stays invisible. OffscreenCanvas in workers has no DOM presence and is never captured.

Quality ladder

Degrade in steps, and say so.

Canvas quality ladder
LevelMax fpsResolution scaleEncoder targetNotes
L0 Full151.0 (max 1920 px wide)800 kbps per canvasOnly when HEALTHY and visible
L180.75400 kbpsDefault for most sessions
L240.5200 kbps
L320.5100 kbps
L410.3350 kbps
L5 Interaction-onlykeyframe on click, tap, key; else 1 per 10 s0.33burst onlyThe accept-loss tier
L6 Off0——Placeholder with a reason
  1. Governor level memory + drain time
  2. Per-canvas budget bytes per second
  3. Strategy command, video, snapshot
  4. Encode in worker off the main thread
  5. Chunk stream keyframes at checkpoints
Gaps in canvas capture are drawn as a hatched overlay with the reason: bandwidth, hidden tab, or not allowlisted.

The story behind every bug.

Free for 1,000 sessions a month. Strict masking, conditional recording, and Signals are all included.

Get started

Replay your first session in five minutes.

Free for 1,000 sessions a month, no credit card. Or leave a work email and we will reach out about the private beta for healthcare and support teams.