Skip to content
RitomasssCommunity
Product documentation

NexaChat Documentation

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.

21Java target
Paper/Folia 1.21Server target
SQLite/MySQLStorage mode
Proxy + RedisNetwork posture

Overview#

Product purpose, target audience, main systems, dependencies and quick links.

Quick links: Installation, First Setup, License, Change Workflow, Commands, Permissions, Configuration, Messages, GUI, Placeholders, Storage, Integrations, Cross-Server Setup, Engine Guide, How-To Guides, Common Setups, Performance Tuning, Upgrades, Compatibility, Security, Troubleshooting, Changelog and Support.

What is NexaChat?#

A premium chat layer for formatting, channels, moderation, private messages, item sharing, chat logs and cross-server chat delivery.

Who is it for?#

Server owners who need configurable chat behavior across SMP, Lifesteal, Survival, PvP, hub and small network setups without hard depending on optional plugins.

Supported server types#

Paper, Folia-oriented Paper environments, Spigot-compatible fallbacks, BungeeCord networks and Velocity networks.

Main features#

  • Performance and lightweight chat engines
  • Global, local, staff, trade and private channels
  • MiniMessage, legacy color and hover/click rendering
  • Mentions with highlight and sound feedback
  • Private messages, reply, ignore, social spy and mail
  • Spam, filter, command, sign, book and packet rule layers
  • Read-only item, inventory, ender chest and shulker shares
  • SQLite, MySQL, MariaDB, YAML fallback and Redis sync

Dependencies#

  • Java 21
  • Paper-compatible 1.21 server target
  • License key for normal premium startup
  • LuckPerms, PlaceholderAPI, Vault and EssentialsX are optional hooks
  • ProtocolLib, DiscordSRV, TAB, DeluxeMenus, ItemsAdder, Oraxen and Nexo are optional hooks
  • BungeeCord, Velocity or Redis only when network sync is enabled

Installation#

Installation gets the plugin to boot. First Setup prepares it for production use.

Do not replace plugin jars while the server is running. Always make a backup before updating.
Download the latest NexaChat jar from the official buyer/download source.Use the Paper jar on the backend server. Use the Bungee or Velocity module only when the network setup requires it.
Stop the server before replacing the jar.Do not hot-swap a chat plugin while players are online because listeners, channels and storage tasks need a clean lifecycle.
Upload the jar to /plugins.Install optional hooks such as LuckPerms, PlaceholderAPI, Vault, DiscordSRV or ProtocolLib before first production testing.
Start the server once and confirm the plugin folder was generated.NexaChat generates modular YAML files for config, channels, formats, storage, network, moderation, spam, rules and messages.
Configure license, storage and core files listed in the Configuration section.At minimum set license-key, select storage, review channels and confirm message formatting.
Restart the server and run the main status/admin command.Use /nexachat status and /nexachat perf to confirm the loaded mode, hooks and runtime health.

First Setup#

Recommended first configuration pass after the plugin has generated its files.

Make one change at a time, reload or restart, then test the player workflow with a real account.

Setup checklist#

  1. Set the license key in config.yml.
  2. Choose performance or lightweight engine mode.
  3. Configure channels.yml for global, local, staff and trade chat.
  4. Update formats.yml for prefix, suffix, rank icon and message layout.
  5. Choose storage type in storage.yml.
  6. Enable or disable soft hooks in integrations.yml.
  7. Test chat, local range, staff chat, PMs, ignore, mentions and share tokens.

Production notes#

  • Use LuckPerms or your permission manager for admin, staff, bypass and channel nodes.
  • Keep backups of YAML files and database tables before updates.
  • Use MySQL or MariaDB for larger production servers that need durable chat logs.
  • Enable Redis or proxy sync only after single-server chat is already working.
  • Do not market Folia support for every external hook unless that hook was tested in your setup.

License#

Premium builds validate a license key at startup. The enable banner shows a masked license status.

Keep the key private. Anyone with the key can start a premium copy of your purchase.

How to configure#

  1. Copy the key from your buyer/download page.
  2. Paste it into license-key in config.yml.
  3. Restart the server and check the enable banner for the license line.
  4. If the banner shows an invalid/masked status, re-check whitespace and quotation marks around the key.

License problems#

  • The key was entered into config.yml, not into another generated YAML file.
  • The pasted key has wrapped onto multiple lines or has trailing spaces.
  • The server file was copied to a new machine without the same key.
  • The key is lost - open a support ticket with your proof of purchase. Keys are not recoverable from a broken server.
config.yml license key excerpt
license-key: "YOUR-KEY-HERE"
A jar or license change requires a restart. /nexachat reload does not re-validate licensing runtime state.

Change Workflow#

Use this checklist every time you change NexaChat config files.

Make one change, reload or restart, test in-game, then move to the next change.

Reload vs restart#

ChangeApply with
YAML config, messages, formats, rules/nexachat reload
Plugin jar (update)Server restart
license-keyServer restart
storage.yml type/driverServer restart
network.yml transportServer restart
Engine mode (config.yml engine.mode)Restart (preset command switches pipeline)

