Before you install

Installing an extension is an act of trust, so six honest doubts deserve straight answers — quoted the way people actually ask them, each ending with a way to check it yourself. Proof, not promises; “trust us” is not an argument.

“Do I really have to install an extension?”

Yes. Web Reactions draws a reaction button inside the pages you already read, next to each site's own buttons, and only a browser extension can do that. No website or bookmarklet could do the same job.

What we can do is make leaving cheap. Uninstalling takes two clicks and removes everything with it, because your reaction history lives only on your device. If you made an account, deleting it from the popup erases your server record and subtracts every reaction you left from the public counters. Trying Web Reactions is a fully reversible decision; the exit is as fast as the entrance.

The build you install is not a black box either: store releases go through the stores' own review, the complete source is public under GPL-3.0, and you can build and install it from source if you would rather run a copy you compiled yourself.

Check it: read the source code; what deletion erases is in the privacy policy.

“What permissions does it ask for?”

Three standard ones. storage keeps your settings and reaction history on your device, alarms lets the background worker wake briefly to send queued reactions, and activeTab lets the popup see which site you are on so it can offer the right per-site toggle.

Site access is limited to the nine supported sites plus our own API. For scale: most ad blockers and password managers ask for access to every website you will ever open. Web Reactions has no such grant — the browser refuses to load it anywhere outside that nine-site list. It requests no tabs, no cookies, no webRequest, no scripting, and no identity permission.

Check it: the permission-by-permission breakdown, with the exact host list from the manifest, is on Browser permissions. Your browser renders the same list in the install prompt and in its extension settings, straight from the manifest; our copywriting cannot touch it.

“Is it going to read my pages?”

On the nine supported sites, it reads the page locally for exactly two purposes: finding where the reaction button belongs, and deriving the public identifier of the item you react to. That analysis happens in your browser and stays there.

What actually leaves is small and boring. Showing counts sends an anonymous lookup for the public items on your screen. Reacting sends the item's canonical URL, your emoji, and your session token. Nothing you type is read, private pages get no button at all (private repositories, closed accounts), and unsupported sites send nothing because the extension is never loaded there.

Check it: the complete “when a URL leaves your browser” list is on Browser permissions, and the 60-second audit below lets you watch the traffic yourself.

“Do I have to sign up?”

Not to look. Reading counts is anonymous and needs no account. Reacting needs one verified email so that one person counts as one vote — and that is the entire “registration”: a verification code, no password, no profile, no social login that would tell Google or Facebook what you react to.

And the email is not kept. It is used once to deliver the code, then discarded; what remains is an irreversible salted hash that acts as your account identifier. Even we cannot look up an account by email address.

Check it: the one-person-one-vote reasoning is on Passwordless sign-in; everything the server stores is listed in the privacy policy.

“How do I know it isn't tracking me?”

Start with what is not there. The extension ships no analytics library, no fingerprinting, no tracking cookies, and no advertising SDK. It collects nothing from pages you did not react on, it cannot see sites outside the supported nine, your reaction history never leaves your device, and raw IP addresses are not stored (a salted hash is used for rate-limiting only).

There is also no incentive to track you. Web Reactions has no ads, no data buyers, and no investors; it is a donation-funded open-source project, and tracking you would be a cost, not a revenue line.

One honest footnote: an optional analytics toggle exists in settings. If you turn it on, reactions you submit carry coarse context such as country and language for aggregate maps. It stays off until you opt in.

Check it: the full not-collected list is in the privacy policy, the source is public, and the 60-second audit shows you the wire.

“Almost nobody is on it yet — why install?”

Fair, and we will not pretend otherwise: Web Reactions is in public beta and the community is small. Most products hide that; we would rather answer it.

First, small numbers here are real numbers. Every count can be recomputed from the public log by anyone, so we could not pad the totals to look busier even if we wanted to — the log would expose us. On the big platforms, big numbers routinely include bots and paid reach. Here, a 3 means three people.

Second, the extension is useful before any crowd arrives. It counts reactions where platforms hide or removed them, it gives you the full emoji palette instead of a single Like, and it keeps a private local history of everything you reacted to. Return YouTube Dislike started in the same empty room, with the same question hanging over it.

And an early reaction simply matters more: on a young network, each vote is a visible share of the signal instead of a rounding error.

Check it: the trust model behind “real numbers” is on Counts you can trust; the audit below recomputes them in one command.

What it cannot do, by construction

Policies can change and promises can be broken, so this page prefers a stronger currency: things the system cannot do the way it is built. Each one comes with its proof.

The 60-second audit

If a page written by a project about itself does not convince you — good instinct. These three checks require no trust in us at all.

  1. Ask your browser, not us. Open the extension's entry in your browser's extension settings, or the store listing before installing. The permission list and the exact site list are rendered by the browser directly from the manifest.
  2. Watch the wire. On a supported page, open DevTools, switch to the Network tab, filter by webreactions.app, and react to something. Every request this page described is there, and you can open each one and read every byte it sends.
  3. Recompute our numbers. One command replays the public log, checks every signature, and compares the replayed totals against the live API:
npx web-reactions-verify --api https://api.webreactions.app \
  --repo https://raw.githubusercontent.com/khasky/web-reactions-log/main \
  --target github/1

Add --ots to walk each checkpoint down to the Bitcoin block that seals it. The same checks run daily against production and feed the public status page.

Decide on evidence, not vibes

Read the permissions, watch the network tab, run the verifier — and install when the evidence satisfies you. If it never does, that is a fine outcome too; the checks stay public either way.