Every third-party script promises it is lightweight. The promise is worth nothing, because the thing that hurts your page is rarely the number in the marketing copy — it is the fourth chunk that loads on scroll, or the observer that fires during your own animation, or the retry loop that keeps going while the tab is hidden.
So we wrote the limits down as a contract and put a build gate behind it. A bundle over budget fails the build. That is the only version of this claim that means anything.
The numbers
- The loader is capped at 3.25 KiB gzipped, and it is inert. A visitor who never opens the widget downloads that and nothing else, ever.
- The interface is capped at 32.25 KiB and is fetched only from user intent — somebody deciding to report something. Not on load, not on idle, not on hover.
- Every complete load path is capped at 64 KiB. Annotation, element selection, review mode, surveys and replay each get the same ceiling, so no single feature can quietly become the expensive one.
Those figures come from the contract document in the repository, and the same document is what the gate checks against.
Getting out of the way
Budgets only describe the download. The other half is what happens when your page is already under pressure — a heavy render, a slow device, another script misbehaving.
A governor watches what the widget itself costs and steps down through three states:
Healthy is everything you configured, inside every envelope.
Constrained stops session replay for the rest of the page and drops the cheap signal — informational logs, ordinary clicks, successful responses. It keeps what you would actually miss: uncaught errors, navigation, console warnings and network failures.
Protected takes the global hooks off your page altogether. What survives is minimal error capture, the public API, and a person’s ability to write feedback.
The asymmetry is deliberate: escalation is immediate, recovery is slow. Stepping down happens the moment a threshold is crossed. Stepping back up takes sustained quiet — 30 seconds below half usage to leave Protected, another 15 to leave Constrained. A widget that recovered eagerly would spend a struggling page’s budget oscillating, which is the worst of both behaviours.
Why this is the feature
Feedback tooling has a specific failure mode. It is installed once, by someone who cares about it, and then it lives on a page owned by someone who does not — and the day it costs that person a performance regression, it comes off the page and never goes back.
Being unnoticeable is not a nice-to-have for this category. It is the whole job.