Backup routine before every change#

  1. Stop or quiet the server (or copy files with the database idle).
  2. Copy the whole NexaChat plugin folder to a backup location.
  3. For SQL storage, export the database (or schedule your host's SQL backup job).
  4. Note plugin version, server version and storage type with the backup.
  5. Restore test: keep at least one verified-restore backup per release line.
Validate YAML before reload.Check indentation with a YAML-aware editor. Tabs inside YAML break the file. Most YAML errors show as a SnakeYAML scanner error in console on reload.
Reload safely.Run /nexachat reload as an admin. Watch the console for the first error - repeated errors below it are usually echoes of the same root cause.
Test with a real account.Test on a non-op player when testing channel permissions, rank formats, spam and filter behavior. Op hides most checks.
Revert if broken.Replace the broken file from backup, then reload again. One-broken-file-at-a-time keeps debugging cheap.

Commands#

Each command includes purpose, permission, example and when to use it.

Command entries are based on NexaChat's local plugin.yml and command implementation.
/nexachatAlias: /nc
Description

NexaChat admin command for reload, status, performance view, lightweight preset, GUI bridge and share opening.

Permission

nexachat.admin

Example

/nexachat status

When to use

Use this when configuring, debugging or operating the plugin as staff.

/chatCommand
Description

Player chat control command for toggles such as mention notifications.

Permission

Not declared in plugin.yml

Example

/chat toggle mentions

When to use

Use this for player-facing chat preferences that should not require admin access.

/channelAlias: /ch
Description

Switch or inspect active chat channels.

Permission

Channel-specific

Example

/channel staff

When to use

Use this when players move between global, local, staff, trade or provider channels.

/msgAliases: /tell /w /whisper
Description

Send a private message to an online player.

Permission

Not declared in plugin.yml

Example

/msg Steve hello

When to use

Use this for direct player-to-player conversations with ignore and social spy support.

/replyAlias: /r
Description

Reply to the latest private message conversation.

Permission

Not declared in plugin.yml

Example

/reply yes

When to use

Use this after receiving or sending a private message.

/ignoreCommand
Description

Toggle ignoring another player.

Permission

Not declared in plugin.yml

Example

/ignore Steve

When to use

Use this when a player wants to block private messages from another player.

/socialspyCommand
Description

Toggle private message spy for staff.

Permission

nexachat.spy

Example

/socialspy

When to use

Use this for moderation visibility on private message traffic.

/clearchatCommand
Description

Clear visible chat for players.

Permission

nexachat.admin

Example

/clearchat

When to use

Use this after spam, advertising or chat incidents.

/mutechatCommand
Description

Toggle global chat mute.

Permission

nexachat.admin

Example

/mutechat

When to use

Use this during raids, announcements or moderation lockdowns.

/mailCommand
Description

Offline mail command for send, read and clear workflows.

Permission

nexachat.feature.mail

Example

/mail read

When to use

Use this when players need async messages outside live PMs.

/announcementCommand
Description

Broadcast configured announcement output.

Permission

nexachat.admin

Example

/announcement broadcast restart

When to use

Use this for scheduled notices, maintenance and staff broadcasts.

/groupchatAliases: /gchat /chatgroup
Description

Manage private player chat groups: GUI, create, invite, accept, deny, leave, members, kick, transfer ownership, rename, disband and toggle group chat routing.

Permission

nexachat.group (+ nexachat.group.create, nexachat.group.invite, nexachat.group.manage)

Example

/groupchat create TeamBlue

When to use

Use this when a player needs a persistent private channel for a team, friend circle or clan without staff involvement.

/gcCommand
Description

Send one quick message to your player chat group without toggling routing.

Permission

nexachat.group

Example

/gc Ready to fight?

When to use

Use this for single group messages. Toggle routing in the group GUI when every message should go to the group.

Permissions#

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 true
nexachat.admin

Allows using NexaChat admin commands such as reload, status, perf, preset, GUI and chat moderation commands.

Default: opOwner/Admin
nexachat.staff

General staff permission used by staff-facing chat and moderation workflows.

Default: opStaff
nexachat.spy

Allows toggling private message social spy.

Default: opStaff
nexachat.bypass.spam

Bypasses spam cooldown, duplicate, caps, similarity and command spam checks.

Default: opTrusted staff
nexachat.bypass.filter

Bypasses filter and advertising checks when configured in whitelist sections.

Default: opTrusted staff
nexachat.bypass.mute

Bypasses mute restrictions.

Default: opTrusted staff
nexachat.bypass.vanish

Bypasses vanish-aware private message targeting restrictions.

Default: opTrusted staff
nexachat.channel.staff

Allows access to the configured staff channel.

Default: opStaff
nexachat.channel.manage

Allows channel management actions.

Default: opOwner/Admin
nexachat.channel.town

Allows town provider channel access where used by server configuration.

Default: truePlayers
nexachat.channel.land

Allows land provider channel access where used by server configuration.

Default: truePlayers
nexachat.channel.faction

Allows faction provider channel access where used by server configuration.

Default: truePlayers
nexachat.channel.island

Allows island provider channel access where used by server configuration.

Default: truePlayers
nexachat.feature.item

Allows item share tokens such as [item] and {item}.

Default: truePlayers
nexachat.feature.inventory

Allows inventory, ender chest and shulker share tokens.

Default: truePlayers
nexachat.feature.mail

Allows player mail feature usage.

Default: truePlayers
nexachat.gui

Allows opening the settings GUI via /nexachat gui when player-facing settings access is wanted.

Default: truePlayers
nexachat.editor

Allows using the in-game editor menus and /nexachat editor config paths.

Default: opAdmin
nexachat.group

Base permission for player chat group features: open GUI, accept invites, leave, view members and send group messages.

Default: truePlayers
nexachat.group.create

Allows creating a new player chat group.

Default: truePlayers
nexachat.group.invite

Allows inviting other players to a player chat group.

Default: truePlayers
nexachat.group.manage

Staff-side permission to kick, transfer, rename or disband any player chat group. Group owners can always manage their own group.

Default: opStaff
nexachat.bypass.clear

Players with this permission are not affected by /clearchat.

Default: opTrusted staff

Configuration#

Configuration YAML files below contain short bundled default excerpts, not full files. Message YAML is documented only in Messages & Language.

Validate YAML indentation before restarting the server.
config.yml short excerpt, not full file

Main runtime settings for engine mode, license, mentions, performance cache, integrations, anti-spam, moderation, share previews and security.

Short YAML preview only. This block shows selected lines from 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: 40
Top-level keys

engine, license-key, mentions, performance, integrations, anti-spam, moderation, share, security

Production handling

Use /nexachat reload for safe runtime changes. Restart after jar, license, storage driver or proxy transport changes.

channels.yml short excerpt, not full file

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: false
Channel behavior

range: -1 means server-wide. Local chat filters recipients by world first, then distance.

Provider channels

Town, land, faction and island channels are prepared surfaces for group plugins and should be tested with the target provider.

formats.yml short excerpt, not full file

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>&raquo;</dark_gray> <gray>{message}</gray>"
  staff: "<dark_gray>[<gold>Staff</gold>]</dark_gray> {rank_icon}{prefix}<yellow>{display_name}</yellow> <dark_gray>&raquo;</dark_gray> <white>{message}</white>"
  trade: "<dark_gray>[<green>Trade</green>]</dark_gray> {rank_icon}{prefix}<green>{display_name}</green> <dark_gray>&raquo;</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 behavior

Use open-url, run-command or suggest-command. URL wins when configured.

integrations.yml short excerpt, not full file

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 order

LuckPerms is checked first, Vault second and TAB last for prefix/suffix style metadata.

Soft hook rule

Enable the hook only when the dependency is installed and verified on the server.

network.yml short excerpt, not full file

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 events

Chat, staff chat, global mute, mute, PM, mention, punishment and spam cooldown events have dedicated channels.

Transport choice

Use proxy for Bungee/Velocity messaging. Use Redis for shared pub/sub across servers.

moderation.yml, spam.yml, filters.yml and rules.yml short excerpt, not full file

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 triggers

Chat, command, sign, book and ProtocolLib packet triggers are supported by the rule layer.

Rule actions

Cancel, replace, warn, mute, kick, command, reply, broadcast, actionbar, title, bossbar, Discord, proxy and log actions can be used.

storage.yml short excerpt, not full file

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: nexachat
Standalone server

Use SQLite for one-server setups unless you need external reporting or shared state.

Production network

Use MySQL or MariaDB with backups and test migrations before switching a live server.

outputs.yml, emoji.yml, normalization.yml and announcements.yml short excerpt, not full file

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: true
Output handling

Use these files for how NexaChat sends chat-adjacent output, not for command permissions.

Glyph handling

ItemsAdder, Oraxen and Nexo glyphs should be configured only after the provider plugin is installed.

Messages & Language#

Translation and formatting guidance based on NexaChat's bundled resources.

Message reload follows /nexachat reload. Restart after jar, storage, network or license changes.

How to edit messages#

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.

Formatting#

<red>Error message</red>
&cLegacy color message
{player} {target} {message} {reason}
messages.yml short excerpt, not full file
Short YAML preview only. This block shows selected lines from 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 safety

Keep placeholders such as {channel}, {target}, {sender}, {message} and {reason} intact.

Color format

Messages are written for MiniMessage-style rendering while legacy ampersand formatting is still accepted by the text service.

GUI / Menus#

NexaChat exposes an admin/player settings surface through DeluxeMenus when available and a built-in fallback inventory when it is not.

The fallback GUI is intentionally small. Use DeluxeMenus for a fully branded public settings menu.

DeluxeMenus bridge#

When DeluxeMenus is enabled and deluxemenus.enabled is true, /nexachat gui dispatches the configured console command.

  • Default command: dm open nexachat_settings {player}
  • Best use: buyer-facing settings menu, cosmetics, channel shortcuts and help links.

Built-in settings menu#

If DeluxeMenus is missing, NexaChat opens a 27-slot Bukkit inventory named NexaChat Settings (layout configurable in menus.yml).

  • Slot 10: status, hooks and performance summary
  • Slot 12: mention highlight toggle
  • Slot 14: config reload
  • Slot 16: current channel display
  • Slot 20: in-game editor (/nexachat editor)
  • Slot 22: close button

Share preview menus#

Item, inventory, ender chest and shulker share tokens open read-only Bukkit inventory previews with expiry protection.

  • Inventory title: Shared Inventory
  • Shulker title: Shared Shulker
  • Default expiry: 120 seconds
Menu configuration guidance documented

Put 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: 120

Placeholders#

NexaChat consumes PlaceholderAPI values and also provides internal format placeholders for chat rendering.

NexaChat's current Paper module consumes PlaceholderAPI through reflection. It does not expose a separate PlaceholderAPI expansion in this docs page.

Internal chat placeholders#

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}

