Skip to content
senn-techsenn-tech
Back to blog
Infrastruktur
Servers, Proxmox and network2026-11-09· By Franz Senn

Scaling Slack and GitHub: Emoji Limit, Load Test, Scatter Queries

Maude Lemaire is a principal engineer and the author of "Refactoring at Scale". She spent nearly eight years at Slack, joined GitHub in 2024 and most recently worked at Cursor. In the episode "Scaling Slack and GitHub with Maude Lemaire" from Gergely Orosz (5 November 2026, 78 minutes) she describes an emoji limit, a load test with 500,000 WebSocket connections and 16 database shards. A newsletter summary attaches several numbers to these stories. We compared them with the episode transcript and with Slack's own texts.

A thundering herd is a load pattern in which one event makes very many clients do the same thing at the same moment, and the system cannot absorb the sum. At Slack it is a message to a large channel that thousands react to at once. Every reaction is pushed to all connected users, so the load grows with reacting users times recipients.

The emoji limit

Lemaire's example: a CEO posts in a company channel with about 100,000 active users that everyone gets Friday off. Everyone opens the channel, reads the history and adds an emoji, according to the episode within the same five seconds. Each reaction goes out over the WebSocket to everyone. One emoji means 100,000 deliveries, and "if you add 10, you can do the math". Slack had already ranked emojis below text messages and dropped them under heavy load.

The figure "10 million for 100 emojis" appears in the newsletter summary and is absent from the transcript. It is 100 times 100,000 and correctly computed, but the arithmetic is the newsletter's.

On the limit itself Lemaire says you can put 23 distinct custom emojis on a message, with as many plus-ones on those emojis as you like. She hedges: "last I checked". The Slack help page on reactions says something different: each member can add up to 23 reactions to a message, with a maximum of 50 distinct emojis overall. The API documentation lists two separate errors, too_many_emoji for the limit on distinct emojis and too_many_reactions for the per-person limit, but gives no numbers. The help page we could read sits on a Slack sandbox domain and is undated. We did not establish which number applies today.

The load test without headless Chrome

For a customer with 500,000 users, Slack needed 500,000 open WebSocket connections. The existing tool ran Slack as headless Chrome in Kubernetes pods. According to Lemaire an instance cost 37 cents per five-hour window. For the whole test she cites "$150,000 for that one test". She also says half of that time went into bringing crashed pods back up.

The amounts cannot be verified. 500,000 instances at 0.37 dollars would be 185,000 dollars, which does not match 150,000. The episode does not say how many instances sit behind the figure. The newsletter's "Maude built Koi Pond" is imprecise as well: the Slack blog post by Shreya Ramesh lists Lemaire among the five names of the team it thanks at the end.

Headless Chrome was replaced by many small Go processes, each holding one WebSocket connection and making API calls like a real client, at lower fidelity. The tool is called Koi Pond. Slack describes it itself: a "school" drives up to 5,000 simulated clients, and the largest test ran 2 million users in one workspace. Slack says 2 million users on Koi Pond cost about 0.26 percent of what 150,000 users cost on its headless Chrome tool Puppet Show. That is a vendor claim from 2021, updated in 2023.

GitHub: 16 shards and scatter queries

When Lemaire arrived at GitHub she found 16 shards in the Vitess setup for all pull requests and issues. That is not many, she says, and part of the answer to why was that more shards were not possible because there were already so many scatter queries. She called her own example, all pull requests by one author, hypothetical. She also says "I don't know if this is still the case".

Why you cannot simply remove scatter queries, she explains with Active Record. The abstraction hides the SQL: a five-line function, and nobody can find where the query is made. As an example of the load she names the repository landing page with the README. When she last looked before leaving, it triggered over 100 MySQL queries across at least three clusters, and almost every count on a GitHub page was computed live. The newsletter turns this into "home page" and "~100". The page is the repository page, and it was more than 100.

A scatter query is a query against a sharded database that does not contain the sharding key. The router does not know where the data lives and sends it to every shard. Each added shard raises the cost per query, even though each shard holds less data. That explains why 16 shards held. Lemaire calls it only part of the explanation, while the newsletter turns it into a hard ceiling.

What is confirmed, and where

QuantityValueSource and date
Emoji limit23 distinct custom emojis per messageStatement by the guest, episode of 5 Nov 2026, at about 30:43
Emoji limit per help page23 reactions per member, 50 distinct emojis per messageSlack help page (sandbox domain, undated), read 9 Nov 2026
Headless Chrome test0.37 USD per instance and 5 hours, 150,000 USD per testStatement by the guest, at about 41:46, cannot be recomputed
Puppet Showone day to reach 150,000 simulated usersSlack Engineering, 23 Apr 2021, updated 27 Jun 2023
Koi Pond2 million users, about 0.26% of the cost of 150,000 on Puppet ShowVendor claim, Slack Engineering, same page
GitHub shards16 for all pull requests and issuesStatement by the guest, at about 53:09, current state unknown
Repository pageover 100 MySQL queries, at least three clustersStatement by the guest, at about 59:57, "last I checked"

All timestamps refer to the transcript. We measured none of this. The statements about GitHub come from a former employee.

The episode on The Pragmatic Engineer channel, published 5 November 2026. All figures in this post are as stated in the episode.

What this means for your own operations

Two checks need neither Slack's size nor sharding. First: which action can make many users do the same thing at once, and what flows back to everyone? A hard cap like the one on reactions is, in Lemaire's words, a product decision as much as an engineering one. Second: which queries run without the key the data is distributed by? That list should exist before the next shard. For an example of fixed instead of free queries, see our post on Google's MCP Toolbox with predefined SQL queries for agents. More posts on servers, operations and networks are collected in the hub Servers and network, and our offering is listed under Services.

Whether Lemaire's numbers still hold is open. Both statements about GitHub carry the caveat "last I checked", and on Slack the episode and the help page disagree.

Further reading

Questions?
What is a scatter query?+

A query against a sharded database that does not contain the sharding key. Since it is unclear where the data lives, it goes to every shard. The more shards, the more work per query.

Does Slack really cap messages at 23 emojis?+

The number 23 appears, but the scope is unclear. In the episode Lemaire says 23 distinct custom emojis per message. A Slack help page says 23 reactions per member and at most 50 distinct emojis per message.

Is the 150,000 dollar figure for the headless Chrome test confirmed?+

Only as a statement in the episode. Lemaire gives 37 cents per instance and five hours, and 150,000 dollars for one test. Slack's blog gives no dollar amounts, only a cost ratio between its tools.