Compatibility
Minecraft: Java Edition
Platforms
Links
Tags
Creators
Details
Proximity Chat Bubble
Proximity text chat plugin for Folia and (probably) Paper servers chat messages appear as floating speech bubbles above the player's head, readable only by players nearby.

Description
While the plugin is ON, regular chat no longer visible to server chat. Instead each message becomes a text bubble mounted above the speaker, visible to anyone within a configurable radius (default 24 blocks, same world only).
Features
- True proximity — admission is server-authoritative: clients beyond the radius never receive the bubble entity, so a modified client cannot read distant chat. The client-side view range is only a render cull on top of that guarantee.
- Anonymous by design — no sender name appears on any surface, and message content is never logged or written to disk. Bubbles are non-persistent display entities.
- Fail-closed — every failure path ends in "no bubble", never in leaked, frozen, or truncated text.
- Three modes —
ON(bubbles replace chat),OFF(plugin inert, vanilla chat untouched),SUPPRESSED(chat swallowed, all bubbles cleared). Switch live in-game, from console, or from another plugin via the API. - Folia-native — fully region-thread-safe and declared
folia-supported; built against the Folia scheduler APIs, which Paper also ships. (was built for folia event so compatibility for paper was not even tested) - Hardened input — Unicode NFC normalization; control, invisible, and bidi characters stripped; whitespace collapsed; a code-point length cap that rejects overlong messages instead of truncating them. Bubble text is rendered as a literal component, never parsed as markup.
- Rate-limited — a per-player minimum interval between accepted messages keeps entity spawns and packet fan-out bounded.
- Live config —
/proxchat reloadapplies every value immediately. Out-of-range values are clamped with a console warning; a config typo never blocks enabling.
Install
- Drop the jar into your server's
plugins/folder. - Restart. The plugin starts OFF on first boot — enable it with
/proxchat on. The mode persists across restarts.
Requires Folia or Paper 26.1.2 or newer (Java 25 runtime).
Commands
/proxchat <status|on|off|suppress|clear|reload> — permission proxchat.admin
(default: op).
| Subcommand | Effect |
|---|---|
status |
Current mode, live bubble counts, and a config summary |
on / off / suppress |
Switch mode (leaving ON clears every live bubble) |
clear |
Remove all live bubbles without changing the mode |
reload |
Re-read config.yml in place; lists any clamped values |
Configuration
Radius, bubble lifetime, stack depth, height, sneak-hide, max message length,
rate-limit interval and more — every key is documented in the generated config.yml,
applies live on /proxchat reload, and missing keys fall back to defaults so upgrades
never require regenerating the file.
API for other plugins
ProxChat registers a ProxChatService with Bukkit's ServicesManager. Declare
softdepend: [ProxChat] and look it up lazily:
ProxChatService prox = getServer().getServicesManager().load(ProxChatService.class);
if (prox != null) {
prox.setMode(Mode.SUPPRESSED); // or enable() / suppress() / disable()
prox.clearAll(); // remove every live bubble, mode untouched
}
Every method is callable from any thread; mode flips are atomic.
Known quirks (0.3.0)
- You can't see your own bubble in first person when looking straight up (client rendering of self-passengers); F5 and other players are unaffected.
- The speaker's vanilla nametag isn't drawn while a bubble is mounted (client behavior); it returns when the last bubble fades.
- The "message too long" reply shown to the sender is currently French; localizable messages are planned.
- Stopping the server while players are online can log one harmless
Error occurred while disabling ProxChat. Fix planned for 0.4.0.


