What is NexaChat?#
A premium chat layer for formatting, channels, moderation, private messages, item sharing, chat logs and cross-server chat delivery.
NexaChat is a Java 21 / Minecraft 1.21.x chat infrastructure plugin with two engine modes, modular YAML files, MiniMessage rendering, private messages, moderation rules, read-only item and inventory sharing, soft hooks and network-ready routing.
Product purpose, target audience, main systems, dependencies and quick links.
A premium chat layer for formatting, channels, moderation, private messages, item sharing, chat logs and cross-server chat delivery.
Server owners who need configurable chat behavior across SMP, Lifesteal, Survival, PvP, hub and small network setups without hard depending on optional plugins.
Paper, Folia-oriented Paper environments, Spigot-compatible fallbacks, BungeeCord networks and Velocity networks.
Installation gets the plugin to boot. First Setup prepares it for production use.
license-key, select storage, review channels and confirm message formatting./nexachat status and /nexachat perf to confirm the loaded mode, hooks and runtime health.Recommended first configuration pass after the plugin has generated its files.
config.yml.performance or lightweight engine mode.channels.yml for global, local, staff and trade chat.formats.yml for prefix, suffix, rank icon and message layout.storage.yml.integrations.yml.Premium builds validate a license key at startup. The enable banner shows a masked license status.
license-key in config.yml.config.yml, not into another generated YAML file.license-key: "YOUR-KEY-HERE"/nexachat reload does not re-validate licensing runtime state.Use this checklist every time you change NexaChat config files.
| Change | Apply with |
|---|---|
| YAML config, messages, formats, rules | /nexachat reload |
| Plugin jar (update) | Server restart |
license-key | Server restart |
storage.yml type/driver | Server restart |
network.yml transport | Server restart |
Engine mode (config.yml engine.mode) | Restart (preset command switches pipeline) |
NexaChat plugin folder to a backup location./nexachat reload as an admin. Watch the console for the first error - repeated errors below it are usually echoes of the same root cause.Each command includes purpose, permission, example and when to use it.
plugin.yml and command implementation./nexachatAlias: /ncNexaChat admin command for reload, status, performance view, lightweight preset, GUI bridge and share opening.
nexachat.admin
/nexachat status
Use this when configuring, debugging or operating the plugin as staff.
/chatCommandPlayer chat control command for toggles such as mention notifications.
Not declared in plugin.yml
/chat toggle mentions
Use this for player-facing chat preferences that should not require admin access.
/channelAlias: /chSwitch or inspect active chat channels.
Channel-specific
/channel staff
Use this when players move between global, local, staff, trade or provider channels.
/msgAliases: /tell /w /whisperSend a private message to an online player.
Not declared in plugin.yml
/msg Steve hello
Use this for direct player-to-player conversations with ignore and social spy support.
/replyAlias: /rReply to the latest private message conversation.
Not declared in plugin.yml
/reply yes
Use this after receiving or sending a private message.
/ignoreCommandToggle ignoring another player.
Not declared in plugin.yml
/ignore Steve
Use this when a player wants to block private messages from another player.
/socialspyCommandToggle private message spy for staff.
nexachat.spy
/socialspy
Use this for moderation visibility on private message traffic.
/clearchatCommandClear visible chat for players.
nexachat.admin
/clearchat
Use this after spam, advertising or chat incidents.
/mutechatCommandToggle global chat mute.
nexachat.admin
/mutechat
Use this during raids, announcements or moderation lockdowns.
/mailCommandOffline mail command for send, read and clear workflows.
nexachat.feature.mail
/mail read
Use this when players need async messages outside live PMs.
/announcementCommandBroadcast configured announcement output.
nexachat.admin
/announcement broadcast restart
Use this for scheduled notices, maintenance and staff broadcasts.
/groupchatAliases: /gchat /chatgroupManage private player chat groups: GUI, create, invite, accept, deny, leave, members, kick, transfer ownership, rename, disband and toggle group chat routing.
nexachat.group (+ nexachat.group.create, nexachat.group.invite, nexachat.group.manage)
/groupchat create TeamBlue
Use this when a player needs a persistent private channel for a team, friend circle or clan without staff involvement.
/gcCommandSend one quick message to your player chat group without toggling routing.
nexachat.group
/gc Ready to fight?
Use this for single group messages. Toggle routing in the group GUI when every message should go to the group.
Permission nodes are based on plugin.yml and the bundled channel/format configuration. Assign admin and bypass permissions carefully.
/lp group admin permission set nexachat.admin true/lp group default permission set nexachat.feature.item trueConfiguration YAML files below contain short bundled default excerpts, not full files. Message YAML is documented only in Messages & Language.
Main runtime settings for engine mode, license, mentions, performance cache, integrations, anti-spam, moderation, share previews and security.
config.yml. The generated file contains more options than this docs excerpt.engine:
mode: "performance"
lightweight:
enabled-modules:
- "filter"
- "spam"
- "render"
- "mentions"
- "emoji"
- "local-chat"
license-key: "LICENSE"
mentions:
enabled: true
require-at-symbol: true
highlight:
format: "<yellow><bold>{mention}</bold></yellow>"
sound:
name: "BLOCK_NOTE_BLOCK_PLING"
performance:
cache:
placeholder-ttl-ms: 1500
prefix-ttl-ms: 5000
async-log-batch-size: 50
async-log-flush-ticks: 40Top-level keysengine, license-key, mentions, performance, integrations, anti-spam, moderation, share, security
Production handlingUse /nexachat reload for safe runtime changes. Restart after jar, license, storage driver or proxy transport changes.
Defines global, local, staff, trade, private and provider-backed channels.
resolver-order:
- towny
- lands
- factions
- superior-skyblock
channels:
global:
permission: ""
format: "default"
range: -1
cooldown-seconds: 1.0
spy-visible: true
logging: true
cross-server: false
local:
permission: ""
format: "default"
range: 100
cooldown-seconds: 0.75
staff:
permission: "nexachat.channel.staff"
format: "staff"
spy-visible: falseChannel behaviorrange: -1 means server-wide. Local chat filters recipients by world first, then distance.
Provider channelsTown, land, faction and island channels are prepared surfaces for group plugins and should be tested with the target provider.
Controls MiniMessage chat formats, rank format selection, hover text and click actions.
formats:
default: "<dark_gray>[<aqua>{channel}</aqua>]</dark_gray> {rank_icon}{prefix}<white>{display_name}</white>{suffix} <dark_gray>»</dark_gray> <gray>{message}</gray>"
staff: "<dark_gray>[<gold>Staff</gold>]</dark_gray> {rank_icon}{prefix}<yellow>{display_name}</yellow> <dark_gray>»</dark_gray> <white>{message}</white>"
trade: "<dark_gray>[<green>Trade</green>]</dark_gray> {rank_icon}{prefix}<green>{display_name}</green> <dark_gray>»</dark_gray> <white>{message}</white>"
rank-formats:
admin:
permission: "nexachat.format.admin"
weight: 100
format: "staff"
json:
hover: "<gray>Click to message <aqua>{player}</aqua>"
suggest-command: "/msg {player} "Internal placeholders{prefix}, {suffix}, {player}, {display_name}, {nickname}, {group}, {primary_group}, {rank_icon}, {permission_icons}, {vault_balance}, {channel}, {message}
Click behaviorUse open-url, run-command or suggest-command. URL wins when configured.
Controls optional plugin hooks. Missing plugins are treated as unavailable hooks, not fatal dependencies.
metadata-priority:
- luckperms
- vault
- tab
luckperms:
enabled: true
use-prefix-suffix: true
use-primary-group: true
placeholderapi:
enabled: true
vault:
enabled: true
use-chat-fallback: true
use-economy-placeholders: true
essentials:
enabled: true
use-nickname: true
respect-vanish: true
respect-mute: true
command-compat-mode: "nexachat-first"
deluxemenus:
enabled: true
menu-command: "dm open nexachat_settings {player}"Metadata orderLuckPerms is checked first, Vault second and TAB last for prefix/suffix style metadata.
Soft hook ruleEnable the hook only when the dependency is installed and verified on the server.
Controls proxy, Redis and event-bus routing for cross-server chat events.
network:
enabled: false
# proxy: auto-detects the bridge from bungee.enabled / velocity.enabled below
# bungee: native BungeeCord forwarding (Forward/ALL), no proxy jar needed
# velocity: raw plugin messaging (requires the NexaChatVelocity proxy jar)
# redis: Redis pub/sub between backends, no proxy jar needed
# hybrid: proxy messaging + Redis combined (diagnostics only)
transport: "proxy"
# MUST be unique per backend. A server still on the default "server-1" refuses to start network sync and logs a SEVERE error.
server-id: "server-1"
shared-secret: ""
dedupe-ttl-seconds: 30
# When true, each event type is published on its own channel from network.channels below.
multi-channel: false
receive-format: "<dark_gray>[{server}/{channel}]</dark_gray> <aqua>{player}</aqua><gray>: </gray><white>{message}</white>"
# Optional per-type overrides. Keys: chat, staff, mute, pm, mention, punish, spam.
receive-formats:
staff: "<dark_gray>[{server}/staff]</dark_gray> <red>{player}</red><gray>: </gray><white>{message}</white>"
channels:
chat: "nexachat:chat"
staff: "nexachat:staff"
mute: "nexachat:mute"
pm: "nexachat:pm"
mention: "nexachat:mention"
punish: "nexachat:punish"
spam: "nexachat:spam"
bungee:
# Set true ONLY for the proxy type you actually run. Used to auto-select the bridge.
enabled: true
channel: "BungeeCord"
sub-channel: "NexaChat"
velocity:
# Set true ONLY for the proxy type you actually run. Used to auto-select the bridge.
enabled: true
channel: "nexachat:main"
redis:
enabled: false
host: "localhost"
port: 6379
channel: "nexachat:sync"Network eventsChat, staff chat, global mute, mute, PM, mention, punishment and spam cooldown events have dedicated channels.
Transport choiceUse proxy for Bungee/Velocity messaging. Use Redis for shared pub/sub across servers.
These files drive moderation thresholds, spam checks, advertising filters and rule engine actions.
spam:
checks:
cooldown:
seconds: 1.0
duplicate:
enabled: true
caps:
min-length: 8
max-ratio: 0.75
adaptive:
mute-points: 5
kick-points: 8
bypass-permission: "nexachat.bypass.spam"
filters:
block-advertising: true
whitelist:
permissions:
- "nexachat.bypass.filter"
blocked-words:
- "badword"
rules:
ip-advertise:
triggers:
- "chat"
- "sign"
- "book"
actions:
- "warn"
- "actionbar:<red>Advertising is not allowed."Rule triggersChat, command, sign, book and ProtocolLib packet triggers are supported by the rule layer.
Rule actionsCancel, replace, warn, mute, kick, command, reply, broadcast, actionbar, title, bossbar, Discord, proxy and log actions can be used.
Storage settings for SQLite, MySQL, MariaDB and YAML fallback behavior.
type: sqlite
fallback-provider: yaml
pool:
maximum-size: 10
minimum-idle: 2
connection-timeout-ms: 10000
yaml:
log-chat: false
mysql:
host: localhost
port: 3306
database: nexachat
username: root
password: ""
mariadb:
host: localhost
port: 3306
database: nexachatStandalone serverUse SQLite for one-server setups unless you need external reporting or shared state.
Production networkUse MySQL or MariaDB with backups and test migrations before switching a live server.
Auxiliary runtime files for output channels, glyphs, Unicode cleanup and broadcast templates.
outputs:
chat:
enabled: true
actionbar:
enabled: true
title:
enabled: true
bossbar:
enabled: true
emoji:
replacements:
":heart:": "<red>heart</red>"
rank-icons:
admin: "<red>A</red> "
normalization:
enabled: true
strip-accents: true
lowercase: true
announcements:
enabled: trueOutput handlingUse these files for how NexaChat sends chat-adjacent output, not for command permissions.
Glyph handlingItemsAdder, Oraxen and Nexo glyphs should be configured only after the provider plugin is installed.
Translation and formatting guidance based on NexaChat's bundled resources.
/nexachat reload. Restart after jar, storage, network or license changes.NexaChat ships messages.yml. Edit the generated copy in the plugin folder, keep placeholders intact, then reload the plugin command or restart for startup-level changes.
<red>Error message</red>
&cLegacy color message
{player} {target} {message} {reason}messages.yml. The generated file contains more message keys than this docs excerpt.prefix: "<aqua>NexaChat</aqua> <dark_gray>|</dark_gray> "
no-permission: "<red>You do not have permission."
player-only: "<red>This command can only be used by players."
admin:
status: "<aqua>NexaChat</aqua> <gray>version {version} is running."
reloaded: "<green>NexaChat config reloaded."
lightweight-preset: "<green>Lightweight preset saved. Run /nexachat reload or restart to switch pipeline."
gui-unavailable: "<yellow>Opening built-in chat settings menu."
channel:
current: "<gray>Current channel: <aqua>{channel}"
switched: "<green>Switched to <aqua>{channel}</aqua> channel."
invalid: "<red>Unknown or unavailable channel: {channel}"
pm:
outgoing: "<gray>To <aqua>{target}</aqua>: <white>{message}"
incoming: "<gray>From <aqua>{sender}</aqua>: <white>{message}"
spy: "<dark_gray>[Spy]</dark_gray> <aqua>{sender}</aqua> -> <aqua>{target}</aqua>: <gray>{message}"Placeholder safetyKeep placeholders such as {channel}, {target}, {sender}, {message} and {reason} intact.
Color formatMessages are written for MiniMessage-style rendering while legacy ampersand formatting is still accepted by the text service.
NexaChat exposes an admin/player settings surface through DeluxeMenus when available and a built-in fallback inventory when it is not.
When DeluxeMenus is enabled and deluxemenus.enabled is true, /nexachat gui dispatches the configured console command.
dm open nexachat_settings {player}If DeluxeMenus is missing, NexaChat opens a 27-slot Bukkit inventory named NexaChat Settings (layout configurable in menus.yml).
/nexachat editor)Item, inventory, ender chest and shulker share tokens open read-only Bukkit inventory previews with expiry protection.
Shared InventoryShared ShulkerPut complex layout in DeluxeMenus and let NexaChat handle the command bridge. Keep the fallback menu for emergency access when the external menu plugin is unavailable.
integrations:
deluxemenus:
enabled: true
menu-command: "dm open nexachat_settings {player}"
share:
inventory-title: "Shared Inventory"
shulker-title: "Shared Shulker"
expire-seconds: 120NexaChat consumes PlaceholderAPI values and also provides internal format placeholders for chat rendering.
Use these in formats.yml, channel formats and hover/click text where supported.
{prefix}, {suffix}, {player}, {display_name}, {nickname}{group}, {primary_group}, {rank_icon}, {permission_icons}{vault_balance}, {channel}, {message}When PlaceholderAPI is installed and enabled, NexaChat expands placeholders after its internal format placeholders and metadata fallback.
| Placeholder | Example output | Description |
|---|---|---|
{display_name} | Rito | Display name resolved through Essentials/SkinsRestorer fallback when configured. |
{prefix} | &6Admin | Prefix resolved from LuckPerms, Vault or TAB according to metadata priority. |
{rank_icon} | A | Configured rank icon from emoji.yml. |
{vault_balance} | 1250.50 | Vault economy placeholder when Vault economy support is enabled. |
{message} | Hello world | Filtered, rendered and share-token-processed chat message body. |
Storage docs explain YAML, SQLite, MySQL, MariaDB, chat logs, toggles and backup expectations.
Use SQLite for standalone servers. Use MySQL or MariaDB where you need production-grade database backups, shared reporting, larger chat logs or network-facing persistence. YAML fallback exists for simple local storage but should not be treated as a high-volume logging backend.
NexaChat uses async-safe paths for storage and logging work, but Bukkit inventory, player and world APIs must still run through safe scheduler/player-thread paths.
Each integration explains purpose, required/optional status, setup steps and troubleshooting.
Purpose: Provides prefix, suffix and primary group metadata for chat formats.
Troubleshooting: If rank text is missing, confirm LuckPerms is installed before NexaChat, metadata is assigned on the correct context and luckperms.enabled is true.
luckperms./nexachat status and a non-op player.Purpose: Expands external placeholders inside NexaChat format and message output.
Troubleshooting: If placeholders stay blank, test them with /papi parse, install required expansions and check placeholderapi.enabled.
formats.yml.Purpose: Provides chat metadata fallback and economy balance placeholders.
Troubleshooting: If {vault_balance} is empty, confirm Vault has a valid economy provider and vault.use-economy-placeholders is true.
integrations.yml.{vault_balance} in a format with a normal player.Purpose: EssentialsX supplies nickname, vanish and mute compatibility. SkinsRestorer helps offline-mode display-name fallback behavior.
Troubleshooting: If PM targets or names look wrong, verify vanish/mute settings and command compatibility mode.
integrations.yml.command-compat-mode only when command ownership conflicts with another plugin.Purpose: Publishes chat, staff chat, mentions and moderation logs through reflection when DiscordSRV is installed.
Troubleshooting: If Discord output is missing, confirm the channel map and that DiscordSRV is fully connected before NexaChat publishes events.
integrations.yml.Purpose: Enables packet-level rule checks for configured packet triggers.
Troubleshooting: If packet rules do not react, confirm ProtocolLib supports your server version and the trigger/action is enabled in rules.yml.
Purpose: Replaces the small fallback settings inventory with a fully configurable external menu command.
Troubleshooting: If /nexachat gui opens the fallback menu, check that DeluxeMenus is enabled and the configured command is valid.
deluxemenus.menu-command to open it.{player} in the command where DeluxeMenus expects a player./nexachat gui as a player.Purpose: Loads configured glyphs, rank icons and permission icons only when the provider is installed.
Troubleshooting: If icons render as plain text, confirm the resource pack, provider glyph keys and MiniMessage output format.
emoji.yml.{rank_icon} or {permission_icons} in formats.Purpose: Sends chat, staff chat, PM, mention, mute and punishment events across a network.
Troubleshooting: If messages duplicate or vanish, confirm transport choice, server IDs, shared secret and channel names are identical where needed.
Purpose: Region, claim and group providers can influence channel membership, rule matching or future provider-specific chat workflows.
Troubleshooting: If provider channels do not behave as expected, confirm the provider is installed and the channel resolver is enabled. Some provider-specific member lookup remains a soft/no-op-safe surface in this build.
integrations.yml.channels.yml.Route chat, staff chat, PMs, mentions, mutes and punishments across a BungeeCord, Velocity or Redis network.
server-id. A backend still on the default server-1 refuses to start network sync and logs a SEVERE error at startup, and two servers sharing an ID drop or loop each other's events.transport: "proxy" with bungee.enabled: true (auto-selected) and the Bungee module, or transport: "bungee" for native BungeeCord forwarding without a proxy jar.transport: "proxy" with velocity.enabled: true and bungee.enabled: false (auto-selected), or transport: "velocity" explicitly. Requires the Velocity module.transport: "redis", direct pub/sub between backends, no proxy module required.With transport: "proxy" the backend picks its bridge automatically from bungee.enabled / velocity.enabled - set only the flag that matches your real proxy to true. If both are true, Bungee wins (with a console warning); if both are false, you get a warning.
network.yml config.nexachat-bungee jar only.nexachat-velocity jar only.Channel names for each event type live under network.channels in network.yml and become real wire channels when network.multi-channel: true is enabled.
Prerequisites: working single-server NexaChat on each backend, a BungeeCord proxy that knows all backend servers.
nexachat-bungee jar to the proxy's /plugins folder.plugins/NexaChat/config.properties with channel and shared-secret.network.yml:network:
enabled: true
transport: "proxy"
server-id: "lobby-1"
shared-secret: "LONG-RANDOM-STRING"
dedupe-ttl-seconds: 30
proxy:
channel: "nexachat:main"
bungee:
enabled: true
velocity:
enabled: falsechannel and shared-secret in the proxy's config.properties.server-id unique (e.g. lobby-1, survival-1, pvp-1).transport: "bungee" uses native BungeeCord forwarding on the bungee.channel/bungee.sub-channel pair.cross-server: true on each channel that should travel across servers (see channels.yml below).Prerequisites: working single-server NexaChat on each backend, Velocity proxy with backend forwarding configured.
nexachat-velocity jar to the Velocity /plugins folder.plugins/nexachat/config.properties (channel=nexachat:main, shared-secret=).network.yml:network:
enabled: true
transport: "proxy"
server-id: "skyblock-1"
shared-secret: "LONG-RANDOM-STRING"
bungee:
enabled: false
velocity:
enabled: true
channel: "nexachat:main"shared-secret into the Velocity config.properties and restart the proxy. With transport: "proxy" the backend auto-selects the Velocity bridge because only velocity.enabled is true. (transport: "velocity" also works as an explicit override.)cross-server: true on the channels that should sync.Prerequisites: a Redis instance reachable from every backend. No proxy module is needed.
network.yml:network:
enabled: true
transport: "redis"
server-id: "survival-2"
shared-secret: "LONG-RANDOM-STRING"
redis:
enabled: true
host: "127.0.0.1"
port: 6379
password: "YOUR-REDIS-PASSWORD"
database: 0
channel: "nexachat:sync"redis.channel on every server.server-id unique per server.transport: "hybrid" publishes through proxy messages and Redis at the same time (uses Redis when redis.enabled: true). Use it only for diagnostics - one transport is the correct production answer.Only channels marked cross-server: true are published to the network; incoming remote chat is also filtered by the receiving channel's cross-server flag, permission and visibility (so staff chat stays staff-only on every backend). Local chat with a bounded range should normally stay local.
channels:
global:
cross-server: true
staff:
cross-server: true
local:
cross-server: falseReceived remote chat is rendered with network.receive-format; available placeholders: {server}, {channel}, {player}, {message}. Add receive-formats.chat and receive-formats.staff keys to override the format per event type (staff chat uses the staff key, everything else falls back to chat then to receive-format).
By default every event rides one channel (proxy.channel or the Redis channel). With network.multi-channel: true each event type is published on its own channel from network.channels - e.g. nexachat:chat, nexachat:staff, nexachat:pm. The proxy bridge modules (nexachat-bungee/nexachat-velocity) register every listed channel automatically.
network:
transport: "hybrid" # or proxy / redis
multi-channel: true
channels:
chat: "nexachat:chat"
staff: "nexachat:staff"
mute: "nexachat:mute"
pm: "nexachat:pm"
mention: "nexachat:mention"
punish: "nexachat:punish"
spam: "nexachat:spam"Keep the same channel names on every backend. With transport: "hybrid" multi-channel requires redis.enabled: true for the dedicated Redis channels; otherwise the plugin logs a warning and falls back to a single wire channel.
server-id will swallow each other's events. If a backend is still on the default server-1, network sync refuses to start and the startup log shows a SEVERE network.yml still uses the default server-id message - set unique IDs and restart.hybrid.transport: "proxy", set bungee.enabled/velocity.enabled to match your real proxy only. Both true makes Bungee win (console warning); both false leaves no bridge for plugin-message routing.network.shared-secret and proxy config.properties shared-secret must match exactly. A mismatch shows as "Could not decode ... network event" in the proxy console.proxy.channel/Velocity channel on backends must equal the channel registered by the proxy module.cross-server: true.dedupe-ttl-seconds if events replay after long proxy hiccups; keep it sane for large networks.How performance and lightweight modes differ and how to choose between them.
/nexachat preset lightweight or edit config.yml and restart.engine.lightweight.enabled-modules.Remove modules you do not need. Every removed module means fewer checks per chat message.
engine:
mode: "lightweight"
lightweight:
enabled-modules:
- "filter"
- "spam"
- "render"
- "mentions"
- "emoji"
- "local-chat"Keep theserender, mentions and local-chat for a normal feel. spam/filter keep moderation alive.
SwitchingRun /nexachat preset lightweight to save the preset, then reload or restart. Check /nexachat perf afterwards.
Task-based recipes: prerequisite, config change, apply method, verification step.
channels in channels.yml.format at an existing or new format key in formats.yml./nexachat reload, then test with /channel <name>.channels:
vip:
permission: "nexachat.channel.vip"
format: "vip"
range: -1
cooldown-seconds: 1.0
spy-visible: true
logging: true
cross-server: false/channel, the player lacks the channel permission or the YAML indentation is broken./lp group admin meta setprefix "&4Admin ".metadata-priority in integrations.yml starts with luckperms.formats.yml:formats:
vip: "<dark_gray>[<light_purple>VIP</light_purple>]</dark_gray> {prefix}<white>{display_name}</white> <dark_gray>»</dark_gray> <gray>{message}</gray>"
rank-formats:
vip:
permission: "nexachat.format.vip"
weight: 50
format: "vip"/nexachat reload and test as a non-op player with the nexachat.format.vip permission.Highest matching weight wins. Missing prefixes usually mean metadata priority or a missing LuckPerms context.
Rules react to triggers and run actions. Triggers: chat, command, sign, book and packet. Actions: cancel, replace, warn, mute, kick, command, reply, broadcast, actionbar, title, bossbar, discord, proxy, log.
rules:
no-invite-trading:
enabled: true
priority: 40
triggers:
- "chat"
pattern: "(?i)buy.*invite|sell.*invite"
match-normalized: true
whitelist:
permissions:
- "nexachat.bypass.filter"
actions:
- "cancel"
- "reply:<red>Invites are not for sale here."
- "broadcast:<gray>{player} attempted invite trading."priority sensible (lower fires first)./nexachat reload and test the pattern with a normal account.filters:
block-advertising: true
whitelist:
permissions:
- "nexachat.bypass.filter"Combine with the bundled ip-advertise rule in rules.yml to also cover signs and books. Give only trusted staff nexachat.bypass.filter. Verify feedback via the configured actionbar/reply outputs.
integrations.yml:discordsrv:
enabled: true
publish-chat: true
publish-staff-chat: true
publish-mentions: true
publish-moderation-logs: true
inbound-channel-map:
global: global
staff: staffemoji:
replacements:
":heart:": "<red>heart</red>"
":star:": "<yellow>star</yellow>"
rank-icons:
admin: "<red>A</red> "custom-font in integrations.yml, then use provider glyph values in emoji.yml.{rank_icon} and {permission_icons} inside chat formats.messages.yml values into the generated file in the plugin folder.{player}, {target}, {message}, {reason}, {channel}, {sender}) intact.<green>; legacy & colors still work./nexachat reload and trigger each message in-game to verify.{token} text or nothing at all, which looks broken to players.storage.yml to type: mysql (or mariadb) and fill the credentials.type: mysql
mysql:
host: localhost
port: 3306
database: nexachat
username: nexachat_user
password: "CHANGE-ME"The editor exposes GUI pages for engine, moderation, channels, announcements, storage/network and formats, plus direct config edits:
/nexachat editor main
/nc editor get channels.yml channels.global.range
/nc editor set channels.yml channels.global.range -1
/nc editor toggle network.yml network.enabled
/nc editor add channels.yml channels.private-example.members Steve
/nc editor remove channels.yml channels.private-example.members Stevenexachat.editor (default: op) - do not hand this to regular players./nexachat editor reload or /nexachat reload afterwards.enabled: true
announcements:
events:
enabled: true
interval-seconds: 240
initial-delay-seconds: 45
permission: ""
worlds: []
random: true
sound: "ENTITY_EXPERIENCE_ORB_PICKUP"
outputs:
- "chat"
- "actionbar"
messages:
- "<gold>Event</gold> <gray>Vote for the server with /vote."
- "<gold>Event</gold> <gray>Join our Discord for giveaways."random: true picks messages in random order instead of rotation./nexachat reload after changes; test with /announcement broadcast.Ready-to-follow scenarios reduce support tickets and make the product easier to configure.
Use global and local channels, SQLite storage, relaxed spam limits, player mentions and readable rank formats for community chat.
Enable staff channel, social spy, clear chat, mute chat, advertising filters, command hiding and admin bypass permissions.
Use MySQL or MariaDB for durable storage, Redis or proxy transport for chat events, unique server IDs and a shared secret.
Run /nexachat preset lightweight, keep only needed modules active, disable debug timings and test with normal player chat load.
Use LuckPerms metadata, MiniMessage formats, rank icons, permission icons, hover text and suggest-command click actions.
Keep filter regexes enabled, add staff bypass permission, tune rule actions and send clear actionbar or reply feedback when messages are blocked.
performance, storage sqlite.range around 100 blocks.anti-spam.cooldown-seconds slightly, keep duplicate/caps checks.nexachat.channel.staff) and social spy for moderators./clearchat, /mutechat and nexachat.bypass.* nodes on staff groups only./plugins, /version.server-id per backend, one shared secret everywhere.Settings that matter on busy servers and how to read NexaChat's own metrics.
/nexachat perf before changing anything - it shows the current pipeline summary so you can compare.placeholder-ttl-ms (default 1500): how long PlaceholderAPI results are cached. Lower = fresher values, higher CPU cost.prefix-ttl-ms (default 5000): prefix/suffix metadata cache. Raise to 10000+ if prefixes rarely change mid-session.async-log-batch-size (default 50): chat log rows written per batch. Raise to 100-250 on chatty servers.async-log-flush-ticks (default 40): flush interval. Higher = fewer DB writes, slightly less real-time logs.debug-timings: false in production./nexachat perf and server TPS./nexachat reload, wait a few minutes of real traffic.Updating NexaChat safely without losing configuration or data.
/plugins while the server is down./nexachat status and /nexachat perf, then test chat, PMs and one network event if you run cross-server.Version matrix and the honest status of every integration surface.
| Requirement | Minimum | Notes |
|---|---|---|
| Java | 21 | Hard requirement. Plugin will not enable on older JVMs. |
| Server | Paper/Folia 1.21 | Folia declared supported; test third-party hooks under Folia. |
| NexaChat v1.0.2 | 1.21.x + Java 21 | Paper, Bungee and Velocity modules share the same version line. |
| Plugins | Varies | ProtocolLib must match your server version; Vault needs an economy provider. |
| Integration | Status | Behavior |
|---|---|---|
| LuckPerms | Full soft hook | Prefix, suffix and primary group; first metadata source. |
| PlaceholderAPI | Full soft hook | Expands placeholders after internal placeholders. |
| Vault | Full soft hook | Chat fallback + economy placeholders. |
| MiniMessage/Adventure | Core | All rendering: chat, hover, click, title, actionbar, bossbar. |
| ProtocolLib | Optional adapter | Packet rule listener loads only when installed. |
| DiscordSRV | Adapter | Reflective publish of chat/staff/mention/moderation events. |
| EssentialsX | Adapter | Nickname, vanish-aware PM, mute respect, command compat mode. |
| BungeeCord / Velocity | Dedicated modules | Plugin-message network event publish/receive. |
| Redis | Real adapter | Full pub/sub transport for network events. |
| ItemsAdder / Oraxen / Nexo | Config-backed glyph providers | Load configured glyphs only when installed. |
| TAB | Metadata fallback | Prefix/suffix fallback after LuckPerms and Vault. |
| DeluxeMenus | Command bridge | /nexachat gui dispatches configured command. |
| SkinsRestorer | Display hook | Display-name fallback for offline-mode servers. |
| WorldGuard / GriefPrevention | Prepared surface | Hook surface exists; region-specific rule logic is the next implementation slice. Not safe to market as full automation yet. |
| Towny / Lands / Factions / SuperiorSkyblock | Group channel surface | Channel types + resolver exist; plugin member lookup is soft/no-op safe. |
| LiteBans / AdvancedBan / LibertyBans | Command templates | Moderation actions dispatch configured punishment commands. |
| CoreProtect / Plan | Audit hooks | Detection + audit/analytics context via safe no-op hooks. |
| RabbitMQ / Kafka | Contract only | Interface/config exist; runtime adapter is no-op until client is bundled. |
Protect your network credentials and keep moderation powers out of the wrong hands.
network.shared-secret - events failing to decode against it are rejected.requirepass before pointing NexaChat at it.nexachat.bypass.spam, nexachat.bypass.filter, nexachat.bypass.mute) only to trusted staff.nexachat.editor and nexachat.admin can rewrite config files at runtime - owner/admin only.security.hidden-commands so players cannot fingerprint your server with /plugins, /version.security:
hidden-commands:
- plugins
- pl
- version
- ver
- about
max-book-pages: 50
max-book-page-length: 1024
max-sign-length: 256
command-spy: trueThese limits bound sign/book inputs before filter layers run, keeping packet and content checks cheap.
Start with console logs, config diffs, plugin version and reproduction steps.
Confirm Java 21, compatible server software, valid YAML files and a configured license key. Temporarily disable optional hooks if the console points to a third-party plugin conflict.
Check LuckPerms metadata, Vault chat fallback, TAB fallback, metadata priority and whether the player has the rank-format permission expected by formats.yml.
Verify the channel's range, world list, region list and whether the player actually switched to the local channel.
Confirm EssentialsX hook settings, command compatibility mode and whether the sender has nexachat.bypass.vanish or nexachat.bypass.mute.
Check nexachat.feature.item and nexachat.feature.inventory, token spelling, share expiry and whether the player is online when opening the preview.
Check transport type, server ID uniqueness, dedupe TTL, shared secret, proxy channel names and whether both proxy and Redis transports were accidentally enabled.
Install PlaceholderAPI, test the placeholder directly with PAPI, confirm the target expansion is installed and keep internal NexaChat placeholders spelled exactly as documented.
Short answers for common buyer and staff questions.
The Paper plugin descriptor declares Folia support. Test every third-party hook in your setup before claiming full Folia compatibility for a production stack.
This page targets Paper/Folia 1.21 with Java 21. Legacy 1.8 support is not part of this docs page.
No. SQLite is the default standalone choice. MySQL or MariaDB is recommended for larger servers, reporting and production backup workflows.
No. PlaceholderAPI is optional. NexaChat uses internal placeholders first and only calls PlaceholderAPI when installed and enabled.
Yes. /nexachat gui dispatches the configured DeluxeMenus command when DeluxeMenus is installed and enabled.
Yes. Share tokens open read-only snapshots and expire after the configured duration.
Yes. /nexachat editor opens GUI pages for engine, moderation, channels, announcements, storage/network and formats, and supports direct get/set/toggle/add/remove edits. Requires nexachat.editor.
Players create private groups with /groupchat, invite members, and send messages with /gc or by toggling routing. Groups have size, naming and cooldown limits in config.yml under group-chat.
Not in this release. The event-bus contract and configuration surface exist, but the runtime adapter is a safe no-op until a client is bundled.
No. Redis transport connects backends directly to Redis - the Bungee/Velocity jars are only needed for plugin-message transport.
Product release notes grouped by version. Major public changes are written for buyers and server owners, not as raw commit logs.
Cross-server hardening: every network.yml switch now drives real behavior instead of being ignored.
network.multi-channel: each event type (chat, staff, pm, mention, mute, punish, spam) gets its own wire channel from network.channels, with the Bungee/Velocity bridge modules registering all of them automatically.network.receive-formats for per-event-type formats (e.g. a dedicated staff chat format), with receive-format as the fallback.transport: "proxy" now picks the Bungee or Velocity bridge based on bungee.enabled/velocity.enabled, with warnings when both are true or both are false.server-id: "server-1" refuses to start network sync and logs a SEVERE error instead of silently dropping remote messages.channel.cross-server is now enforced on both sides: only flagged channels are published, and incoming remote chat is filtered by the receiving channel's flag.pm.enabled toggle and reuse the pm.incoming message format.Group chat update focused on private player groups and faster team communication.
/groupchat, /gchat and quick /gc <message> commands.Initial premium release line for the NexaChat platform.
Send enough information to reproduce the issue.
Plugin: NexaChat
Plugin version:
Server version:
Java version:
Server software:
Engine mode:
Storage type:
Network transport:
Installed hooks:
Error log:
Steps to reproduce:
Expected behavior:
Screenshots/video: