How this works

Notes on where the numbers come from, and on the parts that are currently wrong.

What it is for

Chatspike watches Twitch chat across a lot of channels at once and tracks how busy it gets around one particular game or event.

Most stream analytics are built around a single channel, and answer questions about that streamer. This is pointed at the other thing: whether a release is getting a reaction anywhere, across whoever happens to be playing it or talking about it at the time. The numbers here are always sums across a roster of channels, never one person's chat.

What gets stored

Messages are counted into one minute buckets. The text is not stored and neither are usernames. What gets written down is a count of messages, a count of distinct people, which emotes turned up, and whether the message mentioned a keyword configured for that release. Usernames are hashed in memory so that someone talking twice in a minute counts once, and the hashes go away when the bucket closes.

Channels come from two places. Each release has a short hand written list, and a discovery loop checks every few minutes for streams that are either in the release's own category or have a title containing a phrase specific enough to mean this game rather than the series it belongs to. That last part matters more than it sounds. A title containing gta could be almost anything.

Why people counts do not add up

Message counts can be summed. People cannot. Somebody watching three streams is one person, and somebody who talks in two separate minutes is still one person. So the ten second, one minute and one hour figures are each tracked as they happen rather than being derived from one another. Adding up ten second buckets to get a minute overstated a real one by 53% when it was checked against live data.

What counts as a moment

A spike has to clear three things to be recorded: at least three times the median of the preceding half hour, at least fifty messages a minute, and held for at least two minutes.

Those numbers came out of looking at the distribution rather than picking round ones. Minute to minute variation sat around 1.6x at the 90th percentile and 6.8x at the 99th, so three is uncommon without being so rare that nothing ever fires. Dropping it lower mostly produced noise.

Moments are kept indefinitely, and each one stores its own summary of who was loudest and what was being said, because the minute by minute data behind it gets deleted after thirty days.

On topic, and when we will not say

Chat being busy in a set of channels is not the same as chat being about the release. A large streamer going live moves the first and not the second. So a moment also records what fraction of messages mentioned the release, next to how that release normally runs.

The denominator is messages that contained words, not all messages. During an emote wall nobody can type a keyword even if they want to, and treating that as evidence of going off topic would discard the loudest reactions, which tend to be the moments when emote only mode gets switched on in the first place. Those show up as unmeasurable instead of as a number.

Which words count as evidence depends on the release, and this was set up wrong the first time. For GTA VI, gta 6 and rockstar count and bare gta does not, because that roster picks up a lot of Just Chatting streams where the word could mean any game in the series. For the WoW race it went the other way: those channels are already race specific, and the words people type while actually watching are pull and kill, so those count. Leaving them out made real moments read as zero percent on topic.

There is also a floor. If only a handful of messages mentioned the release, the share is shown with a tilde and no comparison, because a percentage resting on one or two messages is not really a measurement. One moment reported 0.4% against a usual of 3.8% off the back of a single message before this was fixed.

No sentiment score

There is no number claiming chat was 0.62 positive. That implies a precision this data does not have, and there would be no way to check it.

Chat does have a vocabulary, though. LUL is amusement, Kappa is sarcasm, monkaS is anxiety. So a moment carries a rough breakdown across a few categories like that, along with a count of terms it could not place at all. The unclassified count is there so it is possible to see how much of the chat went unread.

Things that are currently wrong

Listed because they are known, not because they are fixed.

What it cannot tell you

It cannot tell you why chat reacted. It records that something happened, roughly how big it was, which channels were loudest, and which words and emotes were around at the time. Whether that was a trailer, a leak, or something on one streamer's screen is a guess, and not one the tool makes on your behalf.

Where a cause is actually known it gets marked on the chart as an annotation. Those are written by hand from a source with its own timestamp, and they say what happened rather than what caused the spike. The reader can join those up.