PlaceholderAPI usage#

When PlaceholderAPI is installed and enabled, NexaChat expands placeholders after its internal format placeholders and metadata fallback.

  • Install PlaceholderAPI and required expansions.
  • Use PAPI placeholders inside configured chat format text.
  • Keep the placeholder cache TTL sane for high-chat servers.
Rendering examples documented
PlaceholderExample outputDescription
{display_name}RitoDisplay name resolved through Essentials/SkinsRestorer fallback when configured.
{prefix}&6AdminPrefix resolved from LuckPerms, Vault or TAB according to metadata priority.
{rank_icon}AConfigured rank icon from emoji.yml.
{vault_balance}1250.50Vault economy placeholder when Vault economy support is enabled.
{message}Hello worldFiltered, rendered and share-token-processed chat message body.

Storage#

Storage docs explain YAML, SQLite, MySQL, MariaDB, chat logs, toggles and backup expectations.

Always back up before changing storage type or updating a production server.

Storage recommendation#

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.

Stored data#

  • Chat logs when logging is enabled.
  • Player toggles such as mention preferences.
  • Ignore lists and PM-related state.
  • Mail and moderation-related data when the feature is active.
  • Temporary share IDs are runtime state and expire according to config.

Backup checklist#

  • Stop the server before copying live SQLite or YAML files.
  • Export SQL databases before updates.
  • Record plugin version, server version and storage type in backup notes.
  • Test migration on a copy before switching production storage.

Async safety#

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.

Integrations#

Each integration explains purpose, required/optional status, setup steps and troubleshooting.

Soft hooks load after the dependency is available through Bukkit's plugin manager. Missing plugins must not prevent NexaChat from loading.
LuckPerms Optional hook

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.

  1. Install LuckPerms.
  2. Set group prefixes, suffixes and weights.
  3. Confirm metadata priority includes luckperms.
  4. Test with /nexachat status and a non-op player.
PlaceholderAPI Optional hook

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.

  1. Install PlaceholderAPI.
  2. Install expansions needed by your chat format.
  3. Place the exact PAPI placeholder in formats.yml.
  4. Reload PAPI, then reload NexaChat.
Vault Optional hook

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.

  1. Install Vault and an economy provider.
  2. Restart and confirm Vault reports a provider.
  3. Enable Vault in integrations.yml.
  4. Test {vault_balance} in a format with a normal player.
EssentialsX and SkinsRestorer Optional hooks

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.

  1. Install the target plugin before NexaChat.
  2. Enable the matching hook in integrations.yml.
  3. Test nickname, vanish and mute behavior with non-op accounts.
  4. Switch command-compat-mode only when command ownership conflicts with another plugin.
DiscordSRV Optional hook

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.

  1. Install and configure DiscordSRV.
  2. Enable publish toggles in integrations.yml.
  3. Map NexaChat channels to DiscordSRV channels.
  4. Test public chat, staff chat and moderation actions separately.
ProtocolLib Optional hook

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.

  1. Install a compatible ProtocolLib build.
  2. Restart the server.
  3. Enable packet rules only after normal chat and command rules work.
  4. Review console warnings from the packet adapter.
DeluxeMenus Optional hook

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.

  1. Create a DeluxeMenus menu named for your NexaChat settings flow.
  2. Set deluxemenus.menu-command to open it.
  3. Use {player} in the command where DeluxeMenus expects a player.
  4. Run /nexachat gui as a player.
ItemsAdder, Oraxen and Nexo Optional hooks

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.

  1. Install the glyph provider and resource pack.
  2. Configure glyph values in emoji.yml.
  3. Use {rank_icon} or {permission_icons} in formats.
  4. Test with one group before expanding to every rank.
BungeeCord, Velocity and Redis Optional network hooks

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.

  1. Start with one backend server and confirm local chat first.
  2. Choose proxy or Redis transport.
  3. Set unique server IDs.
  4. Enable only the event types you actually need.
  5. Test chat and staff chat before enabling moderation sync.
WorldGuard, GriefPrevention, Towny, Lands, Factions and SuperiorSkyblock Prepared soft surfaces

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.

  1. Install the provider plugin before NexaChat.
  2. Enable the matching hook in integrations.yml.
  3. Configure provider channels in channels.yml.
  4. Test with real town, land, faction or island members.

