Docs
Everything you need to run your bot here, and what to do when it does not.
What your source needs
Two ways in: a public repository on GitHub, GitLab, Codeberg or Bitbucket, or your project folder as a ZIP file, up to 32 MB, uploaded right in the form. Either way the bot has to start on its own. For Node that means a package.json; the start command is taken from scripts.start, then from main, then from one of index.js, bot.js or main.js. For Python a requirements.txt or pyproject.toml plus a main.py, bot.py or app.py is enough. If none of that is found, the form asks for a start command, and you can override it at any time.
For the ZIP: pack the project folder itself, not its contents scattered across subfolders. A single top-level folder is fine and gets unwrapped. Leave node_modules and .git out; the build installs dependencies anyway, and without those two almost every project fits under the limit. Extraction happens in a container without network access, and symbolic links are removed.
The build installs dependencies itself: npm ci when a package-lock.json exists, otherwise npm install; for Python pip install -r requirements.txt into its own environment. TypeScript is not compiled: commit your output folder or start with npx tsx src/index.ts.
Source plus dependencies must stay under 512 MB (Free) or 1 GB (Pro). A build that exceeds that stops with a clear message.
Token and environment variables
You enter the bot token in the form, never in the repository. It reaches the container as an environment variable, DISCORD_TOKEN by default; the name is yours to choose. Your code reads it the usual way: process.env.DISCORD_TOKEN or os.environ["DISCORD_TOKEN"].
The token is checked against the application ID you entered, and it doubles as your proof of ownership: whoever holds the token controls the application. A token that belongs to a different application is rejected. If the bot is not in the directory yet, a draft is created alongside the app, which you can turn into a listing at any time.
Other variables (database URLs, API keys, settings) go next to it, up to 32. Every value is stored encrypted and only decrypted for the deploy. They never appear in logs, ours included.
Deploy, logs and restarts
Deploy fetches the chosen branch, installs dependencies in an isolated build container and restarts the bot. You see the build output in the deploy history, with the commit hash next to the result. On Pro there is also a deploy hook: a URL you register as a webhook with your git host so every push deploys automatically.
Logs show the last 500 lines (Pro: 2,000) of standard output and refresh on their own while the page is open. Print what you will want to see later; a silent bot cannot be diagnosed.
Stop halts the container and keeps the files. Restart is a stop followed by a start without a new build. On Pro a crashed bot restarts by itself; on Free it stays down until you start it. That is the difference you pay for.
The 48-hour rule
On the free tier a bot runs for 48 hours from the moment you start it. Then it stops, and one click in the dashboard starts it for the next 48 hours. Two hours before the end we remind you by Discord DM, if you allow that in your settings.
The rule is not a nuisance, it is the arithmetic behind a free offer: a stopped bot uses no memory, so many developers share a few slots without anyone pushing anyone else out. If you want your bot to run permanently, take Pro.
A bot that stays stopped for 14 days is deleted along with its files, with a warning email three days earlier. Your listing in the directory is not affected.
What is limited
Memory: 256 MB on Free, 512 MB on Pro. That is a ceiling, not a promise: a discord.js bot typically needs 100 to 190 MB. If yours needs more, turn off member and message caches; in most bots that is the difference between 130 and 400 MB.
CPU: half a core (Free) or a full one (Pro). Plenty for a bot that waits for commands. Audio streaming and image rendering are not what this is for and will be switched off if they slow other bots down.
Network: outbound connections are free, inbound ones do not exist. A bot needs no open port; it talks to Discord on its own. If you want to run a web server, you need a different service.
One hosted bot per person on Free. On Pro, additional bots can be added at €2.99 each.
When something does not work
Build failed: the first line of the message in the deploy history names the reason: branch not found, npm install error, no runtime detected. The previous version keeps running meanwhile; a failed deploy takes nothing offline.
Bot starts but never comes online: almost always the token. Check in the Developer Portal whether it was reset and enter the new one under settings. The logs will typically show 401 Unauthorized or TokenInvalid.
Bot keeps restarting: it exceeded its memory limit. The dashboard shows the restart count. The fix is smaller caches or Pro.
No free slots: the free tier has a fixed number of simultaneously running bots. The dashboard shows how many are free right now; usually one opens up within a few hours as a 48-hour run ends.