Run your own Jarvis
This guide takes you from nothing to your own Jarvis-Bot running in your Discord server in about 30 minutes. Jarvis runs raid sign-ups for TBC and Wrath Classic, plays music in voice channels, and remembers who members were after they leave.
Once it is running, the command guide explains everything it does for raiders and officers.
Before you start
You need four things; none of them cost money.
- A computer that stays on. A small Linux box, a spare PC, a home server, or a cheap cloud VM. 1 CPU and 1 GB of memory is plenty; allow 2 GB of disk. It only needs an internet connection out, with no ports opened on your router.
- Docker with Docker Compose (step 1 installs it).
- A Discord server where you have Manage Server, so you can add the bot.
- The code: the Jarvis-Bot zip file from the person who shared it with you (no GitHub account needed).
Step 1: Install Docker
Docker runs the bot in a self-contained box, so you install nothing else by hand.
Linux (Ubuntu, Debian and most others): run Docker's official install script, then let your
user run Docker without sudo. Log out and back in afterwards.
curl -fsSL https://get.docker.com | sudo sh
sudo usermod -aG docker $USER
Windows: the recommended way is WSL, in the next section. macOS, or Windows with Docker Desktop instead: install Docker Desktop from docker.com and start it (on Windows, accept the WSL 2 option it offers). Run the commands in this guide in a terminal (Windows Terminal or macOS Terminal). The computer must stay on and Docker Desktop must keep running for the bot to stay online.
You also need a way to unzip the code: Windows and macOS have one built in; on Linux run
sudo apt install unzip (Ubuntu/Debian).
Check it works: this should print a version number.
docker compose version
Windows: setting up with WSL
WSL runs a real Ubuntu Linux inside Windows 10 (version 2004 or later) or Windows 11. Installing Docker inside it, instead of Docker Desktop, is lighter and needs no Docker account. Follow these steps in order; after them, every command in the rest of this guide runs in the Ubuntu terminal.
- Install WSL and Ubuntu. Right-click Start > Terminal (Admin) (or PowerShell as
administrator) and run:
Restart Windows when asked. Ubuntu then opens by itself and asks you to create a Linux username and password: pick anything and remember the password (it is whatwsl --install -d Ubuntu-24.04sudoasks for). Later, open Ubuntu from the Start menu. - Check WSL is version 2 and up to date. In the admin PowerShell:
wsl --update wsl -l -vUbuntu-24.04should showVERSION 2. If it shows 1, runwsl --set-version Ubuntu-24.04 2. - Make sure systemd is on, so Docker starts by itself inside Ubuntu. In the Ubuntu terminal:
It should containcat /etc/wsl.confsystemd=trueunder[boot](Ubuntu 24.04 does this by default). If not, run the line below, then in PowerShell runwsl --shutdownand reopen Ubuntu:printf '[boot]\nsystemd=true\n' | sudo tee /etc/wsl.conf - Install Docker and unzip inside Ubuntu:
Close the Ubuntu window and open it again so the group change applies, then check:sudo apt update && sudo apt install -y unzip curl -fsSL https://get.docker.com | sudo sh sudo usermod -aG docker $USERdocker run --rm hello-worldshould print "Hello from Docker!". - Keep the files inside Linux. Do steps 4 and 5 of this guide in your Linux home folder
(
cd ~first, so the code lands in~/jarvis-bot), not under/mnt/c/.... Files on the Windows drive are slow and their permissions break the bot'sdatafolder. To edit.envfrom Windows, open File Explorer and go to\\wsl$\Ubuntu-24.04\home\<your Linux username>\jarvis-bot; Notepad is fine. Or edit it in Ubuntu withnano ~/jarvis-bot/.env. - Keep WSL running when no window is open. Windows stops WSL, and the bot with it, shortly after
you close the last Ubuntu window. To keep it running from the moment you sign in:
- Open Task Scheduler > Create Task. Name:
Keep WSL running. - Triggers > New > At log on (your user).
- Actions > New > Program
C:\Windows\System32\wsl.exe, arguments-d Ubuntu-24.04 --exec sleep infinity. - Settings: untick Stop the task if it runs longer than. Click OK.
- Right-click the task > Run to start it now.
- Open Task Scheduler > Create Task. Name:
- Stop the PC from sleeping. Settings > System > Power > Screen and sleep: set sleep to Never when plugged in. A sleeping PC takes the bot offline.
Check it after a reboot: sign in, wait a minute without opening Ubuntu, and the bot should show online in
Discord. In Ubuntu, docker ps should list jarvis-bot as Up.
Step 2: Create your Discord bot
Your copy of Jarvis is its own bot, with its own name and picture; you choose both.
- Go to discord.com/developers/applications, sign in, and click New Application. The name you give it is the bot's name (you can change it later).
- Installation (left menu): set Install Link to None, then Save Changes. This has to come before step 3, or Discord refuses to save.
- Bot (left menu):
- Click Reset Token, then Copy, and paste it into your text file. This token is the bot's password: never share it or post it in chat. Discord shows it only once; if you lose it, reset it again.
- Turn on Server Members Intent. Jarvis cannot track members without it.
- Turn off Public Bot, so nobody else can add your bot to their server.
- Optional: set a username and an icon at the top of the page.
- Click Save Changes.
- General Information (left menu): copy the Application ID into your text file.
Step 3: Invite the bot and give it access
Paste this link into your browser, replacing APP_ID with your Application ID:
https://discord.com/oauth2/authorize?client_id=APP_ID&scope=bot+applications.commands&permissions=3329152
Pick your server, leave every permission ticked, and click Authorize. The bot joins your member list, offline until you start it in step 5.
| Permission | Why Jarvis needs it |
|---|---|
| View Channels, Send Messages, Embed Links | Post raid sign-ups and member reports |
| Attach Files | Pictures on raid posts |
| Mention Everyone | Ping roles that are not normally mentionable when a raid is posted |
| View Audit Log | Tell kicks and bans apart from members leaving |
| Connect, Speak | Play music in voice channels |
Private channels. Jarvis can only use channels its role can see. For each private channel it should use, open Edit Channel > Permissions, click +, add the role with the bot's name, and allow:
- Raid sign-up channels: View Channel, Send Messages, Embed Links, Attach Files
- The member-report channel: View Channel, Send Messages, Embed Links
- Voice channels for music: View Channel, Connect, Speak
You do not need to get this perfect now: when Jarvis cannot post or join somewhere, it says exactly which permission is missing.
Get two IDs. In Discord, open User Settings > Advanced and turn on Developer Mode. Then right-click your server icon and choose Copy Server ID, and right-click the channel for member reports (a private officer or mod channel works best) and choose Copy Channel ID. Put both in your text file.
Step 4: Get the code and fill in the settings
Unpack the code. Put the zip you were given (for example jarvis-bot-main.zip) in your
home folder and unpack it into a folder named jarvis-bot:
- Linux or WSL: if the zip is in your Windows Downloads folder, copy it into Linux first with
cp /mnt/c/Users/<your Windows username>/Downloads/jarvis-bot-main.zip ~/(WSL only). Then run:
cd ~
unzip jarvis-bot-main.zip
mv jarvis-bot-main jarvis-bot
cd jarvis-bot
ls -a
- Windows with Docker Desktop, or macOS: right-click the zip > Extract All (Windows) or
double-click it (macOS), rename the folder inside to
jarvis-bot, then open a terminal in it.
The folder should contain bot.py, compose.yaml, Dockerfile and
.env.example (files starting with a dot are hidden in some file browsers).
Create the settings file and data folders. .env holds your token and settings;
data will hold everything Jarvis remembers.
cp .env.example .env
mkdir data cache
On Linux also run chmod 600 .env so only you can read it, and id -u and
id -g: if either prints something other than 1000, put those numbers in PUID and
PGID below.
Fill in .env. Open it in a text editor (nano .env on Linux, Notepad on
Windows). Each line is NAME=value, with no spaces or quotes around the value. Every setting is
explained in the file; these are the ones to set now:
| Setting | What to put | Example |
|---|---|---|
DISCORD_TOKEN | The bot token from step 2 | (your token) |
GUILD_ID | Your server ID from step 3 | 123456789012345678 |
LOG_CHANNEL_ID | The member-report channel ID from step 3 | 234567890123456789 |
TZ | Your own time zone, for the daily restart and reminder DMs | America/Chicago |
RAID_REALM | Your realm's name, shown on raid posts | Nightslayer |
RAID_TZ | Your realm's server time zone: raid times are typed and shown in it | America/Denver |
OFFICER_ROLES | Role names allowed to create raids, comma-separated (Manage Server always can) | Officers,Raid Lead |
PUID, PGID | Only if id -u / id -g were not 1000 | 1000 |
Time zones use their official names. Most US realms use America/New_York,
America/Chicago, America/Denver or America/Los_Angeles. To check your
realm, compare the in-game server clock with your own clock. Leave the Spotify and monitoring lines empty for now.
Step 5: Start it and check it works
From the jarvis-bot folder, build and start the bot (the first build downloads about 1 GB and
takes a few minutes), then watch its log:
docker compose up -d --build
docker compose logs -f
Within a minute you should see these lines (press Ctrl+C to stop watching; the bot keeps running):
ready as <your bot name>: N members recorded: connected, and it has recorded your members.log channel #<channel>: permissions OK: it can post member reports.raid icons: 43 ready, 43 newly uploaded: it uploaded its class and spec icons (first start only).
If you see RAID_TZ is not set instead, fill in RAID_TZ in .env and
run docker compose up -d again.
Try it in Discord. The bot now shows as online. Type / in any channel and its commands
appear: /raid, /play, /whois and more (restart Discord if they do not
show after a minute). Then:
- Officers: run
/raid setupand follow the DM; it posts a test raid you can delete with/raid delete. - Join a voice channel and run
/playwith a song name. - Run
/whoiswith a member's name.
What every command does, for raiders and officers: the command guide (written for the guild Jarvis was built for, but the commands are the same).
Optional: Spotify links and monitoring
Music from YouTube works without either of these.
Spotify links. Spotify gives Jarvis the track list and the songs play from YouTube.
- Go to developer.spotify.com/dashboard, sign in with
any Spotify account, and click Create app. Any name and description; set the redirect URI to
http://127.0.0.1:8888/callbackand click Add; tick Web API; save. - In the app's Settings, copy the Client ID, then click View client secret and copy that too.
- Put them in
.envasSPOTIFY_CLIENT_IDandSPOTIFY_CLIENT_SECRET, then rundocker compose up -d.
Tracks and albums now work. Playlists need one more step, because Spotify only lists a playlist's
songs to a logged-in user: the server owner runs /spotify-login in Discord, opens the link and
approves (Jarvis only asks to read playlists). The browser then lands on a 127.0.0.1 page that
does not load; that is expected. Copy that whole address from the address bar and paste it into
/spotify-code within a few minutes. Jarvis renews the login itself, and DMs the owner three days
before it needs redoing (about every 180 days).
Monitoring. If you run Uptime Kuma, create a Push monitor and put its push URL, without the
?status=... part, in .env as KUMA_PUSH_URL. Jarvis checks in every 60
seconds while it is connected, so the monitor alerts you if the bot stops.
Keeping it running
Jarvis looks after most things itself: it restarts once a day at RESTART_AT (5:00 AM in your
TZ by default, but never while music is playing), updates its YouTube component on every start,
and writes a daily backup of its database to data/backups/ (14 days kept). It comes back on its
own after the computer reboots, as long as Docker starts at boot (the default on Linux; on WSL the "Keep WSL
running" task from step 1 handles it; with Docker Desktop, set it to start when you sign in).
Install a new version when you are sent a newer zip. Your .env and data
folder are not in the zip, so unpacking it over your existing folder keeps them. Copy the new zip into your
home folder, then:
cd ~
unzip -o jarvis-bot-main.zip
cp -r jarvis-bot-main/. jarvis-bot/
rm -r jarvis-bot-main
cd jarvis-bot
docker compose up -d --build
Your members, raids and settings are in data/ and are kept through updates.
Changed a setting? After editing .env, run docker compose up -d. A plain
restart keeps the old values.
Back it up. Everything Jarvis remembers is in the data folder, and your settings are in
.env. Copy both somewhere safe now and then (the token in .env is a secret, so keep
the copy private).
Move to a new computer: stop the bot on the old computer (docker compose down in the
jarvis-bot folder), copy the whole jarvis-bot folder (it includes .env
and data) to the new one, install Docker there (step 1), and run
docker compose up -d --build in it. Never run two copies with the same token at once.
Troubleshooting
The log usually says what is wrong: docker compose logs --tail 50 from the jarvis-bot folder.
| What you see | What to do |
|---|---|
PrivilegedIntentsRequired in the log | Turn on Server Members Intent (step 2), then docker compose up -d |
Improper token or 401 Unauthorized | The token in .env is wrong or was reset: reset it in the Developer Portal and paste the new one |
| "Private application cannot have a default authorization link" | Set Install Link to None on the Installation tab first (step 2) |
| The bot is offline | docker compose ps should show it Up; if not, docker compose up -d and read the log |
| Slash commands do not appear | Check GUILD_ID is your server's ID; wait a minute; restart Discord |
| "I can't post in #channel" or "I can't join" | Add the bot's role to that channel with the permissions in step 3 |
Permission denied on /data | On Linux, sudo chown -R $(id -u):$(id -g) data cache and set PUID/PGID in .env |
| Raid times an hour or more off | Set RAID_TZ to your realm's server time zone (when unset it uses UTC) |
/play will not play a song | Try another search or link; if nothing plays, docker compose restart updates the YouTube component |
| "Spotify won't share that one" | It is a Spotify-made playlist or someone else's private one: copy the songs into your own playlist |
| "Spotify playlists need a one-time Spotify login" | The server owner runs /spotify-login (Optional section) |
| No reminder DMs | Allow DMs from server members: server icon > Privacy Settings > Direct Messages |
Still stuck? Send the person who shared the bot the last 50 log lines (docker compose logs --tail 50).
The log never prints your token, but check anything else you paste.