Cross-Server Setup#

Route chat, staff chat, PMs, mentions, mutes and punishments across a BungeeCord, Velocity or Redis network.

Get single-server chat fully working first. Network sync is always the second step, never the first.
Every backend needs a unique 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.

Which transport?#

  • BungeeCord network: transport: "proxy" with bungee.enabled: true (auto-selected) and the Bungee module, or transport: "bungee" for native BungeeCord forwarding without a proxy jar.
  • Velocity network: transport: "proxy" with velocity.enabled: true and bungee.enabled: false (auto-selected), or transport: "velocity" explicitly. Requires the Velocity module.
  • Redis: 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.

Where each jar goes#

  • Every backend: the Paper jar + network.yml config.
  • BungeeCord proxy: nexachat-bungee jar only.
  • Velocity proxy: nexachat-velocity jar only.
  • Redis-only setups: no proxy jar at all.

What can sync#

  • Chat + staff chat broadcast
  • Private messages (routed directly to the target's server)
  • Mentions, global mute, player mute
  • Punishments and spam cooldown events

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.

BungeeCord network setup step by step

Prerequisites: working single-server NexaChat on each backend, a BungeeCord proxy that knows all backend servers.

  1. Stop every backend and the proxy.
  2. Upload the nexachat-bungee jar to the proxy's /plugins folder.
  3. Start the proxy once - it creates plugins/NexaChat/config.properties with channel and shared-secret.
  4. On every backend edit 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: false
  1. Set the same channel and shared-secret in the proxy's config.properties.
  2. Make every backend server-id unique (e.g. lobby-1, survival-1, pvp-1).
  3. Optional alternative without the proxy jar: transport: "bungee" uses native BungeeCord forwarding on the bungee.channel/bungee.sub-channel pair.
  4. Set cross-server: true on each channel that should travel across servers (see channels.yml below).
  5. Restart proxy and all backends, then send a chat message with a player on each server.
Proxy plugin-message transport needs at least one player online on the sending server. Test with two connected accounts.
Velocity network setup step by step

Prerequisites: working single-server NexaChat on each backend, Velocity proxy with backend forwarding configured.

  1. Stop backends and proxy.
  2. Upload the nexachat-velocity jar to the Velocity /plugins folder.
  3. Start the proxy once - it creates plugins/nexachat/config.properties (channel=nexachat:main, shared-secret=).
  4. On every backend edit 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"
  1. Copy the same 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.)
  2. Enable cross-server: true on the channels that should sync.
  3. Restart all backends and test chat between two servers with two accounts.
Redis setup step by step

Prerequisites: a Redis instance reachable from every backend. No proxy module is needed.

  1. Stop all backends.
  2. On every backend edit 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"
  1. Use identical Redis host, credentials and redis.channel on every server.
  2. Keep server-id unique per server.
  3. Restart all backends and verify chat arrives on both servers.
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.
Cross-server channel flags channels.yml

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: false

Received 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).

Per-event-type channels network.multi-channel

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.

Cross-server troubleshooting checklist check in order
  1. Unique server IDs: two backends with the same 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.
  2. One transport at a time: do not enable Redis while using proxy transport unless intentionally running hybrid.
  3. Bridge flags: with 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.
  4. Shared secret: backend 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.
  5. Channel mismatch: proxy.channel/Velocity channel on backends must equal the channel registered by the proxy module.
  6. No players online: proxy plugin-message transport cannot publish when a backend has zero players connected.
  7. Channel flag: confirm the sending channel has cross-server: true.
  8. Dedupe TTL: raise dedupe-ttl-seconds if events replay after long proxy hiccups; keep it sane for large networks.

Engine Guide#

How performance and lightweight modes differ and how to choose between them.

Switching engine mode is a restart-level change. Use /nexachat preset lightweight or edit config.yml and restart.

performance mode#

  • Full pipeline: normalization, spam, filter, rule engine, format, render, output and logging.
  • All moderation layers, async batch chat logging and share tokens.
  • Default choice when hardware is normal and player count is not extreme.

lightweight mode#

  • Short pipeline with lazy module activation - only listed modules run.
  • Module list lives in engine.lightweight.enabled-modules.
  • Best for very high player counts, mini-games or low-spec hardware.
Selecting lightweight modules config.yml

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 these

render, mentions and local-chat for a normal feel. spam/filter keep moderation alive.

Switching

Run /nexachat preset lightweight to save the preset, then reload or restart. Check /nexachat perf afterwards.

How-To Guides#

Task-based recipes: prerequisite, config change, apply method, verification step.

Every guide follows: change one thing, reload or restart, test with a non-op player.
Add a custom channel channels.yml
  1. Add a new block under channels in channels.yml.
  2. Point format at an existing or new format key in formats.yml.
  3. Gate it with a permission and grant that permission to the target group.
  4. /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
If the channel does not appear in /channel, the player lacks the channel permission or the YAML indentation is broken.
Rank-based chat formatting LuckPerms + formats.yml
  1. Set the prefix on the LuckPerms group: /lp group admin meta setprefix "&4Admin ".
  2. Confirm metadata-priority in integrations.yml starts with luckperms.
  3. Add a weighted rank format in formats.yml:
