CommandBridge is a cross-server command execution plugin for Minecraft networks running on Velocity. You define commands in YAML scripts on the proxy, and CB registers and dispatches them across all connected backend servers. No plugin messaging, no player-online requirements, no limitations.
A player runs /lobby on a backend, the proxy picks it up. An admin runs /alert on Velocity, every backend executes it. Commands go through instantly over WebSocket or Redis.
How it works
Everything runs through scripts. You create a .yml file, define the command name, arguments, where it registers, and what happens when someone runs it. Drop it in the scripts folder on Velocity and you're done. CB reads, validates, and registers commands on whichever servers you specified. If something is wrong, it tells you exactly what and skips that script. The rest still loads fine.
Here is a quick example. This registers /alert on the proxy and broadcasts a message to two backends as console:
version: 4
name: example
description: An example command script - edit or replace this with your own
enabled: false
aliases: [ex]
permissions:
enabled: true
silent: false
register:
- id: "client-1"
location: VELOCITY
defaults:
run-as: CONSOLE
execute:
- id: "survival-1"
location: BACKEND
server:
target-required: false
schedule-online: false
player-arg: ""
delay: 0s
cooldown: 0s
args:
- name: player
required: true
type: STRING
suggestions: []
- name: message
required: true
type: TEXT
suggestions: []
commands:
- command: "msg ${player} ${message}"
Platforms
One jar works everywhere. Install the same file on Velocity and all your backends.
Transport
Pick one. WebSocket is the default and works out of the box. Redis is there if you need it.
WebSocket mode: Velocity hosts the server, backends connect to it. No external dependencies. TLS built in.
Redis mode: all instances connect to your existing Redis server. Useful if your servers are behind NAT or you already run Redis for other things.
Both modes support multi-proxy setups. One Velocity runs as the primary, any additional proxies connect in client mode.
Security
Every connection is authenticated with HMAC-SHA256. Both sides prove they know the secret without ever sending it over the wire. On top of that you get TLS encryption with three modes to choose from.
TOFU is the default. Velocity generates a self-signed certificate on first startup, backends pin it automatically. Zero manual certificate management, encrypted from the start.
Execution modes
Commands can run in three different contexts depending on what you need.
CONSOLE runs with full permissions. PLAYER runs as the player who triggered it. OPERATOR gives temporary elevated permissions for that specific command and nothing else.
Arguments
Full argument parsing with tab completion via CommandAPI. 22 types covering everything from basic strings to Minecraft-specific types like players, locations, items, and entities.
Arguments become ${name} placeholders in your command strings. PlaceholderAPI is supported too if you need external data like player stats or economy values.
Built for real networks
CommandBridge is designed for production. Commands can be rate limited per player with cooldowns from milliseconds to hours. If a player is offline when a command targets them, CB queues it and executes it when they come back, even across server restarts.
You can apply delays to individual commands, reload all scripts without restarting with /cb reload, and run multiple commands in a single script with different targets and settings each. Everything is managed from one place on the Velocity proxy.
Player presence is tracked across the entire network, including multi-proxy setups. CB knows where every player is at all times, so commands that depend on a player being on a specific server just work. No guessing, no race conditions.
Requirements
CommandAPI is required on every server. PlaceholderAPI via PapiProxyBridge and PacketEvents are optional.
Metrics
This plugin collects anonymous statistics via bStats. You can disable this in plugins/bStats/config.yml.
All Versions
+ Add Version| Name | Game version | Platforms | Published | Downloads | Actions |
|---|---|---|---|---|---|
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 | ||||
| 6h ago | 1 |
latest commit: d6a59a9
ever resuming, adds a configurable task-expiry timer, and redesigns the admin
CLI around resources with consistent rendering across console and in-game chat.
so whats new or fixed:
- scheduled tasks**
- fixed
${arg}placeholders inexecutetarget IDs not being resolved at
never resumed
- new
tasks.expire-afterconfig option (seconds; default 86400, 0 disables);
- tasks left over with unresolved
${...}placeholders from earlier versions
- admin commands**
- redesigned the
/cbtree by resource: /cb script list | show <name> [group] | enable <name> | disable <name>/cb task list | clear <id>/cb client list | ping [id] | players <id>/cb config show [section] | reload/cb script show <name>opens a clickable section navigator (permissions,
group as a syntax-highlighted yaml card
/cb script enable|disable <name>edits theenabled:line of the matching
connected clients
/cb config showmirrors the same summary + sections layout; drill into a
- every argument-taking subcommand has live tab-completion now (script names,
- rendering**
- single
Reportbuilder drives every command's chat output, so kvs, section
everywhere
DebugPrinterexposes genericprintRecord,printRecordOverview, and
printList so any record renders as the same yaml card the old/cb scripts view used- removed**
/cb scripts,/cb tasks,/cb list,/cb ping- replaced by the
/cb task show <id>and/cb client show <id>- their list views already
latest commit: 76edfda
latest commit: 9563e3c
- fix(velocity): deprecation warning was broken on NTFS systems
- feature: added support for the latest minecraft versions(26.1, 26.2 and below)
latest commit: d7f43a1
and fixes a bunch of stability issues across the board.
so whats new:
- developer API**
- new
apimodule for third-party plugin integration, available on maven central - typed message channels via
CommandBridgeAPI.channel(Class)with send, request, broadcast, and listen - delivery conditions on senders:
requirePlayer(UUID)to gate on player presence,whenOnline(UUID)to queue until the player connects - server lifecycle events via
onServerConnectedandonServerDisconnected(proxy only) - connection state tracking via
onConnectionStateChanged(all platforms) - player locator service for resolving which server a player is on (proxy only)
CommandBridgeProvider.get()andCommandBridgeProvider.get(Class)to obtain the API instance- proxy-only methods return
Optional<Subscription>instead of rawSubscription, returningOptional.empty()on backends - full JDK-style JavaDocs across all API types
- security**
- hardened auth flow with constant-time HMAC comparison to prevent timing attacks
- fixed
AUTH_OKrace condition where messages could be sent before the client processed auth success - added reconnect on failed server proof verification
- operator execution no longer grants wildcard permissions, only explicit ones
- fixes**
- fixed cooldown being applied before dispatch instead of after
- fixed MiniMessage tags in error messages not being escaped
- fixed script reload not being thread-safe
- fixed player join events firing for already-tracked players
- fixed polling not being reset on shutdown
- fixed auth check missing on config reload
- fixed
Logvarargs handling for single-argument messages - fixed config name not being passed to
ConfigManagerin the velocity backend adapter - fixed operator permission resolution being inconsistent across platform executors
- left-aligned all chat UI output and removed pixel-width centering
- various null guard and stability improvements across dispatch, registration, and player tracking
- internals**
- modernized codebase to java 21 idioms
- rebuilt test suite from scratch with 136 tests across core, velocity, and backends
- added CI test workflow and testing documentation
breaking changes:
RunAsandConnectionStatemoved to theapipackage, internal duplicates removed
latest commit: d7f43a1
also had some internal cleanup and an important fix for velocity running in client mode.
so whats new:
- added
/cb dumpfor support snapshots (sanitized upload + local file export) - added
/cb migrateto migrate script files to the current schema - migration is script-only now. there was a short config migration path but that got reverted again
- added
player-argper command fortarget-requiredandschedule-online - added remote uuid resolving between connected proxies (
RESOLVE_UUID) + localUserCache+ Mojang fallback - added
OFFLINE_PLAYERargument type with suggestions support - reworked schedule-online / player tracking flow to be more reliable and added clearer warning logs when player resolution fails
- fixed double command descriptions in command registration output
- fixed velocity client mode startup crash (
ClassNotFoundException: org.bukkit.command.CommandSender)
breaking changes:
- scripts now require
version: 4 - older scripts must be migrated first
- internal runtime files moved into the
data/subdirectory
latest commit: e951a9e
and player tracking across proxies. the wiki has been fully rewritten for this version so make sure to check that out.
so whats new:
- target-required per command option. this makes sure the player is actually on the target server before dispatching the command. also works when a proxy is in client mode so it checks across all connected proxies not just the local one
- per-command cooldowns, the old pipeline cooldown stage is gone
- player presence tracking. backends and client mode proxies now sync their player lists to the proxy. the full list only gets sent once on auth and after that only join/leave deltas get sent so you dont have to worry about huge packets even with like 30k players
- added PLAYERS argument type for velocity
- scripts now require version 3
breaking changes:
- removed Server.timeout from the config
- removed some unused config values
- script version 3 is now required, older versions wont work anymore
latest commit: 37b29f5
a second backend. what do I mean by that? CommandBridge was(or still is)
being powered by Websockets. but some users asked for the feature to implement
redis. So here it is:
- full redis support as transport layer
- you can either use websockets or redis depends on what you select in the config
so big version because the config has major changes and the plugin architecture
- example.yml was incorrect
- commandapi unregistration on shutdown threw exceptions
added:
- modrinth api - update checker
- [v2.3.5] - 2025-12-28**
- dependency: changed
commandapifrom11.0.0to11.1.0
- [v2.3.4] - 2025-10-11**
- fix: fixed command registration issue on paper 1.21.10
- [v2.3.3] - 2025-10-10**
- feat: now supports minecraft 1.21.9 and 1.21.10
- [v2.3.2] - 2025-09-15**
- fix: fixed ClassCastException
- [v2.3.1] - 2025-09-14**
- feat: Inject player placeholders whenever we have a player context, regardless the target executor is set to.
- [v2.3.0] - 2025-08-01**
- Fixed multithreading issues on folia servers.
- [v2.2.9] - 2025-07-22**
- Added /cb dump command to dump the current configuration and scripts.
- [v2.2.8] - 2025-07-22**
- updated to minecraft version 1.21.8
- [v2.2.7] - 2025-07-02**
- updated to minecraft version 1.21.7
- introduced aliases for scripts.
go outside, great weather!
- [v2.2.6] - 2025-06-07**
- Improved feedback when processing player commands sent from the console
- [v2.2.5] - 2025-05-19**
- fixed issue [#16](https://github.com/objz/CommandBridge/issues/16)
- no longer responds with 'reconnect successfull' when reconnect failed
- [v2.2.4] - 2025-05-10**
- changed broken links for the new website
- internal renamings
- [v2.2.3] - 2025-04-29**
- Adds support for minecraft version 1.20.5
- fixed #14
- [v2.2.2] - 2025-04-30**
- Fully rewrote and restructured the wiki for clarity and GitBook compatibility.
- Scripts guide now split into clean pages with tables, examples, and diagrams.
- Clear separation of Velocity ↔ Paper script directions with real-world examples.
- Added built-in placeholder overview with platform support table.
- Included visual overview diagrams for better understanding.
- Added permission hints and common setup tips in examples.
- Improved explanation for PlaceholderAPI support on both platforms.
- [v2.2.1] - 2025-04-25**
- Fixed issues with the Metrics class causing runtime errors.
- Resolved an "Internal Server Error" when players lacked permission.
- Added full support for Folia, ensuring compatibility and improved performance.
- [v2.2.0] - 2025-04-17**
- Replaced entire backend with Netty, providing improved performance and enhanced security.
- Clients now automatically attempt to reconnect to the server after shutdown, with a configurable timeout. Manual reconnection is possible afterward.
- Fixed a bug where the WebSocket server would not shut down properly.
> Major version bump due to complete backend reimplementation.
> In the next release, a WebUI for managing commands and a
/dump command will be introduced.- [v2.1.8] - 2025-03-21**
- Improved performance of
onLoadandonEnable, reducing usage from 8% to 0.54%. - Added PAPIProxyBridge support for PlaceholderAPI integration on Velocity.
- Fixed an issue on Velocity where command arguments were incorrectly required instead of optional.
- [v2.1.7] - 2025-03-21**
- Added**
- Optional support for PlaceholderAPI on both Bukkit and Velocity platforms. If the PlaceholderAPI plugin is present, external placeholders will be parsed alongside internal ones.
- Improved internal placeholder handling to avoid conflicts with PlaceholderAPI syntax, ensuring consistent behavior whether or not PlaceholderAPI is installed.
- Changed**
- Updated logging messages to clearly indicate whether PlaceholderAPI was detected and whether internal or external placeholder systems are being used.
- [v2.1.6] - 2025-03-06**
- Changed**
- Removed dependencies on the Paper API, making the plugin fully compatible with the Bukkit API. This allows support for a wider range of server software, including third-party platforms like Arclight that do not implement the Paper API.
- Added a
legacy-plugin.ymlto ensure compatibility with non-Paper servers while still keeping apaper-plugin.ymlto maintain Paper-specific features.
- [v2.1.5] - 2025-02-27**
- Changed**
- The plugin is now Spigot-mapped and will be remapped by Paper to support older versions starting from 1.20.