What players may type
Channel formats are yours; the message body is not. Everything a player writes goes
through a permission gate before it is parsed, configured in
modules/minimessage-tags.yml.
Regular players cannot use any formatting until you grant it. Tags they may not use
are shown as plain text or removed, depending on unauthorized-mode.
unauthorized-mode
Section titled “unauthorized-mode”| Mode | What happens to a disallowed tag |
|---|---|
escape |
it stays visible as literal text, e.g. <red> |
strip |
it is removed from the message |
Both modes hold up when a plugin reads chat text again after Voxen — Nexo, Oraxen and
ItemsAdder all do. A tag such a plugin renders is handed to it in a form it will not touch,
so escape cannot be undone into a working tag.
Colors and formatting
Section titled “Colors and formatting”| Permission | What it unlocks |
|---|---|
voxen.chat.tag.color |
named colors: <red>, <gold>, <color:red> |
voxen.chat.tag.hex |
hex colors: <#ff0000>, <color:#ff0000> |
voxen.chat.tag.gradient |
<gradient:...> |
voxen.chat.tag.rainbow |
<rainbow> |
voxen.chat.tag.transition |
<transition:...> |
voxen.chat.tag.pride |
<pride> flag gradients |
voxen.chat.tag.keybind |
<key:...> client keybind names |
voxen.chat.tag.font |
<font:...>, disabled by default, needs a resource pack |
voxen.chat.tag.newline |
<newline>, disabled by default, fake message risk |
voxen.chat.tag.bold |
<bold> |
voxen.chat.tag.italic |
<italic> |
voxen.chat.tag.underlined |
<underlined> |
voxen.chat.tag.strikethrough |
<strikethrough> |
voxen.chat.tag.obfuscated |
<obfuscated> |
voxen.chat.tag.hover |
<hover:...> |
voxen.chat.tag.click |
<click:...>, each action also has its own node |
voxen.chat.tag.insertion |
<insertion:...> |
voxen.chat.tag.shadow |
<shadow:#RRGGBB> |
voxen.chat.tag.sprite |
<sprite:...> item and mob icons, needs MiniMessage 5+ |
voxen.chat.tag.head |
<head:...> player heads, needs MiniMessage 5+ |
voxen.chat.tag.translatable |
<lang:...>, disabled by default |
voxen.chat.tag.fallback |
<lang_or:...>, disabled by default |
voxen.chat.tag.selector |
<selector:...>, disabled by default |
voxen.chat.tag.score |
<score:...>, disabled by default |
voxen.chat.tag.nbt |
<nbt:...>, disabled by default |
voxen.chat.tag.reset |
<reset> |
voxen.chat.tag.* |
everything above at once |
voxen.chat.legacy.color |
&c style color codes |
voxen.chat.legacy.hex |
&#ff0000 style hex codes |
voxen.chat.legacy.format |
&l, &o style format codes |
voxen.chat.legacy.* |
all legacy codes at once |
<selector>, <score>, <nbt>, <lang> and <lang_or> are disabled in the config by
default: they read server-side data or let a player imitate another message. Enable them
in modules/minimessage-tags.yml only for ranks you trust.
Legacy codes need legacy.enabled: true in modules/minimessage-tags.yml on top of the
permission.
Gating single arguments
Section titled “Gating single arguments”The base node allows every argument of a tag. Base node plus the arguments, with :
replaced by ., allows exactly one combination:
voxen.chat.tag.gradient.red.blueThat player can write <gradient:red:blue> and nothing else.
The same nodes work as denials. Setting one to false in LuckPerms blocks that use
even for someone holding the base node:
voxen.chat.tag.color.red: falseFor colors this covers both spellings, <color:red> and <red>.
If one message contains both a permitted and an unpermitted use of the same tag, that tag stays unparsed for the whole message.
Placeholders in messages
Section titled “Placeholders in messages”Players can also be allowed to put placeholders in what they type. These are gated the same way, down to a single placeholder:
| Permission | Effect |
|---|---|
voxen.chat.papi |
parses every %papi% placeholder |
voxen.chat.papi.player_health |
parses only %player_health% |
voxen.chat.miniplaceholders |
parses every MiniPlaceholders tag |
voxen.chat.miniplaceholders.luckperms_prefix |
parses only <luckperms_prefix> |
Colors coming out of a PlaceholderAPI placeholder additionally need the matching
voxen.chat.legacy.* permission, otherwise the codes are left alone.
Per-tag config
Section titled “Per-tag config”Under tags: in modules/minimessage-tags.yml every built-in tag can be disabled, given
a different permission, aliases, and blocked-params — a list of regexes checked against
the tag’s arguments. click additionally takes per-action permissions under actions:.
custom-tags: gates tags rendered by other plugins. Nexo and Oraxen glyphs and shifts
ship configured:
custom-tags: glyph: enabled: true permission: voxen.chat.tag.glyph aliases: - g shift: enabled: true permission: voxen.chat.tag.shiftvoxen.chat.tag.glyph allows every argument, voxen.chat.tag.glyph.smile allows only
<glyph:smile>. Voxen does not render these tags itself, it only decides whether they
survive in the message. List every alias the other plugin accepts — <g:smile> is the
same tag as <glyph:smile> and needs to be named here to be covered.
A tag the other plugin already refused arrives marked as such, and Voxen treats that as a refusal too: it is removed or kept as plain text even for a player who holds the Voxen permission. The stricter of the two answers wins.
Your own tags
Section titled “Your own tags”replacements: is for tags you invent. A player types <xp> and Voxen swaps it for
whatever value says:
replacements: xp: enabled: true value: "<gray>[<gold>%island_xp% XP<gray>]" permission: voxen.chat.tag.xp require-permission: true aliases: [exp] ping: enabled: true value: "<gray>(<green>%player_ping%ms<gray>)" require-permission: falseThe value is MiniMessage and its PlaceholderAPI placeholders are filled in for the player
who typed the tag, so everyone gets their own numbers. Tag names are case insensitive,
<XP> and <xp> are the same tag.
| Key | Effect |
|---|---|
enabled |
turns the tag off without deleting it |
value |
what the tag becomes, MiniMessage plus placeholders |
permission |
who may use it, defaults to voxen.chat.tag.<name> |
require-permission |
false opens the tag to everyone |
aliases |
other names for the same tag |
voxen.chat.tag.* covers every tag at once, and a negated node in LuckPerms
(- voxen.chat.tag.xp) takes a single one back. A player without the permission gets the
tag handled by unauthorized-mode, so it either shows up as plain text or disappears.
Outside chat
Section titled “Outside chat”Other plugins never ask Voxen what <xp> means, so the tag stays raw in a tablist or a
sidebar. The same rules are therefore exposed through both placeholder systems:
| Where | Syntax |
|---|---|
| PlaceholderAPI | %voxen_tag_xp% |
| MiniPlaceholders | <voxen_tag:xp> |
Both go through the same permission check as the chat tag, so a player without the node
gets nothing back. PlaceholderAPI has no way to return a component, so that one is
serialized to legacy § codes; MiniPlaceholders returns the real component.