Run your Python Discord bot directly alongside your Minecraft server! Features auto-setup, live web dashboard, and in-game controls
Run your Python Discord bot directly alongside your Minecraft server — no external hosting, no VPS, no hassle.
PyRunner is a Paper plugin that manages a Python process (typically a Discord bot) as a child process of your Minecraft server. It handles everything automatically: downloading Python, installing dependencies from requirements.txt, restarting on crash, streaming logs to a live web dashboard, and sending Discord notifications — all configured from a single config.yml.
newVirtualThreadPerTaskExecutor() for non-blocking I/O scaling on Java 25.plugin.yml api-version updated to 1.21 to match the target platform.Existing configs remain fully compatible — no config changes required.
No Python installed on your server? No problem. PyRunner automatically detects your OS and CPU architecture and downloads a self-contained Python binary via python-build-standalone on first start. Works on Linux (x64 & ARM64), macOS (x64 & ARM64), and Windows (x64). The binary is downloaded once and cached locally.
If your bot has a requirements.txt, PyRunner will automatically run pip install -r requirements.txt before launching whenever the deps haven't been installed yet. Delete bot/.pyrunner_deps_installed to force a reinstall on next start.
The bot process is monitored constantly. If it crashes, PyRunner waits a configurable delay then restarts it automatically. If it crashes too many times in a short window, crash-loop protection kicks in and stops retrying — preventing infinite restart spam while alerting you.
A built-in HTTP server hosts a sleek, password-protected control panel accessible from any browser. Features include:
Get notified in a Discord channel when your bot starts, stops, crashes, or when pip install runs — all via a standard Discord webhook URL. No bot token required for notifications. Each event type is individually toggleable.
Full control from the Minecraft console or in-game with the /pybot command. No need to SSH into your server just to restart the bot.
Run more than one Python bot simultaneously — each with its own process, log file, and independent crash recovery. Control each bot individually with /pybot start <n>, /pybot stop <n>, etc.
Pin a specific Python minor version (e.g. "3.11", "3.12") instead of always downloading the latest release.
Send input directly to the bot process from the web dashboard without restarting it — useful for bots that accept console commands via stdin.
The web dashboard shows live memory usage (RSS) of the bot process, read directly from /proc/<pid>/status on Linux.
If TunnelMC is installed and has an active tunnel on the dashboard port, PyRunner will print the public URL to console when the bot starts — purely informational, TunnelMC is never auto-started.
PyRunner.jar and place it in your plugins/ folderplugins/PyRunner/bot/ (should include requirements.txt for dependencies)plugins/PyRunner/config.yml — at minimum set your bot token under env:/pybot startPyRunner will handle the rest — Python download, pip install, and bot launch happen automatically.
plugins/
PyRunner/
config.yml ← All plugin settings
bot/ ← Your bot code goes here
main.py
requirements.txt
.pyrunner_deps_installed ← Created after successful pip install
logs/
bot.log ← Live bot output (rotates at 5MB, keeps 3 backups)
bot-<n>.log ← Per-bot log files when using multiple bots
python/ ← Auto-downloaded Python binary (do not edit)
python.properties ← Cached binary paths
Permission node: pyrunner.admin (default: OP)
| Command | Description |
|---|---|
/pybot start [name] |
Start the bot (or a specific bot by name) |
/pybot stop [name] |
Stop the bot (or a specific bot by name) |
/pybot restart [name] |
Restart the bot (or a specific bot by name) |
/pybot status [name] |
Show status of all bots or a specific one |
/pybot install [name] |
Force re-run pip install |
/pybot reload |
Reload config.yml |
Open http://<your-server-ip>:<port> in any browser (default port: 8080).
The dashboard is password protected. Change the default password in config.yml.
config.yml under discord.webhook.urldiscord.webhook.enabled: true/pybot reload| Minecraft | Paper 1.21.x – 26.1.x |
| Java | 25+ (compiled with Java 25) |
| OS | Linux, macOS, Windows |
| Architectures | x64, ARM64 |
| Hosting | Self-hosted, Pterodactyl, any VPS |
⚠️ Java 25 Required: The JAR is compiled with Java 25. Your server must run Java 25 or higher. Paper 1.21.x+ with Java 25 is the recommended and fully tested setup.
NodeRunner — The Node.js equivalent of this plugin. Run a Node.js Discord bot alongside your Minecraft server.
TunnelMC — Expose any server port to the internet via ngrok tunnels. If your host doesn't provide multiple port allocations, TunnelMC pairs perfectly with PyRunner to make the web dashboard publicly accessible without needing an extra port.
All Rights Reserved — This plugin and its source code are proprietary.
Developed by Spider