Reading counts needs no account. Leaving a reaction takes one sign-in with a provider you already use.
Why there's a sign-in at all
Reading reaction counts takes no account of any kind. Signing in matters only when you want to leave a reaction, and the reason is simple: a count is worth reading only if 1 account adds 1 to it. Without something that tells accounts apart, a number is a tally of browser installs rather than of anything
you would want to count.
So Emojery has to recognize you the next time without learning who you are, and it has to be able to show everyone that each account is real. Signing in through a provider you already use does both: the provider vouches for the sign-in, and Emojery turns that into a public proof that names nobody.
This page walks through what each party learns along the way.
New to Emojery? What it actually does comes first; this page is the sign-in half of that story.
The 4 providers
The sign-in card shows 1 button per provider: Google, Apple, Microsoft, Twitch.
Click one and the provider's own sign-in window opens. You approve there, under the provider's rules and with the provider's password, which Emojery never sees. The window closes, the extension receives a short-lived code from the provider, and you are signed in. The whole exchange asks the provider for
exactly 1 thing, the standard openid scope: no name, no email, no picture, no contact list. The request never includes them, so there is nothing to decline.
No password is created on Emojery's side. There is no password to forget, no reset flow, and no password database to leak.
What the provider learns
One fact: that your account signed in to Emojery, and when. That is the same thing any "Continue with Google" button tells Google, and it is the price of a sign-in a public proof can be built on.
Never which pages. The extension does not talk to the provider again until your session expires, 30 days later. What you react to, where, and with which emoji goes only to Emojery's server, and only as a public identifier of the item.
Never your reactions. The provider is not on the path of a reaction at all. Sign in, and it is out of the loop.
Nothing from Emojery back to it. Emojery sends the provider nothing about you after the sign-in, because there is no channel to send it on.
What Emojery stores
The provider hands back an opaque subject id: a string that means "this account" to the provider and nothing to anyone else. Emojery keeps a keyed hash of that id, plus the provider's name, and that is your account record. The key that produces the hash is held outside the database,
so a stolen copy of the database yields no ids, and a guessed provider account cannot be tested against it.
Not stored, because never requested: your name, your email address, your picture, your contacts. The privacy policy lists the record in full, and the FAQ has the short version.
What the public log shows
A pseudonym that rotates every 30 days
Every accepted reaction lands in the public transparency log, and each entry carries a pseudonym rather than an account. The pseudonym comes from a signing key your extension creates on your device once every 30
days. Before the key can sign reactions, the operator signs it too, blind: the extension hides the key while the operator signs, so the signature proves "this key belongs to an enrolled account" without the operator learning which key it signed. The public log therefore shows that the number of keys never exceeds
the number of accounts, and not which key is whose.
A proof that the account is real
Enrolling an account writes 1 more entry to the log: a zero-knowledge proof that the provider signed a sign-in for this account, checked against the provider's published keys, without revealing the account. Anyone running the open-source verifier can check that every account in the log traces back to a real provider sign-in, and that no key signs reactions without such an account behind it. Never in the log: the provider's id for you, or anything a provider could match against its own records.
The public log carries the proof, the blind signatures and the pseudonymous entries, and it is anchored and mirrored outside Emojery's control, so the operator cannot pad a count without opening real provider accounts, and every account opened is visible to anyone who recounts.
One provider account, one Emojery account, one reaction per item
The rule the whole design serves: 1 provider account is 1 Emojery account, and 1 Emojery account holds 1 reaction per item. Changing your emoji replaces the old one; it never adds. Signing in from another browser with the same provider account lands on the same Emojery
account, with the same history and the same reactions.
The honest edge of that rule: someone with 2 provider accounts has 2 Emojery accounts. What the log guarantees is that every account cost a real sign-in with 1 of 4 providers, and that each such account shows up as an enrollment anyone can count.
And if you change your mind, the popup has a "Delete account" button. One click and the account record is gone, and the reactions you left over time are subtracted back out of the counts they belong to. The log keeps
the pseudonymous entries themselves, each with a public revocation appended after it — that reversal is what moves the counts.
Side by side: provider sign-in, device ID
Provider sign-in (what Emojery does)
Device ID / fingerprint
What counts as "you"
Your provider account, the same in every browser
This browser install
Survives a reinstall or a new laptop
Yes
No — a fresh install looks like a new account
Same account in 2 browsers
1 account
2 accounts
Cost of faking 100 votes
100 provider accounts, each visible as an enrollment in the public log
100 free browser profiles
Who learns you use Emojery
The provider you picked
No one
Password
None on Emojery; your provider's, entered on the provider's page
A device or a browser is not an account. Reinstall the browser, buy a new laptop, use Chrome at work and Firefox at home: each is a fresh "account" to a fingerprinting system, and each is free. Counts drift in every direction, and anyone who wants to push a number around opens a new profile. Many similar
extensions take this route anyway; the comparison pages say which.
What we don't store
Signing in with a provider is not the same as handing Emojery a profile. Here is what never lands in our database:
No password. There is no password database to leak.
No email address. The provider is never asked for one.
No real name, and no profile picture.
No raw provider id. Only a keyed hash of it.
No raw IP address stored with your reactions.
No browser fingerprint or hardware identifiers.
No mailing list. There is nothing to unsubscribe from.
A device ID isn't an account. It's a guess that breaks the moment you switch browsers or reinstall. A provider sign-in is an account the provider vouches for, and Emojery turns that vouching into a proof the public can check without learning who you are. The provider learns that you signed in; nobody learns
what you reacted to.
That's the whole deal: one click on a provider you already use, once, in exchange for a number an open-source
verifier can check, accounts included.