{"id":127198,"date":"2026-06-07T14:33:58","date_gmt":"2026-06-07T11:33:58","guid":{"rendered":"https:\/\/vpesports.com\/minecraft\/mods\/pyrunner\/"},"modified":"2026-06-07T14:33:58","modified_gmt":"2026-06-07T11:33:58","slug":"pyrunner","status":"publish","type":"mod","link":"https:\/\/vpesports.com\/minecraft\/mods\/pyrunner\/","title":{"rendered":"PyRunner"},"content":{"rendered":"<p># PyRunner \ud83d\udc0d<\/p>\n<p>> **Run your Python Discord bot directly alongside your Minecraft server \u2014 no external hosting, no VPS, no hassle.**<\/p>\n<p>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 \u2014 all configured from a single `config.yml`.<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83c\udd95 What&#8217;s new in 1.3.0<\/p>\n<p>### Java 25 &#038; Build Modernization<br \/>\n&#8211; **Upgraded to Java 25** \u2014 compiled with Java 25 bytecode for the latest JVM performance and language features.<br \/>\n&#8211; **Gradle 9.5.1** \u2014 build system upgraded from Gradle 8.x to 9.5.1 for native Java 25 support.<br \/>\n&#8211; **Virtual thread executor** \u2014 the dashboard HTTP server now uses `newVirtualThreadPerTaskExecutor()` for non-blocking I\/O scaling on Java 25.<br \/>\n&#8211; **`plugin.yml` api-version** updated to `1.21` to match the target platform.<\/p>\n<p>### Compatibility<br \/>\n&#8211; **Minecraft 1.21.x \u2013 26.1.x** \u2014 compiled against Paper 1.21.1 API, which is forward-compatible with all Paper versions through 26.1.x.<\/p>\n<p>Existing configs remain fully compatible \u2014 no config changes required.<\/p>\n<p>&#8212;<\/p>\n<p>## \u2728 Features<\/p>\n<p>### \ud83d\udc0d Zero-Touch Python Setup<br \/>\nNo 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 &#038; ARM64), macOS (x64 &#038; ARM64), and Windows (x64). The binary is downloaded once and cached locally.<\/p>\n<p>### \ud83d\udce6 Automatic Dependency Installation<br \/>\nIf your bot has a `requirements.txt`, PyRunner will automatically run `pip install -r requirements.txt` before launching whenever the deps haven&#8217;t been installed yet. Delete `bot\/.pyrunner_deps_installed` to force a reinstall on next start.<\/p>\n<p>### \ud83d\udd01 Crash Recovery &#038; Loop Protection<br \/>\nThe 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 \u2014 preventing infinite restart spam while alerting you.<\/p>\n<p>### \ud83d\udda5\ufe0f Live Web Dashboard<br \/>\nA built-in HTTP server hosts a sleek, password-protected control panel accessible from any browser. Features include:<br \/>\n&#8211; **Live log streaming** via Server-Sent Events (SSE) \u2014 no refresh needed<br \/>\n&#8211; **Start \/ Stop \/ Restart \/ pip install** buttons<br \/>\n&#8211; Real-time **status, uptime, PID, and restart count**<br \/>\n&#8211; **Memory monitoring** \u2014 live RSS memory usage display<br \/>\n&#8211; Color-coded log lines (errors, warnings, system messages, tracebacks)<br \/>\n&#8211; Auto-scroll with toggle<br \/>\n&#8211; **stdin input bar** \u2014 send commands directly to the bot process<br \/>\n&#8211; **Multi-bot selector** \u2014 switch between bots from the dashboard (auto-detected)<br \/>\n&#8211; **CSRF protection** on all mutating API endpoints<br \/>\n&#8211; **Brute-force login protection** \u2014 lockout after 5 failed attempts<\/p>\n<p>### \ud83d\udd14 Discord Webhook Notifications<br \/>\nGet notified in a Discord channel when your bot starts, stops, crashes, or when pip install runs \u2014 all via a standard Discord webhook URL. No bot token required for notifications. Each event type is individually toggleable.<\/p>\n<p>### \ud83c\udfae In-Game Commands<br \/>\nFull control from the Minecraft console or in-game with the `\/pybot` command. No need to SSH into your server just to restart the bot.<\/p>\n<p>### \ud83e\udd16 Multiple Bot Support<br \/>\nRun more than one Python bot simultaneously \u2014 each with its own process, log file, and independent crash recovery. Control each bot individually with `\/pybot start <n>`, `\/pybot stop <n>`, etc.<\/p>\n<p>### \ud83d\udccc Python Version Pinning<br \/>\nPin a specific Python minor version (e.g. `&#8221;3.11&#8243;`, `&#8221;3.12&#8243;`) instead of always downloading the latest release.<\/p>\n<p>### \ud83d\udcbb stdin Passthrough<br \/>\nSend input directly to the bot process from the web dashboard without restarting it \u2014 useful for bots that accept console commands via stdin.<\/p>\n<p>### \ud83d\udcca Memory Monitoring<br \/>\nThe web dashboard shows live memory usage (RSS) of the bot process, read directly from `\/proc\/<pid>\/status` on Linux.<\/p>\n<p>### \ud83d\udd17 TunnelMC Integration<br \/>\nIf TunnelMC is installed and has an active tunnel on the dashboard port, PyRunner will print the public URL to console when the bot starts \u2014 purely informational, TunnelMC is never auto-started.<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udce5 Installation<\/p>\n<p>1. Download `PyRunner.jar` and place it in your `plugins\/` folder<br \/>\n2. Start the server once to generate config files<br \/>\n3. Place your bot code in `plugins\/PyRunner\/bot\/` (should include `requirements.txt` for dependencies)<br \/>\n4. Edit `plugins\/PyRunner\/config.yml` \u2014 at minimum set your bot token under `env:`<br \/>\n5. Restart the server, or run `\/pybot start`<\/p>\n<p>PyRunner will handle the rest \u2014 Python download, `pip install`, and bot launch happen automatically.<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udcc2 File Structure<\/p>\n<p>&#8220;`text<br \/>\nplugins\/<br \/>\n  PyRunner\/<br \/>\n    config.yml              \u2190 All plugin settings<br \/>\n    bot\/                    \u2190 Your bot code goes here<br \/>\n      main.py<br \/>\n      requirements.txt<br \/>\n      .pyrunner_deps_installed  \u2190 Created after successful pip install<br \/>\n    logs\/<br \/>\n      bot.log               \u2190 Live bot output (rotates at 5MB, keeps 3 backups)<br \/>\n      bot-<n>.log           \u2190 Per-bot log files when using multiple bots<br \/>\n    python\/                 \u2190 Auto-downloaded Python binary (do not edit)<br \/>\n      python.properties     \u2190 Cached binary paths<br \/>\n&#8220;`<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83c\udfae Commands &#038; Permissions<\/p>\n<p>**Permission node:** `pyrunner.admin` *(default: OP)*<\/p>\n<p>| Command | Description |<br \/>\n|&#8212;|&#8212;|<br \/>\n| `\/pybot start [name]` | Start the bot (or a specific bot by name) |<br \/>\n| `\/pybot stop [name]` | Stop the bot (or a specific bot by name) |<br \/>\n| `\/pybot restart [name]` | Restart the bot (or a specific bot by name) |<br \/>\n| `\/pybot status [name]` | Show status of all bots or a specific one |<br \/>\n| `\/pybot install [name]` | Force re-run pip install |<br \/>\n| `\/pybot reload` | Reload config.yml |<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83c\udf10 Web Dashboard<\/p>\n<p>Open `http:\/\/<your-server-ip>:<port>` in any browser (default port: `8080`).<\/p>\n<p>The dashboard is password protected. Change the default password in `config.yml`.<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udd14 Discord Webhook Setup<\/p>\n<p>1. Open the Discord channel you want notifications in<br \/>\n2. Go to **Edit Channel \u2192 Integrations \u2192 Webhooks \u2192 New Webhook**<br \/>\n3. Copy the Webhook URL<br \/>\n4. Paste it into `config.yml` under `discord.webhook.url`<br \/>\n5. Set `discord.webhook.enabled: true`<br \/>\n6. Restart the server or run `\/pybot reload`<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udcca Compatibility<\/p>\n<p>| | |<br \/>\n|&#8212;|&#8212;|<br \/>\n| **Minecraft** | Paper 1.21.x \u2013 26.1.x |<br \/>\n| **Java** | 25+ (compiled with Java 25) |<br \/>\n| **OS** | Linux, macOS, Windows |<br \/>\n| **Architectures** | x64, ARM64 |<br \/>\n| **Hosting** | Self-hosted, Pterodactyl, any VPS |<\/p>\n<p>> **\u26a0\ufe0f 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.<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udd17 Related Projects<\/p>\n<p>**NodeRunner** \u2014 The Node.js equivalent of this plugin. Run a Node.js Discord bot alongside your Minecraft server.<\/p>\n<p>**TunnelMC** \u2014 Expose any server port to the internet via ngrok tunnels. If your host doesn&#8217;t provide multiple port allocations, TunnelMC pairs perfectly with PyRunner to make the web dashboard publicly accessible without needing an extra port.<\/p>\n<p>&#8212;<\/p>\n<p>## \ud83d\udcc4 License<\/p>\n<p>**All Rights Reserved** \u2014 This plugin and its source code are proprietary.<\/p>\n<p>&#8212;<\/p>\n<p>*Developed by Spider*<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Run your Python Discord bot directly alongside your Minecraft server! Features auto-setup, live web dashboard, and in-game controls<\/p>\n","protected":false},"featured_media":127199,"template":"","meta":{"_minecraft_slug":"pyrunner","_minecraft_project_id":"GZQD4lHs","_minecraft_author":"spider2742","_minecraft_license":"LicenseRef-All-Rights-Reserved","_minecraft_downloads":12,"_minecraft_follows":1,"_minecraft_client_side":"unsupported","_minecraft_server_side":"required","_minecraft_storage_type":"zip","_minecraft_archive_name":"pyrunner.zip","_minecraft_size_bytes":257524,"_minecraft_version_count":4,"_minecraft_updated_at":"2026-05-15T22:59:18.505235Z","_minecraft_date_created":"2026-04-15T00:51:36.730923Z","_minecraft_date_modified":"2026-05-14T12:29:22.979509Z","_minecraft_project_url":"https:\/\/modrinth.com\/mod\/pyrunner","_minecraft_icon_attachment_id":127199,"_minecraft_imported_at":"2026-06-07T11:33:58+00:00","_minecraft_import_hash":"6ceaeaae2f084af0413c1be7e0d07201","_minecraft_versions":"","_minecraft_links":"","_minecraft_gallery":"","_minecraft_api_metadata":""},"mod_category":[124,125,126,127,128,129,123,92],"mod_loader":[130,131,132,133,134],"minecraft_version":[62,37,40,41,73,74,38,78,79,80,81,82,83,167,163],"class_list":["post-127198","mod","type-mod","status-publish","has-post-thumbnail","hentry","mod_category-bukkit","mod_category-folia","mod_category-management","mod_category-paper","mod_category-purpur","mod_category-spigot","mod_category-technology","mod_category-utility","mod_loader-bukkit","mod_loader-folia","mod_loader-paper","mod_loader-purpur","mod_loader-spigot","minecraft_version-1-21","minecraft_version-1-21-1","minecraft_version-1-21-10","minecraft_version-1-21-11","minecraft_version-1-21-2","minecraft_version-1-21-3","minecraft_version-1-21-4","minecraft_version-1-21-5","minecraft_version-1-21-6","minecraft_version-1-21-7","minecraft_version-1-21-8","minecraft_version-1-21-9","minecraft_version-26-1","minecraft_version-26-1-1","minecraft_version-26-1-2"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>PyRunner - Minecraft<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vpesports.com\/minecraft\/mods\/pyrunner\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PyRunner - Minecraft\" \/>\n<meta property=\"og:description\" content=\"Run your Python Discord bot directly alongside your Minecraft server! Features auto-setup, live web dashboard, and in-game controls\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vpesports.com\/minecraft\/mods\/pyrunner\/\" \/>\n<meta property=\"og:site_name\" content=\"Minecraft\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/pyrunner\\\/\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/pyrunner\\\/\",\"name\":\"PyRunner - Minecraft\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/pyrunner\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/pyrunner\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/pyrunner-icon-73f1a3cc92847448a08ad0d114ea8b870435da9f_96.webp\",\"datePublished\":\"2026-06-07T11:33:58+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/pyrunner\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/pyrunner\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/pyrunner\\\/#primaryimage\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/pyrunner-icon-73f1a3cc92847448a08ad0d114ea8b870435da9f_96.webp\",\"contentUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/pyrunner-icon-73f1a3cc92847448a08ad0d114ea8b870435da9f_96.webp\",\"width\":96,\"height\":96},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/pyrunner\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mods\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"PyRunner\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\",\"name\":\"Minecraft\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"PyRunner - Minecraft","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vpesports.com\/minecraft\/mods\/pyrunner\/","og_locale":"en_US","og_type":"article","og_title":"PyRunner - Minecraft","og_description":"Run your Python Discord bot directly alongside your Minecraft server! Features auto-setup, live web dashboard, and in-game controls","og_url":"https:\/\/vpesports.com\/minecraft\/mods\/pyrunner\/","og_site_name":"Minecraft","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/vpesports.com\/minecraft\/mods\/pyrunner\/","url":"https:\/\/vpesports.com\/minecraft\/mods\/pyrunner\/","name":"PyRunner - Minecraft","isPartOf":{"@id":"https:\/\/vpesports.com\/minecraft\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/pyrunner\/#primaryimage"},"image":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/pyrunner\/#primaryimage"},"thumbnailUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/pyrunner-icon-73f1a3cc92847448a08ad0d114ea8b870435da9f_96.webp","datePublished":"2026-06-07T11:33:58+00:00","breadcrumb":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/pyrunner\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vpesports.com\/minecraft\/mods\/pyrunner\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/vpesports.com\/minecraft\/mods\/pyrunner\/#primaryimage","url":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/pyrunner-icon-73f1a3cc92847448a08ad0d114ea8b870435da9f_96.webp","contentUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/pyrunner-icon-73f1a3cc92847448a08ad0d114ea8b870435da9f_96.webp","width":96,"height":96},{"@type":"BreadcrumbList","@id":"https:\/\/vpesports.com\/minecraft\/mods\/pyrunner\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vpesports.com\/minecraft\/"},{"@type":"ListItem","position":2,"name":"Mods","item":"https:\/\/vpesports.com\/minecraft\/mods\/"},{"@type":"ListItem","position":3,"name":"PyRunner"}]},{"@type":"WebSite","@id":"https:\/\/vpesports.com\/minecraft\/#website","url":"https:\/\/vpesports.com\/minecraft\/","name":"Minecraft","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vpesports.com\/minecraft\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod\/127198","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod"}],"about":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/types\/mod"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media\/127199"}],"wp:attachment":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media?parent=127198"}],"wp:term":[{"taxonomy":"mod_category","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_category?post=127198"},{"taxonomy":"mod_loader","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_loader?post=127198"},{"taxonomy":"minecraft_version","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/minecraft_version?post=127198"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}