Privacy policy

Effective and last updated

The short version

Sparkle collects nothing. No account, no sign-in, no server, no analytics. The extension doesn’t contain any code that can open a network connection, so the pages you read, the sites you visit and the words you’re learning can’t leave your browser. That’s not a promise to behave — there’s simply nothing in it that could send them.

Everything Sparkle knows lives in your own browser, and the only way any of it moves is if you press Export and save the file yourself.

See for yourself

You don’t have to take our word for any of this. Checking takes about a minute:

  1. Watch the network. Open chrome://extensions, find Sparkle, click its service worker, and open the Network tab. Browse as long as you like. Nothing shows up, because nothing is sent.
  2. Read the shipped code. Download the extension from the store, unzip it, and search the JavaScript for fetch, XMLHttpRequest, sendBeacon, WebSocket and EventSource. content.js — the file that reads your pages — has none of them, and no web address at all. The one fetch in background.js loads Sparkle’s own bundled dictionary over a chrome-extension:// address, which is just how an extension reads its own files.
  3. Someone independent has looked. Sparkle’s source isn’t public, but every Firefox release ships a complete source archive to Mozilla for review, and the build is reproducible — what they reviewed can be rebuilt and compared byte-for-byte against the add-on being distributed.

Two more things keep it that way. Every build runs a test that reads the packaged extension and fails if a single network primitive, or any unexpected web address, turns up in it — a future release can’t quietly stop matching this page. And the add-on’s own manifest.json declares connect-src 'self', which means your browser blocks outbound requests itself rather than taking Sparkle’s word for it. That one’s in the zip you just opened.

What is stored, and where

All of it sits in your browser’s local extension storage, on your device:

Sparkle reads the text of the page in front of you to find English words to swap. That happens inside the tab, on the spot — the text isn’t stored and isn’t sent. The dictionary ships inside the extension, so lookups never leave your machine either.

Uninstalling Sparkle deletes everything. There’s no copy anywhere else — worth knowing before you uninstall, so export first if you want to keep your progress.

Moving between browsers

There’s no sync, because sync needs a server. Instead, the options page has an Export button that saves your level, pace and word history as a JSON file, and an Import button that reads one back in. It’s plain, readable JSON — open it and see exactly what’s in it. The file goes only where you put it; Sparkle never sends it anywhere.

Reading words aloud

The card’s “say it” button uses your operating system’s built-in voices — and only the ones that run on your device. Some platforms also offer cloud voices, like Microsoft’s “Online (Natural)” range and Chrome’s Google voices, which work by sending the text to the vendor. Sparkle won’t use those, even where they sound better. On a machine whose only Mandarin voices are cloud ones, the button simply isn’t there.

This website

sparklechinese.com is a static site: a couple of pages of HTML with no database, no accounts, and no endpoint that could receive your data in the first place. No cookies, no analytics, no ad scripts. It’s hosted by Vercel, which serves the requests under its own policy, like any host. The extension never contacts this site, and never runs on its pages.

What Sparkle doesn’t do

Because nothing is collected, there’s nothing to request a copy of and nothing to ask us to delete. Uninstalling the extension is the complete deletion.

Chrome Web Store Limited Use

Sparkle’s use and transfer of information received from Google Chrome APIs adheres to the Chrome Web Store User Data Policy, including the Limited Use requirements. In practice that’s an easy bar to clear: Sparkle receives no user data through those APIs beyond what’s stored locally on your own device.

Changes and contact

If Sparkle’s data practices ever materially change, this page changes first — and the build test above means the code can’t drift away from it without failing. Questions go to tgcc1393@gmail.com.