Skip to content

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.

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.

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.

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.blue

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

For 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.

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.

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:

plugins/Voxen/modules/minimessage-tags.yml
custom-tags:
glyph:
enabled: true
permission: voxen.chat.tag.glyph
aliases:
- g
shift:
enabled: true
permission: voxen.chat.tag.shift

voxen.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.

replacements: is for tags you invent. A player types <xp> and Voxen swaps it for whatever value says:

plugins/Voxen/modules/minimessage-tags.yml
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: false

The 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.

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.