7.7 KiB
Raw Blame History

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 (noun) means, this word, appears innocent, but deeply in its roots, it holds a secret semantic depth 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 aesthetic 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.

1. broadcastEval() is a nuclear footgun

If youve 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. Its not clever. Its 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 dockercompose for your cache service and your bot so you can deploy them altogether.

2. The hostility of the bad Actors

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. Theyve 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 came late. Updates rarely. Cutting-edge features? Forget ab' it. Youre 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

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


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

Lets be real: the Oceanic maintainer has a vendetta. Against me, against others, who knows. What I do know is theyre 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.

3. No Cluster Support

To its credit, Oceanic is more lightweight than Discord.js. But no cluster support? In 2025? Thats laughable. Youre writing your own shard manager or hoping your single threaded JS wont ignite himself. Good luck.


Libraries That Are Actually Worth Your Time

1. discord.py-self

Python-based. Supports selfbots. Maintained. Featureful. Its hefty, but youre getting something solid. Plus, the maintainer isnt 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's selfbot, or your account will start spamming Steam-looking links.

2. Seyfert (My Baby)

Yeah, Im plugging my former library. Its clean, its efficient, and it doesnt try to be everything. If youre not using it, youre 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 (Also Mine)

Zig is fun. Its 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 ones 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 its 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 Isnt 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. Dont let quality open source rot.


Final Word

In contrast, the Greeks spoke of kalon, that which is good, beautiful, and true, authentic. We dont call Discord.js bad to insult, but to warn. It has lost the shape of what it was meant to be. And rather than reform, it clings to status, mate, just chill the hell out. Let the code speak for itself.