Tools for making garbage
Language and localization
Canonical English is defined in the typed Java catalog at src/main/java/com/volmit/bile/localization/BileMessages.java and generated as languages/en_US.toml. The 17 repository translations download from the master language directory into languages/<locale>.toml only when missing. BileTools-owned keys use direct command, message, and gui sections without an outer bile table, and the English header documents each placeholder. Edit those TOML files directly or use /bile language server edit; local files are never replaced and omitted entries resolve from code-owned English. /bile config opens the centered settings and language dashboard and confirms edits with one hot-load line, while /bile debug dump produces the BileTools report used by VolmLib's combined debug dump.
What the hell does this do?
- Any plugin jar files modified while loaded (maven compile or export or even drag/drop) are automatically reloaded. So now all you have to do is smack the run button and bam, its already in the game without reloading, dragging or really doing anything. Psst... Works best with multiple monitors.
- New Plugins are hot-dropped into the server when they are added to the plugins folder
- It's basically plugman also. You can unload load and reload plugins.
| Runtime |
Support |
Notes |
| Paper 1.20.1+ |
Primary |
Public PluginManager load path; hot-unload remains best-effort |
| Purpur 1.20.1+ |
Primary |
Paper-family (same load/unload paths) |
| Leaf |
Primary |
Paper-family fork; treated like Paper |
| Folia 1.20.1+ |
Supported |
folia-supported: true; GlobalRegionScheduler only; hot-reload is best-effort |
| Canvas |
Supported |
Folia fork; same regionized scheduling rules as Folia |
| Spigot 1.20.1+ |
Best-effort |
paper-plugin.yml-only jars are rejected; dual-descriptor jars load through plugin.yml |
| Velocity 3.4+ / 4.x |
Supported |
Same jar on the proxy; hot reload of proxy plugins, but BileTools cannot reload itself there |
- One jar supports Minecraft 1.20.1 through current 26.x servers, and Velocity 3.4+ / 4.x proxies
- plugin.yml api-version: 1.20
- Production compile floor: Paper and Spigot API 1.20.1 with current 26.x compatibility compile gates
- Runtime JVM: Java 17 on 1.20.1; newer servers still require the JVM version mandated by that server (Java 25 on 26.x)
- Build JVM: Java 25+
- Lifecycle mutations always run on the global/main thread (never on PluginOps / network threads)
- On Folia/Canvas, player sounds/messages that touch entities are routed through the entity scheduler
- Third-party plugins without folia-supported: true may still fail when hot-loaded
- Plugin reload on regionized servers is inherently riskier than on single-threaded Paper/Spigot
- Classic Bukkit.getScheduler() is never used on Folia/Canvas (it throws UnsupportedOperationException)
- Runtime hot-load preserves required/optional dependency discovery, but cannot recreate Paper's startup provider graph; missing BEFORE, AFTER, and OMIT dependencies are loaded first so the public PluginManager can validate the target plugin
Watcher filters (biletools.yml)
- watcher.ignore — plugin names that auto hot-drop/reload/unload will skip (defaults include LuckPerms, Vault, ProtocolLib, …)
- watcher.only — if non-empty, only these plugins are auto-managed (allowlist mode)
- Manual /bile load|unload|reload always bypasses ignore/only
- Automatic jar changes use a fixed three-second latest-state queue with one dependency-aware reload batch in flight and one trailing batch retained
- lifecycle.health-check — fail reload if plugin is not actually enabled/registered after enable
- observability.log-timings — log unload/load/reload phase timings