Last updated: March 29, 2026
Harvv is built on a simple principle: we should be able to tell you exactly what's broken on your site without knowing anything about your users.
Our entire tracking pixel is under 3,500 bytes. That's smaller than the paragraph you just read. You can view the full unminified source code right now — it takes about 5 minutes to read.
For comparison: Google Analytics is 47KB. Hotjar is 470KB. FullStory is 59KB. You cannot meaningfully audit those scripts. You can audit ours over coffee.
| Signal | What we capture | What we DON'T capture |
|---|---|---|
| Clicks | Element tag, class, first 20 chars of visible text | Not the text in input fields. Not form values. |
| Scroll | How far they scrolled (25/50/75/100%) | Not what content was on screen |
| Text Selection | Which element, how many characters | Not the selected text itself |
| Keyboard | Tab and Escape keys only | No letters, numbers, passwords, or any typed content |
| Identity | Random 8-character hex ID (cookie) | No name, email, IP address, or device fingerprint |
| Performance | TTFB, LCP, CLS (standard web vitals) | No network request URLs or payloads |
The behavioral pixel never sends your visitors' IP addresses. It is not in the payload, and there is no IP column in the database table where behavioral events live, so an IP can never be joined to what a visitor did on your site. That is the claim above, and it holds.
For completeness, because auditors ask: like every web server on the internet, ours does see the connecting IP on each request. That is how a network connection works. We use it transiently, in memory, for one thing only: rate limiting and abuse prevention. We do not store the raw IP. For security investigations our internal access log keeps only a keyed, daily-rotating hash of it (HMAC, not a plain hash) that cannot be reversed back to the address and cannot be linked across days, and it is never joined to any behavioral event. In short: no IP in your analytics, ever, and no raw IP retained anywhere.
navigator.sendBeacon every 10 seconds. JSON payload with short keys (v, s, e, t, d).| Service | Purpose | Data Shared |
|---|---|---|
| Railway | Hosting & database | All event data (stored) |
| Anthropic | AI analysis | Aggregated behavioral patterns (no PII) |
| Resend | Transactional email | Recipient email addresses only |
| Stripe | Payment processing | Billing info (handled by Stripe) |
| Apollo.io | User enrichment (optional) | Signup email for company lookup |
Questions? Email jordan@harvv.com — I'll personally walk you through the code.