Choose the right compatibility for your Discord bot¶
When you create a Discord bot order, the setup flow now asks you to pick a compatibility in addition to a runtime (Node.js, Python, Bun, Deno, Java, or Other). This page explains what that choice does, when it matters, and how to change it on a bot you already have running.
The two options¶
Lightweight is the default. It uses a small base image (Alpine Linux under the hood) which starts faster, uses less disk, and pulls quickly. It's a good fit for most bots: anything that uses pure-JavaScript libraries, pure-Python libraries, the standard Discord SDKs, simple HTTP clients, and so on.
Standard (Better Compatibility) uses a larger base image (Debian-based) that ships with the system tooling some libraries expect. You give up a bit of cold-start time and disk for much broader package support.
If your bot installs cleanly today, leave it on Lightweight. If it doesn't, Standard is almost always the answer.
When Lightweight is not enough¶
Some packages download a precompiled binary on install (the "happy path"), and others compile a binary from C/C++ source as part of npm install or pip install. The Lightweight base doesn't ship a C/C++ toolchain or the system libraries those packages link against, so any package that has to compile will fail.
These are the most common offenders we see:
- Node.js / npm:
canvas,sharp,bcrypt,better-sqlite3,node-canvas,puppeteer, voice helpers fordiscord.js(@discordjs/opus,sodium-native),node-sass. - Python / pip:
Pillow,cryptography,lxml,numpy(occasionally), anything that wrapslibffi,libxml2,libpng, orcairo.
You'll usually find out the hard way: the install crashes with errors mentioning node-gyp, prebuild-install, gcc, python: not found, or Cannot find module. The bot then keeps restarting in a loop.
Quick way to tell
Open your bot's package.json or requirements.txt. If you see any of the packages above, start with Standard.
What you give up with Standard¶
Not much, in practice:
- The image is around 80–150 MB compressed instead of ~50 MB. You won't notice unless you're rebuilding constantly.
- First-time pull is a few seconds slower on a cold node. Subsequent restarts on the same node are identical.
- A slightly larger surface area for security updates. Both bases are maintained by their upstreams and we keep them current.
For a Discord bot that runs for days or weeks at a time, these costs are invisible. We default to Lightweight only because most bots truly don't need anything more.
Switching an existing bot to Standard¶
If you already created a bot and it's failing with build errors, you don't need to cancel and re-order. Open the bot from your dashboard, go to Configuration, and change the compatibility there. The change applies on the next restart, which will trigger a fresh dependency install on the new base image.
Old dependencies may need to be cleared
If your bot has been failing to install for a while, the node_modules/ (or __pycache__/, venv/, etc.) directory on the server's volume may be in a half-broken state. After switching to Standard, if the install still doesn't go through, delete that directory from the file manager and restart once. The runtime will rebuild it from scratch.
Frequently asked questions¶
Can I switch from Standard back to Lightweight?
Yes, in the same place. There's no migration step. If your dependencies install fine on Lightweight, it'll behave exactly the same as a bot that was on Lightweight from day one.
Does this change the version of Node / Python / Java my bot runs on?
No. The major version of your runtime (Node 22, Python 3.13, Java 21, etc.) is the same across both options. What changes is the operating-system base underneath, not the language runtime.
Is Standard slower?
Once the container is running, no. The runtimes themselves are identical. The only measurable difference is image pull time on a node that has never run that image before, which is a one-off cost.
Why default to Lightweight if Standard is more compatible?
Most Discord bots are small, pure-language projects that have no need for a heavier base. Defaulting everyone to Standard would mean larger images and slower cold starts for a majority of bots that would never benefit from it. We surface the choice so the bots that do need it can opt in cleanly.
What if my bot uses the 'Other' runtime with a custom start.sh?
The same choice applies. Lightweight gives you an Alpine shell, Standard gives you a Debian shell. If your script calls apt-get, you need Standard; if it calls apk, you need Lightweight. Pure POSIX scripts run on either.