The landing page gives you the short version. This is the long one — including the parts that change what the numbers mean, and that you could not guess by looking at the screen.
Two feeds are read continuously: Telegram call channels and X. Every few seconds the newest window of posts is pulled, and anything not seen before is written down with two separate times — when the source says it was posted, and when we caught it.
Only the first of those decides order. Our own capture time is kept so that ingest delay stays visible and never quietly becomes part of the ranking.
Posts do not always arrive in the order they were written. A post that reaches us late but was written earlier still takes its rightful place — a later arrival can correct the record, but a newer post can never displace an earlier one.
Every address candidate is decoded, not pattern-matched. A Solana address has to decode to exactly 32 bytes; a Tron address has to pass its checksum; an EVM address that mixes upper and lower case has to satisfy EIP-55. Anything that only looks right is dropped.
The text of the post is not the only place we look. Addresses inside a quoted post are read too, and inside the post being replied to — nested more than one level deep. On X a lot of the earliest calls sit exactly there: someone quotes a smaller account and the address never appears in their own words. Each address is labelled with where it came from, so the feed can tell you in post from quote from reply.
A ticker is not a contract address. When a post says $ABC with no address, that is deliberately not counted as a mention of the contract — the author never posted one. Counting it would let someone who typed four characters outrank the person who actually published the address. The cost is real and stated plainly in the limitations on the docs page.
Links are read for what they are worth. A pump.fun or explorer link gives us the token. A DexScreener pair link gives us the chain but not the token, because the address in it belongs to a pool — storing it would fill the archive with addresses nobody will ever search for.
The first time an address is seen, the post that carried it becomes that token's zero point. Everything after is measured from there, and the gaps you see in a cascade are the real time between posts.
That decision is made by the database itself, in the same transaction that records the mention — not by the process reading the feeds. Two readers running at once cannot race each other into two different answers, and the count cannot drift.
The first caller is never overwritten by a later post. The only thing that can move it is a post that turns out to be earlier — which happens when a feed hands us posts out of order. Correcting to an earlier truth is the point; drifting to a newer one would destroy it.
A Telegram forward and an X repost are the same act: someone amplifying a call that is not theirs. Both are recorded as mentions and both appear in the feed under the account that shared them — because if you follow that account, that post appeared on your screen and you should see it here too.
Neither can ever become a first caller. Credit for a call belongs to whoever published it, not to whoever moved it fastest. A reposter with 200,000 followers cannot take the zero point from the account that actually found the token.
This rule is enforced in the database, next to the counting itself — not in the code that reads the feeds. That placement is deliberate: there is no path that records a mention while forgetting the rule.
It has an honest consequence. If every mention we have seen for a token is a forward, that token has no first caller at all, and no cascade can be drawn for it — there is no zero to measure from. Kestrel says so instead of picking the earliest forward and presenting a number that looks certain.