formats:
  vip: "<dark_gray>[<light_purple>VIP</light_purple>]</dark_gray> {prefix}<white>{display_name}</white> <dark_gray>&raquo;</dark_gray> <gray>{message}</gray>"

rank-formats:
  vip:
    permission: "nexachat.format.vip"
    weight: 50
    format: "vip"
  1. /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.

Write a custom moderation rule rules.yml

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."
  1. Add the rule, keep priority sensible (lower fires first).
  2. /nexachat reload and test the pattern with a normal account.
  3. Check the first console error if the YAML does not parse.
Advertise protection with the filter layer filters.yml
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.

Publish chat to Discord DiscordSRV
  1. Install and fully connect DiscordSRV first - NexaChat publishes through reflection and needs DiscordSRV online.
  2. Enable the toggles in 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: staff
  1. Map NexaChat channels to DiscordSRV channels and test public chat, staff chat and moderation output separately.
  2. /nexachat reload, then restart if DiscordSRV load order is the problem.
Add emoji and glyph icons emoji.yml
emoji:
  replacements:
    ":heart:": "<red>heart</red>"
    ":star:": "<yellow>star</yellow>"
  rank-icons:
    admin: "<red>A</red> "
  • Plain MiniMessage replacements work without any extra plugin.
  • ItemsAdder, Oraxen or Nexo glyphs: install the provider and resource pack, enable it under custom-font in integrations.yml, then use provider glyph values in emoji.yml.
  • Use {rank_icon} and {permission_icons} inside chat formats.
Translate messages to another language messages.yml
  1. Copy the bundled messages.yml values into the generated file in the plugin folder.
  2. Translate the text values; keep every key name and every placeholder ({player}, {target}, {message}, {reason}, {channel}, {sender}) intact.
  3. Use MiniMessage tags such as <green>; legacy & colors still work.
  4. /nexachat reload and trigger each message in-game to verify.
A deleted placeholder does not crash - the message simply renders with the raw {token} text or nothing at all, which looks broken to players.
Migrate from SQLite to MySQL/MariaDB storage.yml
  1. Back up: copy the plugin folder including the SQLite file, and record plugin + server versions.
  2. Stop the server.
  3. Create the target database and grant a user with full privileges on it.
  4. Change storage.yml to type: mysql (or mariadb) and fill the credentials.
  5. Start the server. NexaChat creates its tables on first connect.
  6. Old SQLite history is not auto-merged - restore or export historical logs separately if you need them for reporting.
type: mysql

mysql:
  host: localhost
  port: 3306
  database: nexachat
  username: nexachat_user
  password: "CHANGE-ME"
Storage driver changes always need a restart. Never switch the driver of a live server.
Use the in-game editor /nexachat editor

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 Steve
  • Requires nexachat.editor (default: op) - do not hand this to regular players.
  • Editor writes edit YAML files directly; run /nexachat editor reload or /nexachat reload afterwards.
  • Restart-level settings (license, storage driver, transport) still need a real restart.
Configure rotating announcements announcements.yml
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."
  • One block per announcement group with its own interval, permission and world filters.
  • random: true picks messages in random order instead of rotation.
  • /nexachat reload after changes; test with /announcement broadcast.

Common Setups#

Ready-to-follow scenarios reduce support tickets and make the product easier to configure.

Tune channels, durations, bypasses, storage and hooks with the YAML files above.

SMP Chat Setup#

Use global and local channels, SQLite storage, relaxed spam limits, player mentions and readable rank formats for community chat.

Lifesteal Staff Setup#

Enable staff channel, social spy, clear chat, mute chat, advertising filters, command hiding and admin bypass permissions.

Network Chat Setup#

Use MySQL or MariaDB for durable storage, Redis or proxy transport for chat events, unique server IDs and a shared secret.

Lightweight Setup#

Run /nexachat preset lightweight, keep only needed modules active, disable debug timings and test with normal player chat load.

Premium Formatting Setup#

Use LuckPerms metadata, MiniMessage formats, rank icons, permission icons, hover text and suggest-command click actions.

Anti-Advertising Setup#

Keep filter regexes enabled, add staff bypass permission, tune rule actions and send clear actionbar or reply feedback when messages are blocked.

SMP Chat Setup checklist expand
  1. Engine mode performance, storage sqlite.
  2. Keep global + local channels; local range around 100 blocks.
  3. Relax spam: raise anti-spam.cooldown-seconds slightly, keep duplicate/caps checks.
  4. Enable mentions with sound and title output for community interaction.
  5. Rank formats via LuckPerms prefixes; test with non-op accounts.
Lifesteal Staff Setup checklist expand
  1. Enable staff channel (nexachat.channel.staff) and social spy for moderators.
  2. Keep /clearchat, /mutechat and nexachat.bypass.* nodes on staff groups only.
  3. Enable advertising filter + command-hiding rule for /plugins, /version.
  4. Route staff chat cross-server when running multiple backends.
  5. Use MySQL for durable moderation logs across restarts.
