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).
TipAllow about 30 minutes the first time. Keep a text file open while you work: you will collect a token and two ID numbers along the way.

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.

  1. Install WSL and Ubuntu. Right-click Start > Terminal (Admin) (or PowerShell as administrator) and run:
    wsl --install -d Ubuntu-24.04
    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 what sudo asks for). Later, open Ubuntu from the Start menu.
  2. Check WSL is version 2 and up to date. In the admin PowerShell:
    wsl --update
    wsl -l -v
    Ubuntu-24.04 should show VERSION 2. If it shows 1, run wsl --set-version Ubuntu-24.04 2.
  3. Make sure systemd is on, so Docker starts by itself inside Ubuntu. In the Ubuntu terminal:
    cat /etc/wsl.conf
    It should contain systemd=true under [boot] (Ubuntu 24.04 does this by default). If not, run the line below, then in PowerShell run wsl --shutdown and reopen Ubuntu:
    printf '[boot]\nsystemd=true\n' | sudo tee /etc/wsl.conf
  4. Install Docker and unzip inside Ubuntu:
    sudo apt update && sudo apt install -y unzip
    curl -fsSL https://get.docker.com | sudo sh
    sudo usermod -aG docker $USER
    Close the Ubuntu window and open it again so the group change applies, then check: docker run --rm hello-world should print "Hello from Docker!".
  5. 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's data folder. To edit .env from 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 with nano ~/jarvis-bot/.env.
  6. 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.
    To keep it running even before anyone signs in, also tick Run whether user is logged on or not on the General tab (Windows asks for your password).
  7. 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.

  1. 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).
  2. Installation (left menu): set Install Link to None, then Save Changes. This has to come before step 3, or Discord refuses to save.
  3. 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.
  4. 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.

PermissionWhy Jarvis needs it
View Channels, Send Messages, Embed LinksPost raid sign-ups and member reports
Attach FilesPictures on raid posts
Mention EveryonePing roles that are not normally mentionable when a raid is posted
View Audit LogTell kicks and bans apart from members leaving
Connect, SpeakPlay 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:

SettingWhat to putExample
DISCORD_TOKENThe bot token from step 2(your token)
GUILD_IDYour server ID from step 3123456789012345678
LOG_CHANNEL_IDThe member-report channel ID from step 3234567890123456789
TZYour own time zone, for the daily restart and reminder DMsAmerica/Chicago
RAID_REALMYour realm's name, shown on raid postsNightslayer
RAID_TZYour realm's server time zone: raid times are typed and shown in itAmerica/Denver
OFFICER_ROLESRole names allowed to create raids, comma-separated (Manage Server always can)Officers,Raid Lead
PUID, PGIDOnly if id -u / id -g were not 10001000

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:

  1. Officers: run /raid setup and follow the DM; it posts a test raid you can delete with /raid delete.
  2. Join a voice channel and run /play with a song name.
  3. Run /whois with 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.

  1. 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/callback and click Add; tick Web API; save.
  2. In the app's Settings, copy the Client ID, then click View client secret and copy that too.
  3. Put them in .env as SPOTIFY_CLIENT_ID and SPOTIFY_CLIENT_SECRET, then run docker 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 seeWhat to do
PrivilegedIntentsRequired in the logTurn on Server Members Intent (step 2), then docker compose up -d
Improper token or 401 UnauthorizedThe 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 offlinedocker compose ps should show it Up; if not, docker compose up -d and read the log
Slash commands do not appearCheck 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 /dataOn Linux, sudo chown -R $(id -u):$(id -g) data cache and set PUID/PGID in .env
Raid times an hour or more offSet RAID_TZ to your realm's server time zone (when unset it uses UTC)
/play will not play a songTry 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 DMsAllow 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.