TunnelMC
1.5.0Expose any server port to the internet via ngrok, cloudflared & playit tunnels — no extra port allocations needed.
1.5.0latestTunnelMC 1.5.0Aug 30, 2026
A maintenance release from a systematic audit, plus one addition to keep pace with an ngrok change: - Added: ngrok tunnels can now use a reserved/static domain. ngrok moved domain selection to their own dashboard ("Choose your URL") — pick one there, drop it into the newWhat's New in 1.5.0: Reliability & Security Fixes
hostnamefield, and it's passed along with--url. Leave it blank for a random domain each start, same as before. - Fixed: editing a tunnel could silently wipe its saved authtoken/cfToken. The edit form correctly never sends secrets back to the browser, but saving an unrelated change (like toggling auto-start) was overwriting the stored token with blank — breaking the tunnel on its next start. Blank secret fields on save now keep the existing value; only an actual new value overwrites it. - Fixed: a tunnel name containing an apostrophe broke every action button on that tunnel's card. Start/Stop/Restart/Delete/Copy buttons are now correctly escaped for names, URLs, and IDs containing',", or\. - Fixed: renaming a tunnel to an existing tunnel's name silently orphaned the old one. The old tunnel's process kept running with nothing left tracking it, and it disappeared fromconfig.ymlentirely. Renaming to a name already in use is now rejected instead. - Fixed: clicking Stop immediately after Start could leave an untracked tunnel process running, and later resurrect it as "running" in the dashboard even though you'd explicitly stopped it. A start/stop race no longer lets a launch that lost the race adopt its process. - Fixed: playit.gg's "Try Again" button could hand back a dead claim session for up to ~11 minutes after a rejected or cancelled link attempt, instead of issuing a fresh code. - Fixed: an unsanitized tunnel name could write ngrok's per-tunnel config file outside the intended directory. Tunnel names are now restricted to letters, numbers,_, and-. - Fixed: editing any tunnel could silently wipe a saved ngrok reserved domain back to blank, since the persistence path rebuilt every tunnel's entry from scratch on every save. - Fixed: a malformed dashboard API request could return an empty, unexplained server error with nothing in the log. Bad requests now get a clear JSON error and the real cause is logged server-side. - Improved: error logging for playit/ngrok/cloudflared download and connection failures now always includes the exception type (and throw site when there's no message), instead of sometimes printing a bare "null".1.4.0TunnelMC 1.4.0Aug 11, 2026
A static address, right protocol per tunnel. playit.gg is the pick for Bedrock/Geyser — TCP for Java Edition, UDP for Bedrock (Bedrock/RakNet is UDP-only), both with an address that survives restarts. Neither ngrok's free tier nor cloudflared quick tunnels can do that, and the official playit.gg plugin doesn't support UDP either. Combined TCP+UDP and TCP-only custom tunnels are also available (require playit premium); UDP-only and the two Minecraft presets work on the free tier. No token to paste. Link an account from the dashboard's Settings tab — click Link, open the generated claim link, approve it in your browser, and the dashboard flips to linked automatically. One shared agent. playit's model is one agent per machine (accounts have a limited agent quota), so TunnelMC runs a singleWhat's New in 1.4.0: playit.gg Support
playitdprocess shared by every playit tunnel you add. Every claim provisions a fresh agent identity — there's no API to target an existing one — so Unlink deletes this server's tunnels from your playit.gg account before clearing the secret, and a re-link recreates them fresh with new addresses. That keeps tunnels from piling up on your account; the one thing that still needs manual cleanup is the old agent record itself at playit.gg/account/agents, since playit has no API to delete an agent at all. Clean up leftovers without leaving the dashboard. A "Check for Other Tunnels" button in Settings finds any tunnel on your playit agent that TunnelMC isn't tracking and lets you delete it in place. Deleting a tunnel from the Tunnels tab deletes it on playit's side too. macOS: playit.gg publishes no official Mac binary. The dashboard offers a TunnelMC-compiled build (SHA-256 verified) or self-build instructions — ngrok and cloudflared are unaffected and work normally on macOS.1.3.0TunnelMC 1.3.0May 14, 2026 What's New in 1.3.0
Java 25 & Build Modernization
- Upgraded to Java 25 — compiled with Java 25 bytecode for the latest JVM performance and language features. - Gradle 9.5.1 — build system upgraded from Gradle 8.x to 9.5.1 for native Java 25 support. - Virtual thread executor — the dashboard HTTP server now usesnewVirtualThreadPerTaskExecutor()for non-blocking I/O scaling on Java 25. - `plugin.yml` api-version updated from1.13to1.21to match the target platform and suppress Paper deprecation warnings.Security Hardening
- CSRF protection — all mutating API endpoints now require anX-TM-Requestheader. - Brute-force login protection — lockout after 5 failed attempts with 500ms delay per failure. - Timing-safe password comparison — login now usesMessageDigest.isEqual()to prevent timing attacks. - CSP headers — Content-Security-Policy added to all dashboard responses to mitigate XSS risks. - Session sweep — expired sessions and stale lockout entries are automatically cleaned up hourly.Stability
- `volatile` singleton — static plugin instance is nowvolatileand nulled on disable to prevent classloader leaks during reloads. - Config bounds checking — all numeric config getters now clamp to valid ranges viaMath.max. - Default password warning — a prominent console warning at startup if the dashboard password is still"changeme".Compatibility
- Minecraft 1.21.x – 26.2.x — compiled against Paper 1.21.1 API, which is forward-compatible with all Paper versions through 26.2.x. Existing configs remain fully compatible — no config changes required.1.2.0TunnelMC 1.2.0Apr 13, 2026 What's New in 1.2.0
Cloudflared Support
Every tunnel now has its ownproviderfield. Choosengrokorcloudflaredper tunnel, or mix them in the same config. Cloudflared quick tunnels — zero account setup, random*.trycloudflare.comURL, HTTP only. Great for dashboards and web services. Cloudflared named tunnels — paste a Cloudflare Zero Trust token and your custom hostname. Persistent URL, any protocol you've configured in Cloudflare.Multiple ngrok Accounts
Each ngrok tunnel now has its ownauthtokenfield (required for ngrok v3). Authtokens are passed as a CLI flag instead of writing to the global ngrok config, so you can run tunnels from completely different ngrok accounts at the same time.Per-Tunnel Region
Each ngrok tunnel can set its ownregion, overriding the global default.Web Dashboard
A full browser-based management dashboard on port8090(local only). From it you can: - View all tunnels — status, URL, uptime, restarts - Start / stop / restart tunnels individually - Create, edit, and delete tunnels live — no server restart needed - Download ngrok and cloudflared binaries with one click - Edit all global settingsAuto-Expose on First Run
If no tunnels are configured, TunnelMC automatically downloads cloudflared and creates a quick tunnel to the dashboard on first startup so you can access it from anywhere right away.Per-Tunnel Auto-Start
Each tunnel has its ownauto-startfield. Set it totrueto start a tunnel on server boot even when global auto-start is off. The defaultdashboardtunnel ships withauto-start: true.1.1.0TunnelMC 1.1.0Mar 31, 2026 What's new in 1.1.0
Auto-Restart & Crash Loop Protection
Tunnels now restart automatically if the ngrok process exits unexpectedly. Crash loop protection kicks in if a tunnel fails too many times within a configurable time window, stopping the retry cycle to prevent runaway restarts. Both the restart delay and failure threshold are fully configurable.Health Checks
TunnelMC now periodically verifies each tunnel is still alive by querying ngrok's local API. If a tunnel silently dies without crashing, the health check catches it and triggers an automatic restart. The check interval is configurable, or can be disabled entirely.
You can now trigger the ngrok binary download manually at any time from in-game or console with/tunnel downloadCommand/tunnel download. Useful if the initial download failed or you want to re-fetch the binary without restarting your server.NodeRunner & PyRunner Integration
If [NodeRunner](https://modrinth.com/plugin/noderunner) or [PyRunner](https://modrinth.com/plugin/pyrunner) is installed and one of your configured tunnel ports matches their dashboard port, TunnelMC will print a helpful suggestion in console. This is purely informational — these bot runners are never auto-started by TunnelMC. ---Config changes
Four new options have been added toconfig.yml:
Existing configs remain fully compatible — all new keys will use their defaults if not present.auto-restart: true restart-delay-seconds: 10 max-restarts: 5 crash-window-seconds: 60 health-check-interval-seconds: 30 integrations: noderunner-suggestion: true pyrunner-suggestion: true1.0.0TunnelMC 1.0.0Mar 29, 2026 TunnelMC
Expose any port on your Minecraft server to the internet via ngrok tunnels — no extra port allocations needed.
TunnelMC is a Bukkit/Spigot/Paper plugin that automatically downloads and manages ngrok as a child process, creates tunnels for any local port, and broadcasts the public URL to console and online OPs the moment the tunnel is ready. Perfect for exposing web dashboards (like [NodeRunner](https://modrinth.com/plugin/noderunner)'s WebUI) when you don't have a spare port allocation on shared or Pterodactyl hosting. ---Features
No ngrok installed? No problem. TunnelMC automatically detects your OS and CPU architecture and downloads the correct ngrok v3 binary on first launch. Downloaded once, cached forever.Zero-Touch ngrok Setup
UseHTTP & TCP Protocol Support
httpprotocol for web dashboards and APIs — gets you a publichttps://URL instantly. Usetcpfor game servers, SSH, databases, or any other TCP traffic — gets you atcp://address. Note: UDP is not supported by ngrok.
Define as many tunnels as you need in config, each with its own name, port, and protocol. Each tunnel runs as an independent ngrok process.Multiple Tunnels
The public ngrok URL is printed to console and sent to all online OPs the moment the tunnel comes online — no need to dig through logs.Instant URL Broadcast
Start, stop, restart, and check tunnel status from in-game or the console viaFull In-Game Control
/tunnel. Tab completion included.
Fully tested on Pterodactyl panels. No extra port allocation needed — that's the whole point. If your host throttles the ngrok download, TunnelMC will warn you after 30 seconds with manual install instructions.Pterodactyl Compatible
Optionally start all tunnels automatically on server boot with a configurable startup delay. ---Auto-Start
1. DropInstallation
TunnelMC.jarinto yourplugins/folder 2. Start the server once to generate the config 3. Sign up free at [ngrok.com](https://ngrok.com) and copy your authtoken from the [dashboard](https://dashboard.ngrok.com/get-started/your-authtoken) 4. Paste your authtoken intoplugins/TunnelMC/config.yml5. Restart or run/tunnel start---Configuration
---authtoken: "your-ngrok-token-here" auto-start: true startup-delay-seconds: 0 region: "us" # us, eu, ap, au, sa, jp, in notify-ops: true tunnels: - name: "dashboard" port: 8080 protocol: "http" # https:// URL - name: "gameserver" port: 25565 protocol: "tcp" # tcp:// URL
Permission:Commands & Permissions
tunnelmc.admin(default: OP) | Command | Description | | :--- | :--- | |/tunnel start [name]| Start all or a specific tunnel | |/tunnel stop [name]| Stop all or a specific tunnel | |/tunnel restart [name]| Restart all or a specific tunnel | |/tunnel url [name]| Show public URL(s) | |/tunnel status| Show status of all tunnels | |/tunnel reload| Reload config and restart tunnels | ---
- 1 tunnel at a time — Free accounts cannot run multiple simultaneous tunnels. Multiple tunnels require a paid ngrok plan. - Random URLs — Free accounts get a new random URL on every restart. Paid plans support fixed custom domains. - Bandwidth limits — Free accounts have monthly bandwidth limits. See [ngrok's pricing](https://ngrok.com/pricing). - UDP not supported — ngrok only supports TCP-based protocols. ---ngrok Free Plan Limitations
No extra port allocation needed — TunnelMC handles that. However, some hosts throttle downloads fromPterodactyl Notes
bin.equinox.io. If that happens, TunnelMC warns you after 30 seconds and you can install ngrok manually instead: 1. Download ngrok from [ngrok.com/download](https://ngrok.com/download) on your PC — pick Linux → 64-bit 2. Extract the archive — you get a single file calledngrok3. Upload it toplugins/TunnelMC/ngrok/ngrokvia the file manager (the secondngrokis the file name itself) 4. Restart — TunnelMC detects it automatically and skips the download ---
| | | | :--- | :--- | | Platforms | Bukkit, Spigot, Paper, Purpur | | Minecraft | 1.13+ | | Java | 11+ (21 recommended) | | OS | Linux, macOS, Windows | | Architectures | x64, ARM64 | | Hosting | Self-hosted, Pterodactyl, any VPS |Compatibility
⚠️ Java Version Note: Although the plugin API is compatible with 1.13+, the JAR is compiled with Java 21 which means your server must be running Java 21 or higher regardless of Minecraft version. Older Minecraft versions (1.13–1.16) typically run on Java 8 or 11 and will fail to load this plugin with an
---UnsupportedClassVersionError. In practice, Java 21 + Paper 1.21.x is the recommended and fully tested setup.
[NodeRunner](https://modrinth.com/plugin/noderunner) — Run a Node.js Discord bot directly inside your Minecraft server. TunnelMC pairs perfectly with NodeRunner to expose its web dashboard without needing an extra port. ---Related
All Rights Reserved — This plugin and its source code are proprietary. You may not copy, redistribute, modify, or decompile this software without explicit written permission from the author. --- Developed by [Spider](https://github.com/Spider2742)License
Similar projects
Plugin →VeinMiner
Mine the whole vein on mining a single ore/block. Make the tedious mining experience to something satisfying and fun! FTB Ultimine alternative
99.3MSueta
Simple Voice Chat
A working voice chat in Minecraft!
76.8MSueta
Chunky
Pre-generates chunks, quickly and efficiently
18.4MSueta
VeinMiner Enchantment
Veinminer Addon - Adds vineminer enchantment to enchanting tables. Only tools with the enchantment can veinmine
18MSueta
JourneyMap
Real-time map used for mapping in-game or your browser as you explore.
14.7MSueta
WorldEdit
A Minecraft Map Editor... that runs in-game! With selections, schematics, copy and paste, brushes, and scripting. Use it in creative, or use it temporarily in survival.
11.6MSueta