Existing “ad block detectors” tell you whether a blocker exists on the visitor’s machine. They don’t tell you which third-party tools you actually rely on are blocked. Optimizely and PostHog have very different block rates. So do GA4 and Segment. Knowing the per-provider number is the difference between “ignore it” and “we should reverse-proxy this one server-side.”
blockrate measures it. Three tiers depending on how much infrastructure you want to run:
- OSS library (1.6 KB, zero deps) - drop into any web app, point at any reporter. First-party origin only, by design - third-party reporter URLs are themselves blockable, defeating the purpose. The core README explains why this is load-bearing.
- Self-hosted server -
bunx blockrate-serverand you have an ingestion server with SQLite by default (Postgres optional via Drizzle), a built-in dashboard, and an API key. One binary, one command. - Hosted version (blockrate.app) - sign in, get a key, see per-provider rates. For people who don’t want to operate any of the above.
Built on Bun + Drizzle for the server, TanStack Start + Better Auth for the dashboard. Framework adapters for Next.js, TanStack Start, SvelteKit, Nuxt, SolidStart, and vanilla JS in the box. Source at github.com/afonsojramos/blockrate.