Repository files navigation

BileTools

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; BileTools does not ship a second English message resource. Complete bundles are included for German, Spanish, Finnish, French, Hebrew, Italian, Japanese, Korean, Lithuanian, Dutch, Polish, Portuguese, Russian, Turkish, Vietnamese, Simplified Chinese, and Traditional Chinese. Set language in biletools.yml to select one. Entries in language.yml are sparse server-specific overrides; omitted entries resolve from the selected bundle and then code-owned English.

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.

Compatibility

RuntimeSupportNotes
Paper 1.20.1+PrimaryPublic PluginManager load path; hot-unload remains best-effort
Purpur 1.20.1+PrimaryPaper-family (same load/unload paths)
LeafPrimaryPaper-family fork; treated like Paper
Folia 1.20.1+Supportedfolia-supported: true; GlobalRegionScheduler only; hot-reload is best-effort
CanvasSupportedFolia fork; same regionized scheduling rules as Folia
Spigot 1.20.1+Best-effortpaper-plugin.yml-only jars are rejected; dual-descriptor jars load through plugin.yml
  • One jar supports Minecraft 1.20.1 through current 26.x servers
  • plugin.ymlapi-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

Folia / Canvas caveats

  • 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

About

Tools for making garbage

Topics

Resources

Stars

51 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

BileTools

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; BileTools does not ship a second English message resource. Complete bundles are included for German, Spanish, Finnish, French, Hebrew, Italian, Japanese, Korean, Lithuanian, Dutch, Polish, Portuguese, Russian, Turkish, Vietnamese, Simplified Chinese, and Traditional Chinese. Set language in biletools.yml to select one. Entries in language.yml are sparse server-specific overrides; omitted entries resolve from the selected bundle and then code-owned English.

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.

Compatibility

RuntimeSupportNotes
Paper 1.20.1+PrimaryPublic PluginManager load path; hot-unload remains best-effort
Purpur 1.20.1+PrimaryPaper-family (same load/unload paths)
LeafPrimaryPaper-family fork; treated like Paper
Folia 1.20.1+Supportedfolia-supported: true; GlobalRegionScheduler only; hot-reload is best-effort
CanvasSupportedFolia fork; same regionized scheduling rules as Folia
Spigot 1.20.1+Best-effortpaper-plugin.yml-only jars are rejected; dual-descriptor jars load through plugin.yml
  • One jar supports Minecraft 1.20.1 through current 26.x servers
  • plugin.ymlapi-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

Folia / Canvas caveats

  • 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

About

Tools for making garbage

Topics

Resources

Stars

51 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

BileTools

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; BileTools does not ship a second English message resource. Complete bundles are included for German, Spanish, Finnish, French, Hebrew, Italian, Japanese, Korean, Lithuanian, Dutch, Polish, Portuguese, Russian, Turkish, Vietnamese, Simplified Chinese, and Traditional Chinese. Set language in biletools.yml to select one. Entries in language.yml are sparse server-specific overrides; omitted entries resolve from the selected bundle and then code-owned English.

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.

Compatibility

RuntimeSupportNotes
Paper 1.20.1+PrimaryPublic PluginManager load path; hot-unload remains best-effort
Purpur 1.20.1+PrimaryPaper-family (same load/unload paths)
LeafPrimaryPaper-family fork; treated like Paper
Folia 1.20.1+Supportedfolia-supported: true; GlobalRegionScheduler only; hot-reload is best-effort
CanvasSupportedFolia fork; same regionized scheduling rules as Folia
Spigot 1.20.1+Best-effortpaper-plugin.yml-only jars are rejected; dual-descriptor jars load through plugin.yml
  • One jar supports Minecraft 1.20.1 through current 26.x servers
  • plugin.ymlapi-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

Folia / Canvas caveats

  • 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

About

Tools for making garbage

Topics

Resources

Stars

51 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

BileTools

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; BileTools does not ship a second English message resource. Complete bundles are included for German, Spanish, Finnish, French, Hebrew, Italian, Japanese, Korean, Lithuanian, Dutch, Polish, Portuguese, Russian, Turkish, Vietnamese, Simplified Chinese, and Traditional Chinese. Set language in biletools.yml to select one. Entries in language.yml are sparse server-specific overrides; omitted entries resolve from the selected bundle and then code-owned English.

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.

Compatibility

RuntimeSupportNotes
Paper 1.20.1+PrimaryPublic PluginManager load path; hot-unload remains best-effort
Purpur 1.20.1+PrimaryPaper-family (same load/unload paths)
LeafPrimaryPaper-family fork; treated like Paper
Folia 1.20.1+Supportedfolia-supported: true; GlobalRegionScheduler only; hot-reload is best-effort
CanvasSupportedFolia fork; same regionized scheduling rules as Folia
Spigot 1.20.1+Best-effortpaper-plugin.yml-only jars are rejected; dual-descriptor jars load through plugin.yml
  • One jar supports Minecraft 1.20.1 through current 26.x servers
  • plugin.ymlapi-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

Folia / Canvas caveats

  • 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

About

Tools for making garbage

Topics

Resources

Stars

51 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

