Privacy
This site measures how fast your device draws frames and shares the numbers, anonymously, so framebudget's scores and thresholds can be calibrated on real devices instead of one desktop. Nothing here identifies you, and you can say no.
Your choice in this browser
What is collected
One report per page view, sent by the browser to /api/report on this site. It holds only these numbers and names:
| Field | What it is |
|---|---|
| Calibration version | Which set of reference numbers the scores were computed with. |
| Scores | The device score (100 is the reference phone), and the cold and warm benchmark scores, rounded to whole numbers. |
| Kernel rates | How much work each of the four benchmark kernels did per millisecond, to 3 significant digits. |
| Clock resolution | The precision of the page's timer, in milliseconds. |
| Hardware hints | The number of logical cores and the rounded memory size the browser reports, the Compute Pressure state when available, and whether reduced motion is on. |
| Decision | The tier, the effects that ran, and the effects framebudget stepped down because frames were late. |
| Frame rates | The median frames per second of the page and of each effect that reported frames, whole numbers. |
The server adds a few coarse fields from the request and then discards the request headers:
| Field | What it is |
|---|---|
| Browser engine | The engine family (Blink, Gecko or WebKit) and its major version, for example Blink 140. |
| Operating system | The family only: Android, iOS, Windows, macOS, Linux, ChromeOS or other. |
| Form factor | Mobile or desktop. |
| Country | The two-letter country code Cloudflare assigns to the request. |
| Day | The date the report arrived, in UTC, without the time of day. |
What is not collected
- No IP address. Your browser sends it with every request, as it does to any site, but it is not stored.
- No user agent string, only the engine, its major version and the operating system family derived from it.
- No cookies, no identifiers, no fingerprint, nothing that links one visit to another.
- No page addresses, referrers or search terms, and no time of day.
- No analytics or advertising scripts. The report goes to this site only.
When it is sent
- Once per page view, as one
navigator.sendBeaconrequest when the page is hidden or closed, after it has loaded. - Never when Global Privacy Control or Save-Data is on. Both are checked again right before sending.
- Never while a device is simulated or a tier is forced, since those numbers would not describe your device.
- Never after you choose Don't share, here or on the notice at the bottom of the home page. The choice is kept in this browser's
localStorage.
The site also fetches /api/calibration at most once a day, without cookies, to use updated reference numbers on your next visit. It follows the same rules.
Storage and retention
Reports are stored in a Cloudflare D1 database, behind the Cloudflare Worker that serves this site. A daily job deletes every report older than 400 days. The reports are used only to calibrate framebudget: reference rates, thresholds and the score scale. Only aggregated numbers, such as medians and percentiles, are ever published.
On your device
framebudget keeps one localStorage entry per site with the cached score and the effects that stuttered, so the next visit starts with the right effects. The site also remembers your sound and sharing choices. None of this leaves your device.
Contact
Questions, or a request about this data: privacy@framebudget.dev. Since reports carry no identifiers, there is no way to find the reports of one visitor, so none can be shown or deleted individually.