Links
Tags
Creators
Details
Licensed ARR
Published 6 months ago
Updated 2 months ago
All versions
1.3.0
Release
TunnelMC 1.3.05 months ago 205
Uploaded by
Compatibility
Minecraft: Java Edition
26.2
26.1.x
1.21.x
Platforms
Bukkit
Paper
Purpur
Spigot
Changes
🆕 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 uses
newVirtualThreadPerTaskExecutor()for non-blocking I/O scaling on Java 25. plugin.ymlapi-version updated from1.13to1.21to match the target platform and suppress Paper deprecation warnings.
Security Hardening
- CSRF protection — all mutating API endpoints now require an
X-TM-Requestheader. - Brute-force login protection — lockout after 5 failed attempts with 500ms delay per failure.
- Timing-safe password comparison — login now uses
MessageDigest.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
volatilesingleton — 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 via
Math.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.
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:cEYrTBi3:ZgECaVEE"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:cEYrTBi3:ZgECaVEE"
}

