Hello, I like doing things.

Why every single Discord client sucks

Hi, I'm Yuzu, I am one of many developers who intend to write Discord bots and other bloatware that uses proprietary API's, I do it because I love Discord as a platform, and it'd be a shame to let this amazing community rot. I write code and I dislike wasting time, especially when it comes to the three B's, broken, bloated and badly-operated, this is most likely a rant than anything; however, you must keep up with this article if you want to choose your tech stack to a clean and maintainable endeavour.

---

Discord.js: the evil

First, you must understand what the Latin word *malum* (second declension neuter noun in the nom. case) means, this word, appears innocent, but deeply in its roots, it holds a secret philosophical connotation that perhaps you are not aware of, if you are a native English speaker, which most likely, if you're reading my blog, you aren't.

The word *malum*, in any romance language, means *bad* and is a synonym of *evil*. Now you must understand what real Evil is, so I'll be writing Evil from now on capitalised.

Evil is not something wicked, Evil is something not pleasing to the eyes, something anti-æsthetic. For it is not limited to moral depravity.

To call something *malum* in the classical sense is not merely to virtue-signal somebody, but to diagnose it as malformed--a deviation from order, reason, and beauty--the ancient Roman conception of malum inherently included the idea of functional and æsthetic failure. Something could be *malum* because it was ugly, jarring, inelegant, or brutish in how it was constructed or behaved. This understanding aligns far more closely with the way devs talk about code smell, bad ux, bad libraries. It is akin of calling someone who writes all day Excel documents or works in SAP a wagie, or if he's old, a dinosaur.

Evil, then, is not always malevolence. Sometimes Evil is simply negligence. Sometimes it's sloppiness. Sometimes it is the arrogance of assuming you're smarter than the end user, which in this case, is you, reader.

1. broadcastEval() is a nuclear footgun

If you've ever looked into sharding in Discord.js, you know about broadcastEval(). What they don't tell you is that (dramatic pause) this thing runs eval() on your worker threads. Yes, actual JavaScript eval() over IPC. One wrong move and you're executing arbitrary code across your cluster. It's not clever. It's dangerous.

This facilitates exploits in your logic, unsanitised inputs might break havoc, they might crash your bot on a syntax error if one of these fools whom we call "maintainers" inserts a backdoor in your codebase, whether accidental or malicious. These "malicious" actors are something I'll discuss later on.

On a different note, what you actually want is a Redis cache or any kind of stateless, independent service that can share data across shards without turning your whole app into a Fallout-level hazard. BroadcastEval is stupid, do avoid, and please write a docker-compose for your cache service and your bot so you can deploy them altogether.

2. The scum

You think the code is bad? Wait until you interact with the maintainers. Claim your library is better and they'll be in your Github issues forms threatening legal action. They've got an ego complex and take any form of comparison as slander. It's open source, not a cult. Grow up.

3. 15MB of Bloatware

Discord.js is like downloading an entire operating system just to say "hi" to a user. 15MB bundle size, over 25+ nested npm packages, huge node_modules folder, and yet it *removes* basic methods like isButton() or isChatInputCommand() on a whim. Then after backlash, they *add it back*. Who's managing this, children?

4. It hates frameworks

Discord.js has no support for decorators, adapters, or any semblance of framework facilities (even if the word might be misused herein) And it never will. TypeScript adoption is not in the picture. Updates rarely. Cutting-edge features? Forget ab' it. You're stuck in 2020 tech--even calling it 2020 is disrespectful, because back then we were better off--dealing with breakage every time Discord updates its API, which is often because Discord is stupid. Sapphire is so dumb that I will not waste any braincells witht them.

5. Semver is a lie + extra

It's supposed to help, but when you're building on a proprietary API, but it's a breaking-change mess. And for a library scared of supporting selfbots, you're also left with the Apache license, which means anyone can fork your bot and make it closed source. That's not freedom. That's a liability.

The code is also fool of memory leaks just so you know this is not a fluke:

  • https://github.com/discordjs/discord.js/issues/8733
  • https://github.com/discordjs/discord.js/issues/9759
  • https://github.com/discordjs/discord.js/issues/9688
  • https://github.com/discordjs/discord.js/issues/8084 (intending to do multi threading because Rust is appealing to modern scum)
  • and the code is also Evil:

---

Eris

1. Eris is dead

Long live Eris. Or not. It was deprecated and rebranded as Oceanic, which is very ridiculous, perhaps they copied my framework--which was called similarly back then--which is somehow even worse, subnautic? romantic?, more like gigantic, they switched to TypeScript, which is also a bloated piece of garbage.

2. Oceanic devs are petty

Let's be real: the Oceanic maintainer has a vendetta. Against me, against others, who knows. What I do know is they're needlessly antagonistic, and they docs drama like teenage girls, and don't get me wrong, at least teenage girls act their own age and are not trying to dress-up as anthropomorphic creatures to lure/induct children to their brainwash. Those NSFW forums are a huge digital footprint for your career mate.

3. No clustering support

To its credit, Oceanic is more lightweight than Discord.js. But no cluster support? In 2025? That's laughable. You're writing your own shard manager or hoping your single threaded JS won't ignite himself. Good luck.

---

Libraries That Are Actually Worth Your Time

1. discord.py-self

Python-based. Supports selfbots. Maintained. Featureful. It's hefty, but you're getting something solid. Plus, the maintainer isn't toxic—at least not publicly. The only downside of this library is that it is usually a trap so you get your token and cookies grabbed, so don't fork or download anybody selfbot's, or your account will start spamming Steam-looking links.

2. Seyfert

Yeah, I'm plugging my former library. It's clean, it's efficient, and it doesn't try to be everything. If you're not using it, you're wasting cycles and brain cells, the only downside of this thing is that it uses TypeScript and used to depend on API-types of Discord.js, hence why the legal action. But the Seyfert team has moved pass that.

3. discord.zig (My library)

Zig is fun. It's fast. And this library reflects that. If you like the idea of no runtime and no BS, give it a go, or find a language that actually pays off your bills instead of Zig.

4. Discordeno

This one's built with care. The maintainer is the kind of guy who builds things because he believes in them—family man, grounded, and technically sharp. Discordeno supports cluster sharding, HTTP/WebSocket proxies, and it's built for scale. Zero dependencies. Small footprint. Respect.

This is also the library Seyfert was originally based off of and I was once a contributor to it. *Probot* runs on this thing.

5. Anything that isn't run by degenerates

Honestly, if a library is updated regularly (once a month is fine) and isn't made by someone trying to run a para-social dungeon, give it a shot. And if the devs are sane, support them--financially if you can. Don't let quality open source rot.

---

Final Word

You can see that Discord.js contradicts itself, they use the Apache license yet they try to DMCA us, next time maybe make your software proprietary, my next article will be in defense of proprietary software.

Let the code speak for itself.

With love,

Yuzu

---