Left: what it means. Right: what it's called.

Read the left column and you understand the product. Read both and you can talk to an engineer about it.

Every page here ends up leaning on the same handful of words — the ones for the thing on the page, the thing it counts, the record behind that count, and the little we keep about you. They are all defined once, next to the plain sentence each one stands for, so nothing downstream has to stop and explain itself and nothing here has to be looked up somewhere else.

What you install and use

A small program inside your browser that changes how pages look

extension · add-on

It adds one button to a row the page already has. It doesn't open a separate website, and it only loads on the sites it names.

A site Emojery was built to work on

supported site

The extension names its sites in advance and the browser holds it to that list. The current one is on the home page; new sites arrive with an ordinary update.

One shared set of reactions laid over pages somebody else runs

reaction layer

It isn't a copy of the site's own numbers and the site can't switch it off. Everyone with the extension sees the same layer on the same page.

The button Emojery adds beside the ones already there

reaction button

It shows the top 3 emoji left on that item and the running total. Clicking it opens the picker.

The panel that opens when you click that button

picker

Every emoji in one grid, plus search, your recently used, and the reactions already left on the item. What is in it is on The emoji palette.

The strip of buttons a site puts under a post

action row

Like, Share, Star, upvote — whatever that site offers. Emojery mounts its button inside that same row rather than floating one somewhere over the page.

The site's own Like, Star, or upvote

native button

Emojery leaves it alone by default. 2 settings change that: "Hide original buttons" hides it in your browser only, and "Auto-press original buttons" presses it for you when the emoji you picked has an obvious equivalent.

The panel behind the toolbar icon

popup

Your reaction history, the per-site switches, your account, and the Report tab for a page where the button never appeared.

The per-site part that knows where the button goes

site adapter

Every supported site needs its own, because every site is built differently. When a site redesigns its pages that is the piece that needs updating, and the counts are untouched by it (why).

A small picture of the counts you can paste into a README

reaction badge

The top 3 emoji and the running total, as an image that renders for everyone, extension or not. Build one on Reaction badge. Not to be confused with the number on the toolbar icon, which counts the buttons on the page in front of you.

What gets counted

The one thing on a page a reaction attaches to

target

A video, a post, a repository, a product. 2 people arriving from 2 different links to the same video are reacting to the same target.

The short, stable name a target is counted under

canonical target key

A site name plus that item's own identifier, derived the same way in your browser and on the server, so tracking parameters and link variants all land on the same count. It is what the extension asks about, rather than whatever is in your address bar.

A total with no names attached

aggregate count

42 people picked 🔥, and that's all anyone ever learns. Emojery has no way to show who reacted, because it never publishes that.

One account, one reaction per target

one account, one reaction

Picking a different emoji replaces your old one instead of adding a vote, and picking the same one again takes it back. Holding that rule up is the entire reason there is a sign-in at all.

The number on the page is a fast copy, not the original

counters cache

It is kept so pages load quickly, which is why a count can trail the real one by about a minute. The public record is the authority: add it up again and you get the same totals (why a count can look stale).

The checks that keep obviously fake reactions out of the totals

anti-abuse

Automated and duplicate voting is what they are for. How they decide is deliberately not published, which makes this the one part of the system you cannot recompute — the status page reports it as our own assertion rather than a verifiable one.

How anyone can check it

A public list with 1 line per reaction, in order

transparency log

Anyone can download the whole thing and read every line. Nobody's name is in it. How it is built is on The transparency log.

Lines can be added to the end, never removed or edited

append-only

Changed your mind? That's a new line. Deleted your account? Also a new line, and it subtracts your old reactions back out of the totals.

A short string produced from a piece of data

hash · fingerprint

Same data, same string, every time. Any change, however tiny, produces a completely different one — which is what makes it useful as a fingerprint.

A way of reducing a whole list of fingerprints to a single one

Merkle tree · root hash

Each entry's fingerprint feeds into the one above it, up to a single value covering everything below. Alter any entry anywhere and that top value changes, so an entire history can be checked with 1 comparison.

A fingerprint of the whole list at one moment, signed

signed checkpoint

The signature proves it came from us. The fingerprint proves nothing in the list has moved since it was taken.

Somewhere outside our control where that fingerprint gets published

anchor

A public GitHub folder, an independent archive, a Bitcoin block. We can change our own database; nobody can change a block from last week.

Proof that a fingerprint already existed at a given time

timestamp · OpenTimestamps

Checkpoint fingerprints are sealed into the Bitcoin blockchain through OpenTimestamps. Confirmation takes hours; after that the date is out of anyone's hands, ours included.

Not unbreakable — impossible to break quietly

tamper-evident

The design doesn't try to make a change impossible. It makes every change leave a mark that a stranger can find afterwards, which is a stronger promise than a policy.

Showing one history to you and a different one to everyone else

split view

The classic way a public record gets faked. It is caught by comparing what our servers hand you against the copy published where we can't reach it.

A free program that re-counts everything from scratch

verifier

A separate open-source project with no special access — it sees exactly what you see. Anyone can run it on a schedule. Details on The open-source verifier.

A line that takes earlier reactions back out of the totals

revocation

Deleting an account, or a reaction later identified as abuse, is recorded as a reversal rather than an erasure — so the history stays complete and the total stays correct.

The stated reason attached to a reversal

reason code

A short public label: an account erased at its owner's request, votes reversed after moderation. Every one of them is listed on the revocation feed. It records what was claimed, and no amount of maths can prove the claim was truthful.

The complete code is published, so you don't have to guess

open source

You or anyone else can read what the program actually does before trusting it, and keep reading it after every update.

What we keep about you

The temporary code mailed to you when you sign in

one-time code · passwordless

It works once, then it's dead. No password is ever created, so there is none to forget or leak. Why, on Passwordless sign-in.

The scramble of your email that stands in for it

irreversible salted hash

Your address delivers the code and is then dropped; what stays is a string that can be produced from your email but never turned back into it. That string is your account, so nobody can look an account up by address — not us, and not whoever stole the database.

The pass that keeps you signed in

session token

Kept by the extension on your device and sent with the reactions you submit, so you aren't pasting a fresh code every time. Signing out clears it.

The stand-in label your reactions carry in public

rotating pseudonym

Not a name and not an address. It changes over time on purpose, so the public record can't be used to follow one person from page to page.

The setting that adds rough context to a reaction

Community insights

On, a reaction also carries coarse context such as country and language, for aggregate maps. Off, those fields go out empty. It lives in the popup's settings, and the exact list is in the privacy policy.

The part of an extension that runs inside a page

content script

Anything that draws into a site needs one, which is why your browser warns that the extension can "read and change" data on those sites. Emojery's reads the page to find the action row and the target, and stops there.

A specific thing an extension asks your browser to allow

host permission

Emojery names the sites it supports plus its own. Your browser enforces that list and the extension cannot quietly extend it. The breakdown is on Browser permissions.

The extension's own list of what it may touch

manifest

It ships inside the extension, your browser enforces it, and the install prompt you saw was generated from it. Extending it takes a new store-reviewed release — the current list.

All of it in one sentence

You tap an emoji, it becomes a line on a public list nobody can edit, a fingerprint of that list is published where we can't reach it, and a free program anyone can run adds the whole thing back up.