Privacy Policy
Last updated: May 27, 2026
What we collect
AdMute collects the minimum needed to run the service and to measure how well detection is working:
- Email address — only if you sign in (used for authentication and subscription).
- Account state — subscription status and device count (for the 3-device limit).
- Anonymous usage events — see the full list in the taxonomy table below.
We do not collect: your IP address (raw IPs are SHA-256 hashed with a server-side salt and never stored), your browsing history, the content of pages you visit, page URLs, video titles, or anything you type.
Anonymous usage events (v1.2.0 default change)
Existing installs prior to v1.2.0 had anonymous analytics off by default. With v1.2.0, anonymous events (no IP, no email, no browsing history — only the events listed below) are on by default to help us measure detection accuracy. You can opt out anytime from the popup settings.
Every event carries: a random installation ID (a UUID generated locally on first install, not tied to your identity), the event name, a timestamp, the app version, and the platform (chrome / fire-tv / android-tv). If you are signed in, events are additionally linked to your user ID so you can see your own usage in the dashboard; signing out detaches that link going forward.
The full set of events the extension may emit:
| Event | What it captures | Example data |
|---|---|---|
install |
Fired once when the extension is first installed. | { referrer: "chrome_web_store" } |
daily_open |
Service-worker boot or once-per-day heartbeat (tells us the install is still active). | {} |
service_visit |
A tab navigated to a supported streaming service. We record which service, not the URL. | { service: "youtube" } |
ad_detected |
The detector fired on a service (may or may not have led to a mute). | { service: "hulu", detector: "dom_v3", confidence: 0.87 } |
ad_muted |
The tab was actually muted in response to an ad detection. | { service: "youtube", duration_s: 15, detector: "dom_v3" } |
ad_unmuted_auto |
The detector cleared and the tab was auto-unmuted. | { service: "youtube", duration_s: 15 } |
ad_missed |
Heuristic signal that an ad probably played without us catching it (e.g. unexpected audio during an expected ad window). | { service: "peacock", duration_s: 30 } |
manual_unmute |
You unmuted the tab during an active mute (helps us spot false positives). | { service: "twitch", duration_s: 4 } |
detection_failure |
A detector threw an error during its lifecycle. | { service: "hulu", error_kind: "TypeError" } |
popup_open |
The extension popup was opened. | { from: "toolbar" } |
settings_changed |
You changed a setting from the popup. We record the setting name and the before/after values, not anything else. | { setting: "analytics.enabled", from: true, to: false } |
signin_started |
You clicked Sign in (Google OAuth began). | {} |
signin_completed |
OAuth callback returned and a session was stored. | { subscription_status: "free" } |
signout |
You signed out. | {} |
upgrade_clicked |
You clicked the Upgrade call-to-action. | { from: "popup" } |
upgrade_completed |
Stripe returned a successful subscription. | { plan: "monthly" } |
upgrade_cancelled |
You cancelled the Stripe checkout flow. | { from: "popup" } |
error_boundary |
An unhandled error reached the top-level error handler. The error message and a hash of the stack trace are sent (no source content). | { error_kind: "ReferenceError", stack_hash: "9c1b…" } |
The taxonomy above is versioned (current version: 1.0.0). Any addition will be reflected here and in an updated "last updated" date at the top of this page.
How we use your data
- Authenticate your account and enforce the free-tier daily limit.
- Process payments via Stripe.
- Provide customer support.
- Measure per-service detection accuracy (which services work, which need work) using the anonymous events above.
Data security
- All connections to our API use HTTPS.
- Sessions use signed JWTs with a 24-hour expiry.
- Raw IP addresses are never stored; they are hashed with SHA-256 plus a server-side salt for abuse-prevention only.
- Event payloads are capped at 1 KB and snake_case event names are validated server-side.
Third-party services
- Google OAuth — authentication.
- Stripe — payment processing.
- Cloudflare — hosting (Workers, D1, Pages).
We do not sell or share user data with any third party for advertising or marketing.
Your rights
- Opt out of anonymous events anytime from the extension popup settings.
- Request a copy of your data.
- Delete your account.
- Cancel your subscription anytime.
Contact
Questions? Email us at [email protected]