Network Chat Setup checklist expand
  1. Follow the full Cross-Server Setup walkthrough.
  2. MySQL/MariaDB storage on every backend for shared history/reporting.
  3. Unique server-id per backend, one shared secret everywhere.
  4. Enable only the event types you need; start with chat + staff.
  5. Verify de-duplication: a message should appear once per server.

Performance Tuning#

Settings that matter on busy servers and how to read NexaChat's own metrics.

Run /nexachat perf before changing anything - it shows the current pipeline summary so you can compare.

Cache TTLs (config.yml)#

  • 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 logging#

  • 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.
  • Keep debug-timings: false in production.
Tuning workflow steps
  1. Get a baseline with /nexachat perf and server TPS.
  2. Change one value, /nexachat reload, wait a few minutes of real traffic.
  3. Compare again. Revert if timing numbers got worse.
  4. If lightweight pipeline cuts too many features, prefer tuning cache/batch values first before switching engine mode.

Upgrades#

Updating NexaChat safely without losing configuration or data.

Stop the server before replacing the jar. Hot-swapping a chat plugin corrupts in-flight messages and storage tasks.
Back up before anything.Copy the whole plugin folder and export the database. Note current plugin + server version.
Read the changelog.Check this page's changelog section for config schema changes between your version and the target version.
Stop the server and replace the jar.Upload the new jar into /plugins while the server is down.
Review new config options.New versions may add keys. The generated files are not overwritten, so merge new options manually if you want them.
Start and verify.Check the enable banner, run /nexachat status and /nexachat perf, then test chat, PMs and one network event if you run cross-server.
Roll back plan.If something breaks: stop, restore the old jar, restore config from backup, start. Your database backup covers the data.

Compatibility#

Version matrix and the honest status of every integration surface.

Only market an integration as "fully supported" after you tested it in your own setup.
RequirementMinimumNotes
Java21Hard requirement. Plugin will not enable on older JVMs.
ServerPaper/Folia 1.21Folia declared supported; test third-party hooks under Folia.
NexaChat v1.0.21.21.x + Java 21Paper, Bungee and Velocity modules share the same version line.
PluginsVariesProtocolLib must match your server version; Vault needs an economy provider.
Integration status matrix full list
IntegrationStatusBehavior
LuckPermsFull soft hookPrefix, suffix and primary group; first metadata source.
PlaceholderAPIFull soft hookExpands placeholders after internal placeholders.
VaultFull soft hookChat fallback + economy placeholders.
MiniMessage/AdventureCoreAll rendering: chat, hover, click, title, actionbar, bossbar.
ProtocolLibOptional adapterPacket rule listener loads only when installed.
DiscordSRVAdapterReflective publish of chat/staff/mention/moderation events.
EssentialsXAdapterNickname, vanish-aware PM, mute respect, command compat mode.
BungeeCord / VelocityDedicated modulesPlugin-message network event publish/receive.
RedisReal adapterFull pub/sub transport for network events.
ItemsAdder / Oraxen / NexoConfig-backed glyph providersLoad configured glyphs only when installed.
TABMetadata fallbackPrefix/suffix fallback after LuckPerms and Vault.
DeluxeMenusCommand bridge/nexachat gui dispatches configured command.
SkinsRestorerDisplay hookDisplay-name fallback for offline-mode servers.
WorldGuard / GriefPreventionPrepared surfaceHook surface exists; region-specific rule logic is the next implementation slice. Not safe to market as full automation yet.
Towny / Lands / Factions / SuperiorSkyblockGroup channel surfaceChannel types + resolver exist; plugin member lookup is soft/no-op safe.
LiteBans / AdvancedBan / LibertyBansCommand templatesModeration actions dispatch configured punishment commands.
CoreProtect / PlanAudit hooksDetection + audit/analytics context via safe no-op hooks.
RabbitMQ / KafkaContract onlyInterface/config exist; runtime adapter is no-op until client is bundled.

Security#

Protect your network credentials and keep moderation powers out of the wrong hands.

Never expose Redis or MySQL to the public internet without authentication and firewalling.

Network credentials#

  • Always set a long random network.shared-secret - events failing to decode against it are rejected.
  • Bind Redis to internal interfaces; always enable requirepass before pointing NexaChat at it.
  • Use a dedicated MySQL user with privileges only on the NexaChat database.

