Auric Chat
A chat plugin focused on simple configuration, built for servers that want full control without the bloat.
PlaceholderAPI · MiniPlaceholders · Packet Chat Bubbles
AuricChat handles formatting, nicknames, private messages, broadcasts, moderation filters and rank prefixes from a single, thoroughly commented config.yml. Every visible message is bilingual out of the box (English and Spanish) and every format string supports full MiniMessage — gradients, hovers, click actions and all.
No dependencies required: LuckPerms, PlaceholderAPI, MiniPlaceholders and packetevents are all completely optional. AuricChat detects each one at startup (and again on /auricchat reload) and quietly enables the matching features — everything else keeps working standalone.
At a glance
Everything you need to know
Whether you're running a small survival server or a full network, this wiki covers every feature, command, permission and configuration option AuricChat has to offer.
Dual Placeholder Support
Every token works both as a PlaceholderAPI %auricchat_x% placeholder and a native MiniPlaceholders <auricchat_x> tag, side by side.
Safe by Default
Chat formatting, nicknames and mentions are parsed through restricted or literal-text MiniMessage layers so players can never inject formatting they're not allowed to use.
Ranks Without LuckPerms
Three interchangeable modes in ranks.yml — pull straight from LuckPerms, match its groups to your own list, or skip LuckPerms entirely using permissions.
Packet Chat Bubbles
An experimental floating text bubble above the sender's head, rendered client-side via packetevents — no permanent entities, no world edits.
Capabilities
Key Features
Everything below is a toggle in config.yml — nothing requires editing code or restarting to test, since /auricchat reload picks up every change live.
MiniMessage Chat Format
One format string controls the whole chat line — {prefix}, {name}, {suffix}, hover text, click-to-whisper, gradients, all of it.
Auto-Link URLs
Players without formatting permission still get clickable links when they paste a plain URL into chat.
Cooldown & Slow Mode
A fixed per-message cooldown plus an admin-toggleable /chatslow for events — the stricter of the two always applies.
Duplicate Message Filter
Blocks near-identical repeats within a time window, with a configurable character-difference tolerance instead of a strict exact match.
Player & Group Mentions
@name highlights and pings a specific player (by username or nickname); @admin / @staff pings every online player with the matching permission.
Anti-Caps & Anti-Swear
Lower-cases excess capitals past a configurable limit and censors a custom word list — both filter the message only, no automatic punishment.
Nicknames
Length limits and uniqueness checks by default, with an optional permission to allow full MiniMessage styling for trusted ranks.
Private Messages & Social Spy
/msg, /reply and /ignore, plus a /socialspy toggle so staff can review private conversations, console included.
Broadcasts
Multi-line announcements via tab completion, automatic centering, an optional border, and a rotating auto-broadcast on a timer.
Join, Quit, Death & Advancement Messages
Replaces each vanilla broadcast with your own template, including a distinct first-join message and a real {attacker}/{victim} death cause.
Emoji Shortcodes
Over 40 shortcodes like :fire: or :) turn into real emoji for everyone, no permission required — fully editable.
Reference
Commands
Every command below also works as /auricchat <name> <args> (e.g. /auricchat nick Steve). The standalone commands like /msg, /broadcast and /clearchat keep working exactly the same either way.
/auricchat with no arguments does the same thing.
Aliases: /ac
config.yml, both language files and ranks.yml, restarts the auto-broadcast timer, and re-checks for PlaceholderAPI/MiniPlaceholders in case they were installed afterward.
Permission: auricchat.command.reload
ranks.yml to preview as that rank instead, and optionally a custom sample message.
Permission: auricchat.command.preview
/tell, /w, /whisper · Permission: auricchat.command.msg
/r · Permission: auricchat.command.reply
auricchat.command.ignore
auricchat.command.socialspy
</> are blocked unless you have the custom-format permission.
Permission: auricchat.command.nick (+ .custom, .unsafe)
line2:, line3: and so on for line breaks — everything after each marker becomes its own centered line.
Alias: /bc · Permission: auricchat.command.broadcast
message-cooldown from config.yml.
Permission: auricchat.command.chatslow
auricchat.bypass.chatmute. Accepts compound durations like 10m, 1h or 1h30m, or no duration at all for a permanent mute until off.
Permission: auricchat.command.chatmute
auricchat.command.clearchat
Access control
Permissions
Every command has its own node under auricchat.command.*, so you can hand out individual features without granting the rest.
Example: auricchat.admin has every staff command as a child node — granting just that one permission is the same as granting reload, preview, msg, reply, ignore, socialspy, nick, broadcast, chatslow, chatmute and clearchat individually.
General
Parent node for every staff command, plus receiving update notifications when a new version is available on Modrinth.
Commands
Reload the configuration and language files.
Preview your own (or any rank's) chat format.
Send private messages. Granted to everyone by default.
Reply to the last private message. Granted to everyone by default.
Ignore or stop ignoring a player. Granted to everyone by default.
View other players' private messages.
Change your own chat nickname. Granted to everyone by default.
Allows colors and MiniMessage formatting inside the nickname itself.
Bypasses the nickname length and uniqueness checks from config.yml.
Send server-wide announcements.
Toggle chat slow mode.
Mute or unmute the entire chat temporarily.
Clear the chat for everyone on the server.
Bypass
Keep chatting even while the chat is muted.
Ignore both the base cooldown and any active slow mode.
Skip the duplicate-message check, the allowed-pattern regex, anti-caps and anti-swear.
Chat Formatting
Use safe MiniMessage formatting — colors, gradients, decorations — inside typed chat messages. Off for everyone by default.
Everything chat.format allows, plus clickable links and click/hover actions. Keep this op-only.
Group Mention Notifications
Receives the highlight and sound when someone writes @admin in chat.
Receives the highlight and sound when someone writes @staff in chat. Both are defined under chat.group-mentions in config.yml and can be renamed or extended freely.
Ranks
Only used when ranks.yml is set to mode: 'permissions'. The <key> must match one of your rank keys exactly (e.g. auricchat.rank.owner). See Ranks & Prefixes for the full explanation.
Setup
Configuration Guide
config.yml controls every aspect of AuricChat. Every single option in the file ships with a bilingual comment above it (English then Spanish), so this guide follows the exact same order top to bottom.
1 General
The four settings at the top of the file: which language to use, what to call the console, where nicknames/ignore lists are saved, and whether to check Modrinth for updates on startup.
Must match a file in the languages folder (en or es out of the box). Falls back to en if the file doesn't exist.
What AuricChat calls the console wherever a sender name is shown, such as /clearchat's broadcast. Not tied to language — it's your own choice.
The YAML file, inside the plugin folder, where nicknames and ignore lists live.
Checks Modrinth once on startup. If a newer version exists, staff with auricchat.admin get notified on join and a warning is logged to console.
View example
language: 'en' check-updates: true console-name: 'Console' storage: file: 'data.yml'
2 Chat Formatting
One template controls how every chat line looks. It's parsed as MiniMessage, so hovers, click actions and gradients all work directly inside it.
The player's real Minecraft username, ignoring any nickname.
The player's nickname if they've set one with /nick, otherwise their real username.
The player's UUID.
Resolved from ranks.yml — see Ranks & Prefixes for the three ways this can work.
Where the actual typed text goes. This is the only MiniMessage tag (not a curly-brace token) since it's inserted as a pre-built component, never re-parsed.
View example
chat: formatting: enabled: true format: '<hover:show_text:"<gray>Click to whisper</gray>"><click:suggest_command:"/msg {player} ">{prefix}{name}{suffix}</click></hover><dark_gray> » </dark_gray><white><message></white>'
Whatever a player actually types is always inserted as literal text through <message>, never re-parsed. Colors and click actions typed in chat itself are a separate system — see the next section.
3 Auto-Link & Chat Format Permissions
How much formatting a player can type into their own message depends on two permissions, layered on top of each other:
The message is shown as plain literal text. If auto-link is true, a plain URL still becomes a clickable link.
Colors, gradients and text decorations work in the typed message. Links and click/hover actions do not.
Everything above, plus clickable links and click/hover actions. Keep this op-only — it's real MiniMessage power.
PlaceholderAPI placeholders typed by the player (like %player_health%) are always resolved, regardless of these two permissions — they're considered safe since they only display information.
View example
chat: auto-link: false
4 Message Cooldown & Allowed Pattern
A base throttle on how often anyone can send a message, and an optional whitelist regex for message content.
Seconds a player must wait between messages. 0 disables it. Combines with /chatslow — whichever is stricter at that moment wins.
A regex the whole message must match to be allowed. Leave empty to disable — this is off by default since it's easy to lock chat down too far with an overly strict pattern.
View example
chat: message-cooldown: 2 allowed-pattern: ''
5 Duplicate Message Check
Blocks a message that's too similar to the same player's previous one, using a Levenshtein-style character distance rather than a strict exact match.
Only compares against the previous message if it was sent within this window.
Strips spaces, punctuation and symbols before comparing, so only letters and numbers count.
How many characters two messages can differ by and still count as duplicates. 0 means only exact matches are blocked.
View example
chat: duplicate-check: enabled: true seconds: 30 ignore-spacing: true max-difference: 2
6 Mentions & Group Mentions
@name highlights and plays a sound to a specific player — it matches both real usernames and nicknames. group-mentions defines extra keywords, like @admin, that notify everyone online with the matching permission instead of one player. Group mention keys also show up in the client's own @ chat suggestions.
Must be a named Adventure color (like yellow or red), not a hex code. Falls back to yellow if invalid.
Any name from Paper's Sound enum. An invalid name just skips the sound instead of erroring.
View example
chat: mentions: enabled: true color: 'yellow' sound: enabled: true name: 'ENTITY_EXPERIENCE_ORB_PICKUP' volume: 1.0 pitch: 1.0 group-mentions: admin: permission: 'auricchat.notification.admin' staff: permission: 'auricchat.notification.staff'
7 Anti-Caps & Anti-Swear
Two independent, off-by-default filters that only touch the message itself — neither one warns, mutes or punishes the player. See Moderation for how these fit together with the rest of the toolkit.
Uppercase letters beyond this count get lower-cased automatically.
A plain list of words to censor, not case-sensitive. Empty by default.
The character used to replace each letter of a censored word, e.g. f***.
View example
chat: anti-caps: enabled: false max-chars: 10 anti-swear: enabled: false replacement-char: '*' words: []
8 Nickname Length
Only the length boundaries live here — the uniqueness check (no two players sharing the same visible nickname) always runs regardless of these values, and both can be bypassed entirely with auricchat.command.nick.unsafe.
View example
nickname: min-length: 2 max-length: 16
9 Private Messages
Controls how /socialspy and console logging behave for private messages sent through /msg.
Always logs private messages to console, independent of whether any player has /socialspy toggled on.
Uses {player} and {receiver} — real usernames, not nicknames, so staff can always identify the real accounts involved.
View example
private-messages: console-socialspy: true socialspy-format: '<dark_gray>[<gray>Spy<dark_gray>] <white>{player} <dark_gray>-> <white>{receiver}<dark_gray>:</dark_gray> <gray><message></gray>'
10 Join & Quit Messages
Both replace the vanilla broadcast entirely. Join messages support a distinct first-join template shown only the very first time a player ever connects — both use the same {prefix}/{name}/{suffix} tokens as chat formatting, minus <message>.
View example
join-message: enabled: true format: '<green>[+] {prefix}{name}{suffix}</green>' first-join: enabled: true format: '<gold>[+] Welcome for the first time, {name}!</gold>' quit-message: enabled: true format: '<red>[-] {prefix}{name}{suffix}</red>'
11 Death & Advancement Messages
Both are off by default. Death messages resolve {attacker} from the real last damage source — a player (by nickname), another entity, or an environmental cause — not from parsing the vanilla death text, so it always matches your configured language. {victim} is the one who died. Pet deaths reuse the exact same {attacker} logic and add {pet} for the animal type.
If enabled is false, this alone removes the vanilla death message without showing a custom one instead.
Only fires for tamed animals with an online player owner.
The advancement name, exactly as Minecraft would show it in brackets.
View example
death-message: enabled: false hide-vanilla: false format: '<gray>{prefix}{name}{suffix} was defeated by {attacker}</gray>' pets: enabled: false format: '<gray>{prefix}{name}{suffix}''s {pet} was defeated by {attacker}</gray>' advancement-message: enabled: false format: '<yellow>{prefix}{name}{suffix} has made the advancement [{achievement}]</yellow>'
12 Broadcasts
Covers both manual /broadcast messages and the automatic rotating announcer.
Pads each line with spaces so it looks centered in a default-width chat box.
A decorative line printed above and below every broadcast. Leave enabled: false to skip it.
Sent in order on a loop every interval-seconds, looping back to the first message at the end.
View example
broadcast: format: '<yellow><message></yellow>' centered: true border: enabled: true line: '<dark_gray><strikethrough> </strikethrough></dark_gray>' auto: enabled: false interval-seconds: 600 messages: - 'Welcome to the server! Remember to read the rules.' - 'Need help? Ask the staff team.'
Type line2:, line3: and so on inside /broadcast (tab-completed for you) to split one announcement into several independently centered lines.
13 Clear Chat
A single number: how many blank lines /clearchat sends to every online player to push old messages off-screen.
View example
clearchat: empty-lines: 100
14 Chat Bubbles EXPERIMENTAL
Shows a floating text bubble above the sender's head whenever they chat, following them for the configured duration. AuricChat picks the best available renderer automatically — nothing to choose in config.yml.
The bubble is sent as raw packets and rendered entirely by the client — the server never tracks a real entity for it, so there's effectively no server-side overhead beyond sending a few packets per tick.
AuricChat spawns a real, temporary TextDisplay entity through the standard Paper API instead. It still follows the player and removes itself automatically, but — being a real entity — it costs a little more than the packet-only version, and visibility follows normal view-distance rules rather than the radius setting below.
How long the bubble stays visible (and keeps following the player) before it's removed, in either mode.
How many blocks away another player can be and still see the bubble. Only enforced in packet mode — see above.
View example
chat-bubbles: enabled: false duration-seconds: 5 radius: 32
packetevents is fully optional. Installing it doesn't unlock the feature — it just switches this feature to the lighter, client-side rendering path. Check your console log on startup for a line confirming which mode is active.
15 Emojis
A shortcode-to-emoji dictionary applied to every message, for every player, no permission required. Over 40 shortcodes are included by default — add, remove or rename any of them freely.
View example
emojis: enabled: true list: ':)': '🙂' ':fire:': '🔥' ':heart:': '❤️' '<3': '❤️'
Deep dive
Ranks & Prefixes
ranks.yml decides where {prefix} and {suffix} come from. It's a completely separate file from config.yml so you can hand it to a co-owner without giving them the rest of the settings.
Everything is controlled by a single mode key, which can be one of three values:
Prefix and suffix are pulled straight from LuckPerms, exactly as LuckPerms itself has them configured. The list below mode in ranks.yml is ignored entirely.
AuricChat still asks LuckPerms for the player's primary group, but looks up the prefix/suffix from your own list below instead of from LuckPerms directly — useful when you want AuricChat's chat prefixes to look different from LuckPerms' own tab-list or nametag prefixes.
LuckPerms isn't touched at all. Each key in the list below becomes a permission, auricchat.rank.<key> — the first one the player has wins.
View example — ranks.yml
mode: 'luckperms' owner: prefix: '<gradient:#ff5100:#ffce00><b>[Owner]</b></gradient> ' suffix: '' staff: prefix: '<gold>[Staff]</gold> ' suffix: ''
Order matters in 'permissions' mode. Ranks are checked top to bottom, and the first key the player has auricchat.rank.<key> for wins — so put your highest rank first, same idea as weight in a permissions plugin.
Testing a rank without switching it live
/auricchat preview <rank> [message] renders the chat format using that rank's prefix/suffix, without needing to actually hold the permission or LuckPerms group yourself. Tab completion suggests every valid key for the current mode.
Deep dive
Moderation Toolkit
Five independent tools that can be mixed and matched — none of them are punishments, they only affect what actually reaches other players. Combine them with a real punishment plugin for anything that needs to leave a mark on a player's record.
config.yml is the permanent baseline. /chatslow is a temporary, admin-toggled layer on top for busy moments — whichever of the two is currently stricter for a given player is the one that applies.
auricchat.bypass.chatmute. Give it a duration for a timed mute, or nothing at all for a permanent one you lift manually with /chatmute off.
Bypassing the toolkit
Three permissions let specific players skip parts of this — none of them are granted by default:
Skips duplicate check, allowed-pattern, anti-caps and anti-swear all at once.
Ignores both message-cooldown and any active /chatslow.
Keeps chatting normally even while /chatmute is active.
All three bypass permissions default to op. Most public-facing ranks should never need them — they exist for staff who need to communicate during an active mute or slow mode, not as a reward tier.
Integration
Placeholders
AuricChat registers the same five values twice — once as a PlaceholderAPI expansion, once as a native MiniPlaceholders expansion — so you can use whichever your other plugins already expect, or both at once.
MiniPlaceholders: <auricchat_name>
The player's nickname if set, otherwise their real username.
MiniPlaceholders: <auricchat_player>
Always the real Minecraft username, ignoring any nickname.
MiniPlaceholders: <auricchat_hasname>
Resolves to true or false — whether the player currently has a nickname set.
MiniPlaceholders: <auricchat_prefix>
The player's rank prefix, resolved through whichever ranks.yml mode is active.
MiniPlaceholders: <auricchat_suffix>
The player's rank suffix, same resolution as the prefix above.
View example — using AuricChat placeholders elsewhere
PlaceholderAPI syntax (TAB menus, scoreboards, other plugins): %auricchat_name% %auricchat_prefix% MiniPlaceholders syntax (native Adventure tag, no string parsing): <auricchat_name> <auricchat_prefix>
Both expansions are detected automatically — nothing to enable in config.yml. If you install PlaceholderAPI or MiniPlaceholders after AuricChat has already started, running /auricchat reload picks them up without a restart.