Tracker & SDKs/p/[project]/settings

A 2.9 KB script, and SDKs for the rest

The script you put on other people's pages is the part of an analytics product with the least room for excuses. Falorb's is 2,943 bytes gzipped, has no dependencies, and the build fails if a change pushes it over three kilobytes.

A property's settings page showing the install snippet, public share link, allowed domains, timezone, identity scope, consent mode and retention.A property's settings page showing the install snippet, public share link, allowed domains, timezone, identity scope, consent mode and retention.
Install snippet and property settings

One script tag

The snippet is generated per property and shown on creation and in settings. It patches pushState, replaceState and popstate, so a single-page app reports route changes without any wiring, and calls made before the script finishes loading are queued rather than lost.

An install panel showing the one-line script tag to paste into a site's head.An install panel showing the one-line script tag to paste into a site's head.

What it collects without being asked

Pageviews and sessions, outbound clicks, downloads, tagged elements, form submits, scroll depth, rage clicks, dead clicks, JavaScript errors and unhandled rejections, and all five Core Web Vitals (LCP, FCP, CLS, INP and TTFB), hand-rolled in about 400 bytes rather than pulled from a library.

  • Form identity only. Field values are never captured, at any setting
  • Exit beacon on visibilitychange, not unload, because Safari and mobile skip unload
  • Batched: ten events, or two seconds, or pagehide, whichever comes first
  • sendBeacon with a fetch(keepalive) fallback

The manual API

track, page, identify, group, revenue, reset and consent. identify() is what unifies a person across your properties; reset() is what you call on sign-out so a shared machine does not attribute the next person's session to the last one.

Server-side, where it matters more

The Node SDK is non-blocking, never throws into your request path and batches by identity, because an analytics outage must not become an outage of your product. The React SDK provides a provider and hooks for pageviews and identification. Both are ordinary libraries for your app, separate from the dashboard.

An endpoints panel listing the collector, dashboard and MCP hostnames for this deployment.An endpoints panel listing the collector, dashboard and MCP hostnames for this deployment.
Specifics

How it works, precisely

Size
2,943 B gzip · 2,644 B brotli · CI fails over 3 KB
Dependencies
None
Cookieless mode
Session-scoped id, nothing persisted
Respects
Do Not Track and Global Privacy Control, configurable
SDKs
@falorb/sdk-node, @falorb/sdk-react
Questions

Tracker & SDKs: the usual questions

Will an ad blocker stop it?

It can, and that is true of any analytics script. Serving the collector from your own subdomain, which the reference Caddy configuration does, avoids the block lists that target vendor hostnames. The collector is a separate subdomain from the dashboard specifically so that a rule against one cannot take the other down.

Does it need a cookie banner?

That depends on your jurisdiction and your configuration, and it is not a question a vendor should answer for you. Cookieless mode stores nothing on the device; consent mode refuses opt-in batches at the server until consent is recorded. The dashboard also generates a privacy disclosure from a property's real settings.

Run it yourself this afternoon

Clone the repository, bring up the stack with Docker Compose, paste one script tag. The data never leaves your machines.