Permission hygiene#

  • Grant bypass nodes (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.
  • Review security.hidden-commands so players cannot fingerprint your server with /plugins, /version.
security section (config.yml) excerpt
security:
  hidden-commands:
    - plugins
    - pl
    - version
    - ver
    - about
  max-book-pages: 50
  max-book-page-length: 1024
  max-sign-length: 256
  command-spy: true

These limits bound sign/book inputs before filter layers run, keeping packet and content checks cheap.

Troubleshooting#

Start with console logs, config diffs, plugin version and reproduction steps.

The first error in console is usually more useful than repeated follow-up errors.
Plugin does not load issue

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.

Chat format does not show prefixes issue

Check LuckPerms metadata, Vault chat fallback, TAB fallback, metadata priority and whether the player has the rank-format permission expected by formats.yml.

Local chat reaches the wrong players issue

Verify the channel's range, world list, region list and whether the player actually switched to the local channel.

Private messages ignore vanish or mute state issue

Confirm EssentialsX hook settings, command compatibility mode and whether the sender has nexachat.bypass.vanish or nexachat.bypass.mute.

Share preview does not open issue

Check nexachat.feature.item and nexachat.feature.inventory, token spelling, share expiry and whether the player is online when opening the preview.

Network messages duplicate or disappear issue

Check transport type, server ID uniqueness, dedupe TTL, shared secret, proxy channel names and whether both proxy and Redis transports were accidentally enabled.

Placeholder values are blank issue

Install PlaceholderAPI, test the placeholder directly with PAPI, confirm the target expansion is installed and keep internal NexaChat placeholders spelled exactly as documented.

FAQ#

Short answers for common buyer and staff questions.

Does NexaChat support Folia?#

The Paper plugin descriptor declares Folia support. Test every third-party hook in your setup before claiming full Folia compatibility for a production stack.

Does it support old Minecraft versions?#

This page targets Paper/Folia 1.21 with Java 21. Legacy 1.8 support is not part of this docs page.

Does it require MySQL?#

No. SQLite is the default standalone choice. MySQL or MariaDB is recommended for larger servers, reporting and production backup workflows.

Does it require PlaceholderAPI?#

No. PlaceholderAPI is optional. NexaChat uses internal placeholders first and only calls PlaceholderAPI when installed and enabled.

Can I use DeluxeMenus for the GUI?#

Yes. /nexachat gui dispatches the configured DeluxeMenus command when DeluxeMenus is installed and enabled.

Can players share inventories safely?#

Yes. Share tokens open read-only snapshots and expire after the configured duration.

Is there an in-game config editor?#

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.

How do player chat groups work?#

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.

Can I use RabbitMQ or Kafka for network events?#

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.

Do I need the proxy module for Redis sync?#

No. Redis transport connects backends directly to Redis - the Bungee/Velocity jars are only needed for plugin-message transport.

Changelog#

Product release notes grouped by version. Major public changes are written for buyers and server owners, not as raw commit logs.

v1.0.3#

Cross-server hardening: every network.yml switch now drives real behavior instead of being ignored.

Added
  • Added 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.
  • Added network.receive-formats for per-event-type formats (e.g. a dedicated staff chat format), with receive-format as the fallback.
  • Added auto bridge detection: 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.
  • Added startup validation: a backend still on the default server-id: "server-1" refuses to start network sync and logs a SEVERE error instead of silently dropping remote messages.
  • Added spam cooldown sync: channel cooldowns now propagate to other servers, so players cannot dodge rate limits by proxy-hopping.
Changed
  • 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.
  • Remote chat and staff chat are gated by channel permission and visibility on the receiving server (staff chat no longer leaks to players without the channel permission).
  • Remote private messages respect the target's pm.enabled toggle and reuse the pm.incoming message format.
  • Redis transport subscribes per event-type channel in multi-channel mode and falls back to a single channel otherwise; unknown proxy sub-channels are no longer parsed as payloads.
Fixed
  • Fixed the silent-drop root cause of "messages not syncing between servers" (identical default server IDs look like local echoes and are thrown away).
  • Fixed proxy plugin messaging silently dropping events when no carrier player was online (now logged).

v1.0.2#

Group chat update focused on private player groups and faster team communication.

Added
  • Added player-created group chats with invites, member list, leave, kick, transfer, rename and disband controls.
  • Added /groupchat, /gchat and quick /gc <message> commands.
  • Added a configurable group chat GUI with chat toggle and member management actions.
Changed
  • Group chat messages now use the normal NexaChat render, filter and spam pipeline where applicable.
Fixed
  • Added safer validation for group names, offline targets and permission-gated group actions.

v1.0.0#

Initial premium release line for the NexaChat platform.

Added
  • Added performance and lightweight chat pipeline modes.
  • Added channel routing, PMs, ignore, social spy, mail and announcements.
  • Added moderation filters, spam checks, rule engine and security listeners.
  • Added item, inventory, ender chest and shulker share previews.
  • Added SQLite, MySQL, MariaDB, Redis, BungeeCord and Velocity surfaces.
Changed
  • Prepared modular YAML resources for premium plugin configuration.
  • Prepared soft hook posture for the wider Nexa plugin ecosystem.
Fixed
  • Hardened optional hook loading so missing plugins do not block startup.
  • Added fallback behavior for GUI, storage and metadata paths.

Support#

Send enough information to reproduce the issue.

Join Discorddiscord.gg/fANhQcyA7XInclude logs, config snippets and exact steps. Screenshots alone are not enough for config, hook, network or database issues.

Before asking for support#

  • Test on the latest available plugin version.
  • Check server version and Java version.
  • Temporarily remove unrelated plugins when debugging conflicts.
  • Attach changed YAML files when config is involved.
  • Include the active engine mode, storage type and enabled hooks.
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: