Run the bridge yourself.
CraftCord is a Python bot that connects one Discord server to one Minecraft Java server per installation. This guide gets the project running on your computer or a cloud host.
Current recorded local testing uses Python 3.13.7 on Windows. Prefer a Python 3.13 runtime when a host panel offers one. Non-Windows commands below are general guidance while runtime verification is pending.
The self-hosted model
CraftCord runs on your computer or hosting, using credentials and configuration you control. The website never asks you to enter tokens, passwords, or server credentials. Keep those values in your local environment or host panel.
Where to run it
Start on your own machine while you configure channels and RCON. Leave it running in the cloud when you want the bridge online after you close your PC.
PebbleHost is recommended for Discord bot hosting. Use their Python Discord bot hosting. Upload the project files without .venv/, __pycache__/, data/, or .env. Create .env on the host with the file manager or Startup / Environment tab. Set the startup command to python main.py. If the bot runs on the same PebbleHost machine as the Minecraft server, set LOG_SOURCE=local and point MC_LOG_PATH at /home/container/logs/latest.log. If the bot and game server are on different hosts, set LOG_SOURCE=pterodactyl and fill in the panel URL, server id, and client API key.
BisectHosting and SparkedHost are other Python-capable Discord bot hosts. The pattern is the same: upload the project, set environment variables, start with python main.py.
What you need
- Your own Discord application and bot token.
- Invite the bot to only the Discord server in
DISCORD_GUILD_ID, with View Channels, Send Messages, Embed Links, Read Message History, Manage Messages, and Add Reactions. Turn Public Bot off unless you have a deliberate multi-install plan. - RCON access to your Minecraft server.
- Local access to
latest.log, or compatible Pterodactyl log access. - Python runtime and a place to run the process.
Install
Clone the repository, create a virtual environment, install the locked requirements, then copy the example environment file.
git clone https://github.com/golso4243/CraftCord.git
cd CraftCord
py -3.13 -m venv .venv
.venv\Scripts\Activate.ps1
pip install -r requirements.lock
Copy-Item .env.example .env
python main.pygit clone https://github.com/golso4243/CraftCord.git
cd CraftCord
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.lock
cp .env.example .env
python main.pyConfigure locally
Open .env and configure your Discord token, RCON connection, channels, roles, and log source. Never paste those credentials into this website.
Message Content Intent is required only when CHAT_CHANNEL_ID is set, so the Discord → Minecraft bridge can read channel messages. Slash commands and log mirroring work with default intents when the chat bridge is off.
Chat and event channels need their own IDs. They do not fall back to the console channel. Console mirroring stays off unless ENABLE_CONSOLE_MIRROR=true, and that channel should stay staff-only.
Status uptime is observed RCON reachability, not a Minecraft process clock. On managed hosts the public game port can still answer a server-list ping while the Minecraft process is restarting, so the status embed probes RCON instead.
How messages appear
Discord chat is sent in-game as [Discord] DisplayName: message. [Discord] is blue. The display name, colon, and message are white. The name is that member’s server display name, including a nickname when they have one. Only members with an allowed role, the server owner, or an Administrator can send chat into Minecraft.
Minecraft chat is posted in Discord by your bot. The bot’s name and avatar stay above the message, and the body reads [Minecraft] Player: message. The tag and username are bold. The colon and message are not.
Joins, leaves, deaths, advancements, challenges, and goals can post as separate colored embeds. The events channel can be the same channel as chat. The relay reads vanilla log lines such as <Player> Hello. A chat plugin that adds ranks or prefixes to that line may not be recognized. Mentions, custom emoji, stickers, and attachments become plain text, Discord markdown is kept as written, and Discord messages longer than 200 characters are shortened.
Start and stop
Run python main.py from the activated environment. Stop the process with Ctrl+C. On a host panel, use that panel’s stop control. For the complete configuration reference and troubleshooting notes, use the authoritative README.