
VelocityNavigator
A production-grade Velocity proxy plugin that introduces absolute traffic control over your network through intelligent load balancing, circuit breaker resilience, Bedrock/Geyser support, and a highly context-aware /lobby system.
Added
- Embedded Prometheus Exporter & Admin Panel — Built-in HTTP server exposing real-time metrics (
/metrics) on routing distributions, pings, CB statuses, and connection events. - Grafana Dashboard Setup Command —
/vn setup grafanaauto-generates a premium, pre-configured Grafana telemetry dashboard configuration JSON file. - Interactive Selector Menus — Native Bedrock Form GUI (via Geyser/Floodgate integration) and clickable Java Chat Selector Menu with hover tooltips displaying health and latencies.
- Ping-Based Routing Strategy (
latency) — Dynamically select the server with the lowest ping latency to optimize player connections.
Fixed
- Hardened Java and Bedrock lobby menu selections so stale or manually forged choices cannot bypass drain mode, circuit breakers, capacity checks, or configured lobby pools.
- Started the Prometheus exporter during initial proxy boot when enabled, not only after
/vn reload. - Restored true consecutive-failure behavior for the circuit breaker.
- Preserved update notification settings during config rewrites and aligned admin join notifications with
[update_checker].notify_admins. - Accepted the documented
latencyrouting mode in config validation and migration normalization. - Normalized contextual group names consistently so mixed-case mappings continue to route.
- Aligned Maven artifact version, Velocity plugin metadata, and user-facing docs for the 4.2.0 release.
Changed
- Config version bumped to 6. The generated
navigator.tomlhas been completely redesigned with section banners, grouped documentation, and a friendlier layout. Existing configs are auto-migrated and backed up.
- Embedded Prometheus Exporter & Admin Panel — Built-in HTTP server exposing real-time metrics (
[4.1.0] — 2026-05-26
Added
- Bedrock/Geyser Player Support — Soft-dependency integration with Geyser and Floodgate. Strips advanced Kyori Component formatting (gradients, hover, click actions) to display beautifully on Bedrock clients, and maps authentic Java UUIDs for player affinity tracking.
- First-Run Experience Polish — Beautiful console-printed welcome dashboard on fresh installs. Detects plugin upgrades and showcases a clean release notes changelog digest.
/vn serversDiagnostics Command — Elegant paginated status dashboard for all configured lobbies, complete with player count/max capacity limits, circuit breaker state tracking, and drain statuses.- Configurable Dashboard Colors — Customizable status tags/colors for
/vn serverssupporting full hex, RGB, and MiniMessage styling innavigator.toml. - Typo Auto-Correction & Levenshtein Validation — Dynamic typo detection on config reload/load using Levenshtein distance metrics (e.g., suggesting
"least_players"for"leadt_players"). - Self-Documenting Configuration Keys — The entire
navigator.tomlfile comments are dynamically populated on generation/migration, pointing users to the exact section anchor of the official Wiki page. - Automatic Legacy Color Code Converter — Seamlessly matches and converts all 22 standard
&and§legacy formatting codes to MiniMessage syntax on load (supports"auto"with one-time warnings,"minimessage", or"legacy"modes). - Periodic Update Checker with Backoff — Recurring scheduled task loop to check for updates with exponential backoff on HTTP 429 errors (scales dynamically up to 4 hours).
- Empty Lobby Routing Fallbacks — Customizable degradation strategies (
"disconnect"or"fallback_server") when all primary lobby options are offline or circuit-broken. - Permission Default Change — Standardized
/lobbydefault command permission changed to"none"for immediate out-of-the-box adoption. Existing migration preserves existing admin-defined configurations safely.
[4.0.0] — 2026-05-01
Added
- Power of Two selection algorithm (
power_of_two) — picks two random candidates, selects the one with fewer players. Near-optimal distribution at O(1) cost. - Weighted Round Robin selection algorithm (
weighted_round_robin) — interleaved WRR that distributes traffic proportionally to server weights. - Least Connections selection algorithm (
least_connections) — selects the server with the lowest exponential moving average (EMA) of connection load and rate. - Consistent Hash selection algorithm (
consistent_hash) — deterministic player-to-server mapping using a consistent hash ring with 150 virtual nodes and SHA-256 hashing. Provides session affinity. - LobbyEntry format — servers can be configured as plain strings or inline tables with
max_playersandweightfields. Backward compatible with plain strings. - Per-lobby max-player cap — servers at their
max_playerscapacity are automatically excluded from routing. - Circuit Breaker — automatic server failure detection with CLOSED → OPEN → HALF_OPEN state machine. Unhealthy servers are excluded from routing until they recover.
- Server Drain Mode —
/vn drain <server>,/vn undrain <server>,/vn drain statuscommands for graceful server maintenance. - Connection Retry with Fallback — automatic retry on connection failure with configurable
max_retries. Shows retry message with<attempt>/<max>placeholders. - Per-Group Selection Mode Override — contextual routing groups can specify their own
mode, overriding the globalselection_mode. - Fallback Priority Chain — ordered fallback groups when a contextual group's servers are all unavailable.
- Player Affinity Routing — sticky sessions with configurable
stickinessprobability (0.0–1.0). Players tend to return to their previous lobby. - Graceful Degradation — when all health checks fail, fall back to a configured degradation mode (default:
random) instead of showing "No lobby found". - Geo-Based Routing (experimental) — stub implementation for geo-based lobby routing using MaxMind GeoLite2 Country database.
- Routing Metrics API — new
NavigatorAPImethods:getRoutingDistribution(),getHealthCheckLatencies(),getCircuitBreakerStatuses(). - Connection Rate Tracking — sliding window (60-second) connection rate tracker used by
least_connectionsmode. - Server Load Tracking — EMA-based server load tracker used by
least_connectionsmode. - Routing Stats — per-server connection counts with 60-second reset, shown in
/vn status. - Enhanced /vn status dashboard — now shows circuit breaker status, drained servers, and routing distribution.
/vn updatecheckcommand — manually check for updates (replaces recurring auto-update check).- Startup update notification — one-time update check 5 seconds after proxy start.
- Admin join update notification — players with
velocitynavigator.adminpermission are notified in-game when they join if an update is available. Controlled bynotify_admins_on_joinconfig. <player>placeholder — new placeholder available in all message templates.<attempt>and<max>placeholders — available inmessages.retrying.messages.retryingconfig — new message template for connection retry notifications.notify_on_startupconfig — suppress startup update notification.notify_admins_on_joinconfig — enable/disable in-game admin update notification on join.- Health check cache purge — expired cache entries are automatically purged every 60 seconds.
getCachedOnlineServers()method — synchronous cached player count access for initial join balancing (replaces blocking.join()call).- Config version field —
CURRENT_VERSIONset to 4. Auto-migration from v3 configs with.bakbackup.
Changed
- Removed
.join()blocking call inonPlayerChooseInitialServer— replaced with synchronous cache lookup. Falls through to Velocity's built-in try list on cold start. - Round-robin state only resets when lobby topology changes —
applyLoadedConfiguration()now compares previous and current lobby lists before resetting. - Contextual groups — changed from
Map<String, List<LobbyEntry>>toMap<String, GroupConfig>where GroupConfig containsserversand optionalmode. - UpdateChecker — removed recurring schedule; now runs a single check on startup. Removed
enabled,notifyConsole,startupDelaySecondsfields. - ConfigManager — reads both plain strings and inline tables for lobby entries (backward compatible). Writes inline tables when
max_playersorweightis non-default. - MessageFormatter — added
player,attempt,maxto allowed placeholders. noLobbyFoundmessage — now includes(<reason>)placeholder by default.ServerCandidaterecord — now includeseffectiveWeightandemaLoadfields.RouteDecision— provides ordered candidate list for retry fallback.
Fixed
- Blocking
.join()in event handler —onPlayerChooseInitialServerno longer blocks the event loop with.join()calls. Uses cached data synchronously instead. - Round-robin reset on every reload — round-robin counter is now only reset when the lobby topology actually changes, preventing unnecessary redistribution on config reload.
- Health check cache memory leak — expired cache entries are now purged every 60 seconds.
- Permission node inconsistency —
velocitynavigator.bypasscooldownnow also checksvelocitynavigator.bypass.cooldownfor consistency.
Deprecated
velocitynavigator.bypasscooldownpermission — usevelocitynavigator.bypass.cooldowninstead. The legacy name still works as a fallback.
Removed
update_checker.enabledconfig field — the update checker now always runs on startup.update_checker.notifyConsoleconfig field — update notifications are always logged to console.update_checker.startupDelaySecondsconfig field — startup delay is fixed at 5 seconds.- Recurring update check schedule — replaced by one-time startup check and
/vn updatecheck.
- Power of Two selection algorithm (
[3.0.0] — 2026-04-10
✨ New Features
- Initial Join Balancing — Players are now load-balanced the moment they connect to the proxy, not just when they run
/lobby. Configurable viabalance_initial_joininnavigator.toml. - Developer API — Third-party plugins can now hook into VelocityNavigator via
NavigatorAPIandNavigatorAPIProvider. Preview routes, inspect server health, and read routing config programmatically. - Three Routing Modes — Choose between
least_players,round_robin, andrandomselection algorithms. - Contextual Routing — Route players to game-specific lobbies (e.g., BedWars lobby) based on which server they are leaving.
- Self-Documenting Config — The generated
navigator.tomlnow includes rich inline comments explaining every setting and routing mode, with links to full documentation.
🏥 Reliability
- Async Health Checks — Ping candidate lobbies before routing to ensure they are alive. Configurable timeout and caching.
- Ping Coalescing — Multiple simultaneous
/lobbyrequests share the sameCompletableFutureping, preventing network storms on high-traffic proxies. - Pre-Execution Cooldown Locking — The anti-spam cooldown is applied before command execution begins, preventing macro-based abuse from bypassing the lock.
- Graceful Failover — If all contextual lobbies are offline, the plugin falls back to the default lobby pool instead of showing an error (configurable).
📊 Telemetry & Updates
- bStats Integration — Anonymous usage telemetry via bStats (plugin ID: 28341).
- Modrinth Update Checker — Automatic version checking during startup with configurable release channel (
release,beta,alpha).
🛠 Admin Tools
/vn reload— Hot-reloadnavigator.tomlwithout restarting the proxy./vn status— View runtime status (version, routing mode, health checks, bStats, update checker)./vn version— Check installed vs. latest version./vn debug player <name>— Preview the routing decision for a specific player./vn debug server <name>— Inspect a server's real-time health snapshot.- Full tab-completion for all admin commands.
🔧 Configuration
- Automatic Migration — Seamless migration from v1/v2 configs with backup generation.
- Field-Level Validation — Invalid config values are corrected with warnings, never crashes.
- MiniMessage Support — All player-facing messages support MiniMessage rich text formatting.
- Initial Join Balancing — Players are now load-balanced the moment they connect to the proxy, not just when they run
🎉 VelocityNavigator v2.0.0-Stable is here!
This is a major milestone release. We have completely refactored the codebase to meet enterprise standards, focusing on stability, speed, and user experience.
🆕 What's New?
- 🔄 Modrinth Native: The update checker now queries the Modrinth API directly.
- 🛡️ Crash-Proof Config: We added strict type-safety checks. A typo in your config file will no longer crash the plugin.
- ⚡ Smart Timeouts: Server pings now timeout after 2.5 seconds, preventing a single laggy server from freezing your command usage.
- 📢 Better Feedback: Players now receive specific error messages (e.g., "Server Full", "Whitelisted") instead of the command just doing nothing.
- 🐛 Bug Squashing: Fixed constructor initialization errors and improved debug logging.
📦 How to Update
- Stop your proxy.
- Delete your old
VelocityNavigator.jar. - Upload the new v2.0.0-Stable JAR.
- (Recommended) Backup and delete your old
navigator.tomlto let the new crash-proof version generate. - Start the proxy!
🚀 Highly Customizable Config:
The plugin now uses a more organized, nested navigator.toml file with a custom header.
⚙️ Automatic Config Updater:
The plugin will automatically detect and upgrade old configuration files to the new format, preserving user settings.
💬 Optional Command Aliases:
Server owners can now define which command aliases (like /hub or /spawn) they want to use in the config file.
✨ Reconnect to Spawn:
If a player uses a lobby command while already in a lobby, they are now re-connected to that lobby's spawn instead of just seeing a message.
For the next update, you can focus on the suggestions we just discussed:
- Permission Support.
- Fully Customizable Messages.
- Smart Server Selection.
Hey everyone, here's the first release of VelocityNavigator!
This is a simple plugin that lets you use / lobby, /hub, or /spawn to send players to your lobby server. You can even set up multiple lobbies in the config for it to choose from!

