Skip to Content
NotPixel SDK v1.0.1 — Now with caching, hooks, and browser tracking!

Transparency Report

Version: 1.0 Last Updated: January 2025 Applies to: NotPixel SDK v1.0.1+

This document provides complete transparency about how NotPixel handles user data, our privacy architecture, and the technical guarantees we provide.


Executive Summary

AspectOur Commitment
Text StorageZero — we never store user text
User ProfilingNone — no user profiles are created
Cross-Site TrackingNone — no tracking cookies or identifiers
Data SalesNever — we don’t sell any data
PII TransmissionBlocked — sanitized before leaving device

Our Core Principle: Contextual advertising doesn’t require personal data. We match ads to content, not to people.


Contextual Integrity & Independence

The “Church and State” Separation

A critical aspect of our transparency is the absolute separation between Organic AI Responses and Sponsored Content.

  • No Influence: Advertisers have zero ability to influence the generation of AI tokens.
  • No Bias: The AI model is strictly blind to the ads being shown. It does not “recommend” a product unless it is part of its training data and relevant to the query organically.
  • Visual Distinction: Ads are rendered in separate UI containers, clearly labeled as Ad, Sponsored, or Promoted, ensuring users never confuse an ad for AI advice.

Privacy Architecture

Data Flow Overview

┌─────────────────────────────────────────────────────────────────────────┐ │ USER'S DEVICE │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ User Input: "Help me with my SQL query, email me at john@company.com" │ │ │ │ │ ┌───────────────┴───────────────┐ │ │ │ │ │ │ privacy: true privacy: false │ │ │ │ │ │ ▼ ▼ │ │ ┌──────────────────┐ ┌──────────────────┐ │ │ │ Local Embedding │ │ PII Sanitizer │ │ │ │ (Transformers.js)│ │ │ │ │ └────────┬─────────┘ └────────┬─────────┘ │ │ │ │ │ │ ▼ ▼ │ │ [0.12, 0.34, ...] "Help me with my SQL query, │ │ (384 numbers) email me at [email]" │ │ │ └──────────────────────────────┬──────────────────────────────────────────┘ │ HTTPS (TLS 1.3) ┌─────────────────────────────────────────────────────────────────────────┐ │ NOTPIXEL API │ ├─────────────────────────────────────────────────────────────────────────┤ │ │ │ 1. Receive embedding vector OR sanitized text │ │ 2. Match against ad embeddings (cosine similarity) │ │ 3. Return relevant ad │ │ 4. Discard input immediately (not stored) │ │ │ └─────────────────────────────────────────────────────────────────────────┘

Data Categories

What We Receive

Data TypeWith privacy: trueWith privacy: false
User’s original textNeverNever
Embedding vectorYes (384 numbers)No
Sanitized textNoYes (PII removed)
Publisher IDYesYes
TimestampYesYes

What We Never Receive

  • Email addresses (replaced with [email])
  • Phone numbers (replaced with [phone])
  • Names or personal identifiers
  • IP addresses (not logged)
  • Device fingerprints
  • Location data
  • Browsing history

Technical Guarantees

1. Embedding Irreversibility

When using privacy: true, text is converted to a 384-dimensional embedding vector locally on the user’s device. This transformation is mathematically irreversible.

Why embeddings cannot be reversed:

PropertyExplanation
Information Loss384 numbers cannot encode the full vocabulary of human language
Many-to-One MappingInfinite possible texts map to similar vectors
No Lookup TableThe model doesn’t store word↔number mappings
Continuous SpaceSmall text changes create small vector changes, but reverse is impossible

Mathematical basis:

  • Embedding dimension: 384 (bge-small) or 768 (bge-base)
  • Input space: Infinite (all possible text strings)
  • Compression ratio: Infinite → 384 (extreme information loss)
Example: "How to optimize PostgreSQL?" → [0.123, -0.456, 0.789, ...] "PostgreSQL optimization tips" → [0.125, -0.452, 0.791, ...] (similar vector) "Best pizza recipes" → [-0.892, 0.234, -0.567, ...] (different vector) The vector [0.123, -0.456, 0.789, ...] could have come from millions of different sentences. Reversal is impossible.

2. PII Sanitization

All text is sanitized client-side before transmission:

PatternReplacementRegex
Email addresses[email]/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g
Phone numbers[phone]/(\+?[\d\s\-\(\)]{10,})/g

Additional protections:

  • Text truncated to 256 characters maximum
  • Sanitization happens in SDK (client-side), not server
  • Original text never leaves the device

3. Zero Data Retention

DataRetention Period
User text0 seconds — never stored
Embedding vectors0 seconds — used for matching only
Request logs30 days — anonymized, no content
Impression/click events90 days — for billing only

We physically cannot show you your users’ data because we don’t have it. There’s nothing to delete because nothing is stored.


Comparison: NotPixel vs Traditional Advertising

AspectTraditional AdsNotPixel
User profilesYesNo
Cross-site trackingYesNo
Cookie syncingYesNo
Behavioral targetingYesNo
Data brokersOftenNever
RetargetingYesNo
Data storedYearsZero

How We’re Different

Traditional Advertising:

  1. Track user across websites
  2. Build behavioral profile over months
  3. Sell/share data with partners
  4. Target based on personal history

NotPixel:

  1. Analyze current context only
  2. Match ad to content (not person)
  3. Forget everything immediately
  4. No profile, no history, no tracking


User Choice & Control

We believe users must have agency over their ad experience.

  • Opt-Out: Users can choose to use the privacy: true mode (if supported by the publisher integration) to prevent any semantic matching.
  • Feedback Loop: We are building mechanisms for users to “Hide” or “Report” specific ads, directly influencing the relevance feedback loop.
  • Data Clearing: Since we store zero user history, “clearing data” is effectively instantaneous and automatic after every session.

Privacy Modes Explained

Mode 1: privacy: true (Maximum Privacy)

const ads = new Ads({ publisherId: 'pub_xxx', privacy: true, });

Data flow:

  1. Text is embedded locally using @huggingface/transformers
  2. Only the embedding vector (384 numbers) is sent
  3. Original text never leaves the device
  4. Server matches vector against ad embeddings

Best for: Healthcare, legal, financial, any sensitive context

Mode 2: privacy: false (Standard)

const ads = new Ads({ publisherId: 'pub_xxx', // privacy: false is default });

Data flow:

  1. PII (emails, phones) is removed client-side
  2. Sanitized text is sent (max 256 chars)
  3. Server generates embedding and matches
  4. Text is discarded after matching

Best for: General use where content isn’t sensitive


Regulatory Compliance

GDPR (EU General Data Protection Regulation)

ArticleRequirementNotPixel Compliance
Art. 5(1)(c)Data minimizationOnly semantic context used
Art. 5(1)(e)Storage limitationZero storage of user data
Art. 6Lawful basisLegitimate interest (contextual ads)
Art. 17Right to erasureNothing to erase
Art. 25Privacy by designPrivacy is architectural, not policy

LGPD (Brazil Lei Geral de Proteção de Dados)

ArticleRequirementNotPixel Compliance
Art. 6Purpose limitationOnly ad matching
Art. 6NecessityMinimal data collection
Art. 16Data deletionImmediate (no storage)

CCPA (California Consumer Privacy Act)

RequirementNotPixel Compliance
Right to knowThis transparency report
Right to deleteNothing stored to delete
Right to opt-outprivacy: true mode
No sale of dataWe never sell data

Security Measures

Transport Security

MeasureImplementation
EncryptionTLS 1.3 (HTTPS only)
CertificateLet’s Encrypt, auto-renewed
HSTSEnabled, 1 year max-age
API AuthenticationPublisher ID + optional API key

Infrastructure Security

MeasureImplementation
HostingVercel Edge Network
DDoS ProtectionCloudflare
DatabaseNeon PostgreSQL (encrypted at rest)
SecretsEnvironment variables (never in code)

Verification

How to Verify Our Claims

  1. Network Inspection: Use browser DevTools to see exactly what’s transmitted → See Network Inspector Guide

  2. Open Source SDK: Review our client-side code → Sanitization: src/sanitize.ts → Embedding: src/embedding/local.ts

  3. Request Your Data: Contact us to request any data we have about your publisher account → We can only provide billing/impression data (no user data exists)

Independent Audit

We welcome security researchers to audit our systems. Contact: security@notpixel.ai


Incident Response

If a Breach Occurred

Even in a hypothetical breach scenario:

Data TypeRisk
User textNone — not stored
User profilesNone — don’t exist
EmbeddingsLow — irreversible, no PII
Publisher accountsMedium — email, billing info

Breach Notification

We will notify affected publishers within 72 hours of discovering any breach, as required by GDPR.


Contact

Privacy Questions: privacy@notpixel.ai Security Issues: security@notpixel.ai General Inquiries: hello@notpixel.ai


Changelog

VersionDateChanges
1.0January 2025Initial release

This transparency report is updated with each major SDK release. We believe privacy should be verifiable, not just promised.