BileTools

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; BileTools does not ship a second English message resource. Complete bundles are included for German, Spanish, Finnish, French, Hebrew, Italian, Japanese, Korean, Lithuanian, Dutch, Polish, Portuguese, Russian, Turkish, Vietnamese, Simplified Chinese, and Traditional Chinese. Set language in biletools.yml to select one. Entries in language.yml are sparse server-specific overrides; omitted entries resolve from the selected bundle and then code-owned English.

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.

Compatibility

RuntimeSupportNotes
Paper 1.20.1+PrimaryPublic PluginManager load path; hot-unload remains best-effort
Purpur 1.20.1+PrimaryPaper-family (same load/unload paths)
LeafPrimaryPaper-family fork; treated like Paper
Folia 1.20.1+Supportedfolia-supported: true; GlobalRegionScheduler only; hot-reload is best-effort
CanvasSupportedFolia fork; same regionized scheduling rules as Folia
Spigot 1.20.1+Best-effortpaper-plugin.yml-only jars are rejected; dual-descriptor jars load through plugin.yml
  • One jar supports Minecraft 1.20.1 through current 26.x servers
  • plugin.ymlapi-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

Folia / Canvas caveats

  • 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

About

Tools for making garbage

Topics

Resources

Stars

51 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

BileTools

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; BileTools does not ship a second English message resource. Complete bundles are included for German, Spanish, Finnish, French, Hebrew, Italian, Japanese, Korean, Lithuanian, Dutch, Polish, Portuguese, Russian, Turkish, Vietnamese, Simplified Chinese, and Traditional Chinese. Set language in biletools.yml to select one. Entries in language.yml are sparse server-specific overrides; omitted entries resolve from the selected bundle and then code-owned English.

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.

Compatibility

RuntimeSupportNotes
Paper 1.20.1+PrimaryPublic PluginManager load path; hot-unload remains best-effort
Purpur 1.20.1+PrimaryPaper-family (same load/unload paths)
LeafPrimaryPaper-family fork; treated like Paper
Folia 1.20.1+Supportedfolia-supported: true; GlobalRegionScheduler only; hot-reload is best-effort
CanvasSupportedFolia fork; same regionized scheduling rules as Folia
Spigot 1.20.1+Best-effortpaper-plugin.yml-only jars are rejected; dual-descriptor jars load through plugin.yml
  • One jar supports Minecraft 1.20.1 through current 26.x servers
  • plugin.ymlapi-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

Folia / Canvas caveats

  • 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

About

Tools for making garbage

Topics

Resources

Stars

51 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

BileTools

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; BileTools does not ship a second English message resource. Complete bundles are included for German, Spanish, Finnish, French, Hebrew, Italian, Japanese, Korean, Lithuanian, Dutch, Polish, Portuguese, Russian, Turkish, Vietnamese, Simplified Chinese, and Traditional Chinese. Set language in biletools.yml to select one. Entries in language.yml are sparse server-specific overrides; omitted entries resolve from the selected bundle and then code-owned English.

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.

Compatibility

RuntimeSupportNotes
Paper 1.20.1+PrimaryPublic PluginManager load path; hot-unload remains best-effort
Purpur 1.20.1+PrimaryPaper-family (same load/unload paths)
LeafPrimaryPaper-family fork; treated like Paper
Folia 1.20.1+Supportedfolia-supported: true; GlobalRegionScheduler only; hot-reload is best-effort
CanvasSupportedFolia fork; same regionized scheduling rules as Folia
Spigot 1.20.1+Best-effortpaper-plugin.yml-only jars are rejected; dual-descriptor jars load through plugin.yml
  • One jar supports Minecraft 1.20.1 through current 26.x servers
  • plugin.ymlapi-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

Folia / Canvas caveats

  • 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

About

Tools for making garbage

Topics

Resources

Stars

51 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

BileTools

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; BileTools does not ship a second English message resource. Complete bundles are included for German, Spanish, Finnish, French, Hebrew, Italian, Japanese, Korean, Lithuanian, Dutch, Polish, Portuguese, Russian, Turkish, Vietnamese, Simplified Chinese, and Traditional Chinese. Set language in biletools.yml to select one. Entries in language.yml are sparse server-specific overrides; omitted entries resolve from the selected bundle and then code-owned English.

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.

Compatibility

RuntimeSupportNotes
Paper 1.20.1+PrimaryPublic PluginManager load path; hot-unload remains best-effort
Purpur 1.20.1+PrimaryPaper-family (same load/unload paths)
LeafPrimaryPaper-family fork; treated like Paper
Folia 1.20.1+Supportedfolia-supported: true; GlobalRegionScheduler only; hot-reload is best-effort
CanvasSupportedFolia fork; same regionized scheduling rules as Folia
Spigot 1.20.1+Best-effortpaper-plugin.yml-only jars are rejected; dual-descriptor jars load through plugin.yml
  • One jar supports Minecraft 1.20.1 through current 26.x servers
  • plugin.ymlapi-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

Folia / Canvas caveats

  • 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

About

Tools for making garbage

Topics

Resources

Stars

51 stars

Watchers

4 watching

Forks

Releases

Packages

Used by

Contributors

Languages