Every source behind this page, graded. The mix is unusual and the reason is
stated below.
Decision record
Discord2017-07 to 2026-09
Developer change log, 237 dated entries
The spine of this guide. Each entry is dated, tagged by surface, and written at the time of
the decision. Twenty-seven are tagged Breaking Change, and the yearly count rises from eight
in 2017 to fifty-nine in the first nine months of 2026.
Carry forwardA tagged, dated change log is the cheapest architecture record a platform can keep, and it is auditable by anyone.
raw.githubusercontent.com/discord/discord-api-docs/main/developers/change-log.mdx
Reported failure
Discord2021-03-15
Large bot sharding lowered to 150,000 guilds
Discord reports gateway connections timing out for apps in too many guilds and responds by
moving more apps into the stricter admission regime. The only entry in the record that names
a reliability symptom and its remedy in the same paragraph.
Carry forwardAdmission thresholds are a capacity lever you can pull without shipping code.
Change log entry, 15 March 2021
Reported failure
Discord2025-08-14
Rate limit on requesting all guild members
One request per guild per bot every 30 seconds, applied early to the largest guilds "so we
can ensure platform stability", with a typed RATE_LIMITED dispatch instead of a
disconnect.
Carry forwardRefuse expensive requests on the same channel, with a retry hint, rather than dropping the connection.
Change log entry, 14 August 2025
Reported failure
Discord2026-08-12
Channel obfuscation for users and bots
An admission that the gateway has always sent apps every channel in a guild with full
metadata, including channels the app cannot view, and a description of the obfuscation that
replaces it.
Carry forwardAudit what your push contract emits before authorization, not only after it.
Change log entry, 12 August 2026
Reported failure
discord.js2024-01-14
Issue #10089: the WebSocket rate limit has been hit
Gateway metering surfacing as close code 4008 and shard destruction during start-up, followed
by "Members didn't arrive in time". Fixed in the library's scheduling, not in the app.
Carry forwardFor a protocol wrapped by a few libraries, the libraries are your real rate-limit counterparty.
github.com/discordjs/discord.js/issues/10089
Documentation
Discordchecked 2026-09-22
Gateway documentation: sharding, admission, metering
The published formula shard_id = (guild_id >> 22) % num_shards, the
2,500-guild ceiling, bucketed identify concurrency, the 1,000-per-day session budget with
token reset, and the 120-commands-per-60-seconds meter.
Carry forwardPublishing the routing formula is what lets you delegate partitioning without holding placement state.
developers/events/gateway.mdx
Documentation
Discordchecked 2026-09-22
Gateway events: request guild members, large_threshold
The hydration rules, graded by guild size, and the sentence that names both motives at once:
"Due to our privacy and infrastructural concerns with this feature, there are some limitations
that apply."
Carry forwardA limit that serves privacy and capacity together is the one that survives review.
developers/events/gateway-events.mdx
Documentation
Discordchecked 2026-09-22
You might not need a privileged intent
A guide whose purpose is to talk developers out of subscribing: look the member up by id,
search by prefix, or take the member object that already arrives inside an interaction.
Carry forwardThe cheapest subscription is the one the consumer decides it does not need.
developers/gateway/you-might-not-need-a-privileged-intent.mdx
Decision record
Discord2020-09-24
API and Gateway v8: intents become mandatory
The version bump that converted an optional saving into a requirement, removed
guild_subscriptions, and was followed six weeks later by back-applying the
restrictions to v6.
Carry forwardAn optional efficiency feature becomes a control only when the old path is closed.
Change log entry, 24 September 2020
Decision record
Discord2022-09-01
Message content is a privileged intent
The largest withdrawal in the record, with a grace period priced as a growth freeze: apps
opting in "will be prevented from joining any additional servers until you opt-out".
Carry forwardIf you must extend a deadline, charge for the extension in something the consumer values.
Change log entry, 1 September 2022
Decision record
Discord2022-08-09
Session-specific gateway resume URLs
Adoption driven by degraded service rather than a cut-off: non-adopters "will be disconnected
significantly faster than normal" while the field still returns the old address.
Carry forwardQuality of service is a migration lever that does not break anyone on day one.
Change log entry, 9 August 2022
Decision record
Discord2026-06-10
Privileged intent access moves to a user threshold
Review is triggered at 10,000 users rather than 100 servers, access must be renewed annually,
and apps may keep growing while under review.
Carry forwardGate on the quantity that actually drives your cost and your exposure, not on a proxy for it.
Change log entry, 10 June 2026
Decision record
Discord2020-10-04
PR #2127, "More serious v7 status?", closed unmerged
A documentation fix for the skipped v7 rejected the day it was opened, on brand grounds, over
contributor objections that "the whole v6/v7 thing is repeatedly a cause for confusion".
Carry forwardVersion numbering is contract surface; a joke in it is paid for by every new integrator.
github.com/discord/discord-api-docs/pull/2127
Decision record
Discord2022-02-01
PR #4376, close-code resume matrix, closed unmerged
A contributor proposed documenting which close codes are resumable. Discord closed it with
"if you get a disconnect, try to resume, otherwise reconnect", keeping recovery policy
deliberately coarse.
Carry forwardEvery documented failure mapping is a constraint on your future behaviour; refuse deliberately, not accidentally.
github.com/discord/discord-api-docs/pull/4376
Source
Discord2024-05-23
PR #6877, zstd-stream documented, Reconnect clarified
Documents "the resurrected zstd-stream gateway compression option" and clarifies that the
Reconnect opcode "can come at any time, even before hello".
Carry forwardReserve the right to evict a connection in the contract, or you will never be able to rebalance.
github.com/discord/discord-api-docs/pull/6877
Source
Discord2017-02 to 2026-07
Manifold: batching sends by destination node
"Send calls cost about 70 µs/op"; a single GenServer per guild with around
100,000 attached processes; packets per second halved after deployment. Ten releases over nine
years, the most recent in July 2026.
Carry forwardPer-recipient send cost is the number that decides whether your fanout tier scales; measure it before designing around it.
raw.githubusercontent.com/discord/manifold/master/README.md
Source
Discord2017-02-20
FastGlobal, and the release that never came
One release, ever, and 766,789 downloads. Reading shared configuration at 0.33 microseconds
against 7.64 for ETS, by compiling data into a module at runtime.
Carry forwardA workaround that the platform later absorbs is the best possible outcome for a published library; plan for it to stop.
hex.pm/api/packages/fastglobal
Source
Erlang/OTP2018-11-06
persistent_term, and PR #1989 that added it
ERTS 10.2 added "a term storage suitable for terms that are frequently used but never or
infrequently updated", with constant-time lookups and no copying. The pull request names
mochiglobal and "live-compiled modules as data stores" as the patterns it replaces.
Carry forwardWhen several large users ship the same workaround, the runtime is where the fix belongs.
github.com/erlang/otp/pull/1989
Source
Discord2019-05 to 2025-12
SortedSet: the hot data structure moved to Rust
A native implemented function in Rust, buckets of 500 by default, written because copying
terms into a growing vector "proved to be a performance bottle neck". Still changing in
December 2025, six years after its first release.
Carry forwardMoving one data structure into native code is a smaller change than moving a workload off its runtime, and it buys years.
hex.pm/api/packages/sorted_set_nif
Source
Discordchecked 2026-09-22
ZenMonitor: making failure notification cheap
A drop-in replacement for Process.monitor/1 that batches and throttles the
notifications produced when a heavily watched process dies, at the cost of an ETS row per
monitor.
Carry forwardIn a fanout system, the death of a hub is itself a fanout event; budget for it.
raw.githubusercontent.com/discord/zen_monitor/master/README.md
Source
Discord2017-02 to 2021-12
Erlpack: the internal encoding, published
An encoder for Erlang term format 131 in C++ with Python and JavaScript bindings, which is
what the gateway's ETF option actually is. Five npm versions, the last in December 2021.
Carry forwardOffering your internal wire format to consumers saves you a translation layer and ties them to your runtime's data model.
registry.npmjs.org/erlpack
Source
Discord2018-02 to 2025-06
lilliput: the same instinct on the media path
An image resizing library written to do "as little memory allocation as possible and
especially not to create garbage in Go". Published v1.0.0 in February 2018, then nothing until
v1.3.0 in September 2024, then three releases in nine months.
Carry forwardA long publication gap followed by a burst usually marks a format or product change, not a rewrite.
proxy.golang.org/github.com/discord/lilliput/@v/list
Source
Rapptz2015-08 to 2026-03
discord.py release history on PyPI
Eighty-seven releases, with a 432-day gap between 1.7.3 on 12 June 2021 and 2.0.0 on
18 August 2022, which closes two weeks before the message content deadline.
Carry forwardRegistry cadence is the cheapest health signal you have for the ecosystem your contract depends on.
pypi.org/pypi/discord.py/json
Source
discord.js2015-08 to 2026-09
discord.js major versions on npm
v12 on 1 March 2020, v13 on 6 August 2021, v14 on 17 July 2022: each major lands within weeks
of a contract change, which is what the migration actually costs.
Carry forwardCount your deprecation runway from the library's release cadence, not from your own announcement date.
registry.npmjs.org/discord.js
Specification
Matrix.orgchecked 2026-09-22
Client-Server API: lazy-loading room members
The same hydration problem solved with a per-request filter that the specification explicitly
allows to be imprecise: redundant membership events are valid "to ease implementation".
Carry forwardA best-effort filter is cheap to specify and weak as a cost control; know which you are buying.
matrix-spec client-server-api
Source
Blueskychecked 2026-09-22
Jetstream: narrowing outside the protocol
A standalone service that re-serves the firehose as filterable JSON, designed to be
"dead-simple and cheap for us and others to operate on a single server", with at-least-once
delivery and idempotent consumers as an explicit non-goal list.
Carry forwardIf your protocol cannot be changed, put the narrowing in a service beside it and let consumers choose.
Jetstream design document
Source
Discordchecked 2026-09-22
discord-api-spec: the machine-readable contract
An OpenAPI 3.1 specification covering "only the most recent version (v10)", generated
automatically, closed to public contributions, with a preview file that "is subject to
breaking changes without advance notice".
Carry forwardPublishing a generated spec for the current version only is a way to be precise without promising stability.
github.com/discord/discord-api-spec
Case study
Discord / ROOSTchecked 2026-09-22
Osprey: the other consumer of the same stream
Discord's internal safety rules engine, "originally developed internally at Discord to combat
spam, abuse, botting, and scripting", open-sourced through a non-profit and listed as adopted
by Bluesky and Matrix.org as well as Discord.
Carry forwardThe abuse engine is a first-class consumer of your event stream, and it wants the firehose that third parties are being weaned off.
raw.githubusercontent.com/discord/osprey/main/README.md