A desktop manager app for an all-in-one Discord bot — moderation, music (YouTube / Spotify / SoundCloud), role-based rank, automod, welcome messages, custom commands, reaction roles, and a web dashboard + webhook relay, all in one server. The manager app is the "control panel": paste your bot token, hit Start, and watch it come online with a live console and status lights.
It ships as source (Electron + Node.js), with instructions to package it
into a sideloadable Windows app — see PACKAGING.md for
the Add-AppxPackage -Register route.
| Category | Commands |
|---|---|
| 🛡️ Moderation | /ban /kick /timeout /warn /warnings /clearwarnings /purge /lock /unlock /slowmode /tempban /nuke /massrole |
| 📣 Server tools | /announce /embed /say /autorole |
| 🎶 Music | /play (YouTube, Spotify, or SoundCloud links, or a plain search) /playnext /skip /skipvote /stop /pause /resume /queue /nowplaying /loop /volume /shuffle /seek /remove /clearqueue /autoplay /filter /247 /join /leave |
| ⚙️ Automod | /automod toggle /automod antiinvite /automod antispam /automod wordfilter add/remove/list |
| 🎖️ Role rank | /rank /leaderboard — based on a member's roles & permissions, not message-count XP |
| 👋 Welcome / leave | /welcome enable/disable/test /leavemessage enable/disable |
| 📝 Logging | /logging enable/disable — bans, kicks, timeouts, warns, edits, deletes |
| 🎭 Bot identity | /setname /setavatar /setnickname /status — rename, re-avatar, or go invisible on the fly (owner-only) |
| 🔗 Webhooks & dashboard | /webhook create/list/delete (native Discord webhooks) + a local relay and full web dashboard (see below) |
| 💬 Custom commands | /customcommand add/remove/list — simple text auto-responses |
| 🎭 Reaction roles | /reactionrole add/remove |
| 🎉 Fun & utility | /8ball /coinflip /dice /poll /afk /snipe /userinfo /serverinfo /avatar /ping /help |
Note on Spotify: Spotify's API doesn't allow third-party apps to stream audio directly. Spotify links are resolved to their track/artist/album metadata, then the matching audio is streamed from YouTube or SoundCloud — this is how essentially all Discord music bots handle Spotify links.
Set Status to Invisible in the desktop app's Configuration tab (or
run /status presence:Invisible, or use the web dashboard's Identity tab).
The bot keeps running exactly as normal — it just won't show up as online
in the member list. This choice is saved and re-applied automatically every
time the bot restarts, so you don't need to set it again.
/setnickname— changes the bot's display name in the current server only. Not rate-limited, so use this for everyday tweaks./setname— changes the bot's actual Discord username everywhere. Discord only allows a couple of these per hour, so save it for real rebrands./setavatar— changes the bot's avatar from an image URL.
All three (plus presence) are owner-only and also available from the web dashboard's Identity tab if you'd rather use a browser.
While the bot is running, it also serves a small password-protected web
control panel — Overview (server list + live status), Servers (edit
welcome/automod/autorole/logging and custom commands per server), Identity
(rename/re-avatar/change presence), and a webhook test tool. Locally it's
at http://localhost:3939 (or your WEBHOOK_PORT); the Open Web
Dashboard button on the desktop app's Overview tab opens it directly.
Set DASHBOARD_PASSWORD in Configuration to unlock it — it stays locked
otherwise.
Deploying the bot to Railway gives you this same dashboard at a public HTTPS URL instead — see RAILWAY.md.
npm install
npm startWant the bot running 24/7 without keeping your PC on? See
RAILWAY.md — deploys just the bot/ folder, no
Electron, and gives you the same web dashboard at a public URL.
The manager window opens. Go to Configuration, fill in your bot token and client ID (see below for where to get them), save, then press Start Bot in the sidebar.
Closing the window minimizes AIO Bot Manager to the system tray rather than quitting — that way your Discord bot keeps running in the background. Right-click the tray icon to stop the bot or quit fully.
- Go to the Discord Developer Portal → New Application.
- Bot tab → Reset Token → copy it into the manager's Bot Token field.
- On the same Bot tab, enable these under Privileged Gateway Intents:
- Server Members Intent
- Message Content Intent (Required for automod, custom commands, and AFK detection.)
- OAuth2 → General → copy the Client ID into the manager's Client ID field.
- Use Overview → Copy Invite Link in the app (or OAuth2 → URL Generator with the
botandapplications.commandsscopes) to invite it to your server.
If you set a Dev Guild ID in Configuration, slash commands register instantly to that one server — great while testing. Leave it blank for normal use; global commands can take up to an hour to first appear after a fresh deploy, but work in every server the bot joins after that.
While the bot is running, a small local web server listens on the port you
set (default 3939) so anything on your PC — a script, a scheduled task, a
tool like Zapier/IFTTT if it can reach your machine — can post a message
into a Discord channel:
curl -X POST http://localhost:3939/notify \
-H "Content-Type: application/json" \
-H "x-webhook-secret: YOUR_SECRET" \
-d '{"channelId":"123456789012345678","content":"Hello from outside Discord!"}'You can also send a rich embed instead of plain content:
{ "channelId": "123...", "embed": { "title": "Deploy finished", "description": "Build #42 passed ✅", "color": "#3ecf8e" } }This is separate from /webhook create, which creates a native Discord
webhook URL (posts directly to Discord's own webhook endpoint from
anywhere on the internet, no bot process required) — use whichever fits:
native Discord webhooks for public/internet-facing integrations, the local
relay for anything already running on the same machine as the bot.
main.js Electron main process (window, tray, bot process control)
preload.js Safe bridge between the UI and main process
renderer/ The desktop manager's UI (HTML/CSS/JS)
bot/
index.js Bot entry point (also the Railway start command)
package.json Standalone dependency list for deploying just this folder
railway.json Explicit Railway build/start config
Dockerfile Container build Railway (and any Docker host) picks up automatically
deploy-commands.js Registers slash commands with Discord
commands/ One file per command category (each exports an array)
identity.js setname / setavatar / setnickname / status
fun.js 8ball, coinflip, dice, poll, afk, snipe
autorole.js Auto-role on join
rolerank.js /rank & /leaderboard — role/permission-based, not XP
moderationExtra.js tempban, nuke, announce, embed, say, massrole
musicExtra.js 247, seek, autoplay, filter, playnext, remove, clearqueue, skipvote
events/ Discord.js event listeners
handlers/ Command/event loaders, automod checks, temp-ban sweeper
music/ DisTube setup (YouTube/Spotify/SoundCloud)
web/ Web dashboard (public/) + the REST API + webhook relay, one Express server
utils/ Database, embeds, logger, permissions
data/ JSON "database" files (created at runtime, git-ignored)
packaging/ AppxManifest.xml, Assets/, register.ps1 — see PACKAGING.md
RAILWAY.md Deploying the bot (headless) to Railway
Configuration lives in a single .env file at the project root (see
.env.example); the manager app's Configuration tab reads and writes it for
you, so you rarely need to open it directly. On Railway, you set the same
variables in their dashboard instead — see RAILWAY.md.
- "Cannot connect to the voice channel after 30 seconds" — this project
already forces IPv4 DNS resolution at startup (
bot/index.js), which fixes the vast majority of cases; this error is almost always caused by Docker/WSL2/cloud networking resolving Discord's voice servers over IPv6 and then failing the UDP handshake. If you still see it:- Running under WSL2: try running the bot with Windows-native Node.js instead (WSL2's default NAT networking has known UDP quirks). See the WSL tutorial in this project's chat history, or just run it from a normal Windows PowerShell.
- Running on Railway or another host: this should just work, since it's outbound-only UDP traffic; if it doesn't, check that host's network/firewall policies.
- Want lower CPU usage for voice encoding — this project uses
opusscriptby default because it's pure JavaScript and never needs a compiler, sonpm installjust works on a fresh machine. If you'd like the faster native encoder instead:npm uninstall opusscript && npm install @discordjs/opus(requires Python + a C++ compiler toolchain to build if no prebuilt binary matches your Node version). - No audio plays / "no engine could handle this URL" — make sure
ffmpeg-staticinstalled correctly (npm ls ffmpeg-static); it bundles its own ffmpeg binary so you shouldn't need one on your system PATH. - Slash commands don't show up — set
DEV_GUILD_IDin Configuration for instant registration while testing; without it, global commands can take up to an hour after the first deploy. - Leveling / automod / welcome messages don't fire — double-check the Server Members Intent and Message Content Intent are turned on in the Developer Portal (step 3 above). The bot can't read message content or see full member info without them.
- The bot won't start from the manager app — check the Console tab for the actual error; the most common cause is an invalid or expired bot token.