Observability without surveillance — OpenTelemetry-native frontend SDK.
Blindspot emits structured OTel spans from every user interaction: route navigations,
clicks, form submissions, fetch calls, and web vitals. Spans correlate with your backend
traces via W3C traceparent. No DOM snapshots. No PII.
Live demo — run Blindspot, Shield and Scent together in your browser and watch real OTel spans render in-page.
docker compose up -dThis starts three services:
| Service | Port | Purpose |
|---|---|---|
| OTel Collector | localhost:4318 |
Receives OTLP/HTTP spans from the browser |
| Grafana Tempo | — (internal) | Stores traces |
| Grafana | localhost:3100 |
Visualises traces |
pnpm install
pnpm build # builds @tindalabs/blindspot-core and @tindalabs/blindspot
pnpm --filter @tindalabs/blindspot-example-basic devThe example app opens at http://localhost:5174.
- Open http://localhost:3100 (login:
admin/admin) - Navigate to Dashboards → Blindspot — Overview
- Click around in the example app — traces appear within a few seconds
docker compose down| Package | Description |
|---|---|
@tindalabs/blindspot-core |
OTel provider, privacy engine, consent gate |
@tindalabs/blindspot |
Auto-instrumentation (routing, clicks, forms, fetch, vitals, errors) |
@tindalabs/blindspot-react |
React integration — BlindspotProvider, BlindspotRoutes, useSpan |
@tindalabs/blindspot-vue |
Vue 3 integration — BlindspotPlugin, useBlindspot |
@tindalabs/blindspot-svelte |
Svelte / SvelteKit integration |
@tindalabs/blindspot-next |
Next.js integration — App Router + Pages Router |
See ARCHITECTURE.md for the full system diagram, span taxonomy, and privacy model.
See SDK_API.md for the complete public API.
Blindspot is one of three composable browser-layer packages:
| Package | What it does |
|---|---|
| @tindalabs/blindspot | Privacy-first OTel frontend observability |
| @tindalabs/shield | Tamper detection & active content protection |
| @tindalabs/scent | Probabilistic identity continuity |
They compose naturally: Shield attaches shield.* attributes to Blindspot spans, and Scent reads those same attributes as risk signals via observe({ extraSignals: shield.signals }).
See ROADMAP.md — React, Vue, and Next.js integrations are next.
MIT