Features · what's in the script
Everything browsers can tell you, minus who the visitor is.
§1 · Performance
Vitals with their causes.
| Metric | What you also get |
|---|---|
| LCP | The element (CSS selector, image URL) and its four sub-parts: TTFB, resource load delay, load time, render delay. |
| INP | The slow interaction's target, input type, and its phases: input delay, processing, presentation. |
| CLS | The element behind the largest shift. |
| FCP · TTFB | Plus the full navigation breakdown: redirects, DNS, TCP, TLS, request, response, protocol, transfer size. |
| Context | Back/forward cache restores, prerendered pages (measured from activation), pages loaded in a background tab, and broad buckets for device memory, CPU, viewport and connection. |
§2 · Content & clicks
Which article. Which slot. Which page it came from.
Every click is sent the moment it happens, attached to the page view it happened on, so a click that navigates away is never lost. Middle-clicks and Ctrl/Cmd-clicks that open new tabs count too.
<!-- one attribute per area, one per item --> <section data-cv-region="related-articles"> <a href="/explorer/…" data-cv-item="article:67890">…</a> </section>
No attributes? Links still get a region from the nearest nav, header, footer, aside or main, and a position within it.
- Automatic content detection: article ID, type and category from your JSON-LD (
Article,Product,BreadcrumbList…), a meta tag, or the canonical URL. - Reports: top content by views, engaged time and scroll depth; click-through by region; which slot gets clicked; "where clicks to X come from".
- Engaged time only counts while the tab is visible and the visitor is active.
- Speed vs engagement: clicks per view, reading time and scroll, grouped by each page view's own LCP.
§3 · Single-page apps & HTMX
Route changes are page views. Properly.
History API navigations (Next.js, Nuxt, HTMX's hx-boost and hx-push-url) each become their own page view, with the previous route as the referrer and INP and CLS measured per route.
The trap we handle: after an in-app navigation, <head> often still describes the first page. HTMX's hx-select only swaps part of the body. So after a soft navigation we only trust metadata that was swapped in with the new content, or metadata whose URL matches the current page. Otherwise every article after the first would be credited to the first one.
§4 · Diagnostics
What every third party costs you.
Resources
Every resource, grouped by type, domain and first or third party: requests, bytes, cache hits and render-blocking count. The 50 slowest are kept individually.
Long animation frames
Main-thread time attributed to the script and the function that caused it. Tag managers, consent tools and chat widgets are named.
JavaScript errors
Uncaught errors and rejected promises, grouped so the same error with different numbers counts once, with the pages they happen on.
All of this ships in a separate ~1.4 KB file, loaded only after your page has loaded and the browser is idle. Our own script's cost shows up in your reports too: we send Timing-Allow-Origin so nothing is hidden.
§5 · Delivery
Small, and it stays small.
The core script as served (Brotli). Each browser gets the smallest of zstd, Brotli or gzip that it accepts.
A settings change for returning visitors, sent as a dictionary delta against the version they already have.
Main-thread work before your page loads: the script is async, and data is sent with sendBeacon.
§6 · Being built
On the bench.
- Alerts and performance budgets (email, Slack, Teams, webhooks)
- Deploy markers via API
- Self-serve signup and billing
- Raw data export to your S3 (Parquet) and SSO, for the Business plan
- LCP for in-app navigations, once Chrome's soft-navigation API is stable