Advanced Formatting
Shadow color, transition, pride, and raw MiniMessage tags for admins building channel formats — not everyday chat syntax.
Everything on this page is aimed at whoever edits channels.yml — not the
average player typing in chat. These tags either need a permission most
players won't have, or are awkward enough that they only really make sense
baked into a config format string. For the syntax players actually use day to
day, see MineDown & MiniMessage Formatting.
Permission-gated like everything else
Config-baked channels.yml formats always render, regardless of
permission — these gates only apply to what a player types. See the
Permissions page for the full list.
Shadow color
Colors the drop shadow behind the text separately from the text itself
(requires a 1.21.4+ client; older clients just ignore it). Gated by
chat.colored, same as any other color:
<shadow:#000000>Text with a black shadow</shadow>
<shadow:yellow:0.5>Text with a half-transparent yellow shadow</shadow>Also available as a MineDown arg:
[Text](shadow:#000000)Transition & pride
Two more color-family tags, also gated by chat.colored, MiniMessage-only
(no MineDown shortcut):
<transition:red:blue:green>Multi-color transition</transition>
<pride:trans>Pride flag gradient</pride>transition is not a per-character gradient
Unlike <gradient>, it picks one solid color for the whole span, chosen
from the color list by the trailing phase argument (-1 to 1, defaults
to 0). <transition:red:blue:green:0>text</transition> renders text
entirely red — every phase value is a single flat color, not a blend across
the text. The visual "transition" only shows up if something re-sends the
message with a different phase each time (a scoreboard/bossbar/actionbar
on a repeating task, for example) — a one-off chat message will always look
like a solid color. For a static multi-color effect in chat, use gradient
or rainbow instead.
Cosmetic tags — chat.cosmetic
These generate their own content rather than decorating existing text, so there's no MineDown equivalent. No server-state risk, but still stripped from player-typed chat without the permission:
<key:key.jump> # Shows the player's bound key for an action
<insert:some text>Click to insert</insert> # Shift-click inserts "some text" into the chat box
<font:uniform>Text in the uniform font</font>
<lang:block.minecraft.diamond_block> # Translatable text (aliases: tr, translate)
<lang_or:some.missing.key:Fallback text> # With a fallback if the key doesn't exist (aliases: tr_or, translate_or)
<head:8667ba71-b85a-4004-af54-457a9734eed7> # Renders a player head (name, UUID, or texture path)
<head:entity/player/wide/steve:false> # Texture path form, hat layer off
<sprite:blocks:block/stone> # Renders a texture atlas sprite`<head>` and `<sprite>` need Adventure 4.25.0+
Paper only started bundling that on 1.21.10 (1.21.9 shipped a snapshot build; 1.21.8 and earlier are on Adventure 4.24.0 and don't have these tags at all). On an older server the tag isn't invalid syntax — MiniMessage just doesn't recognize it and passes it through as literal text, permission or not. There's no workaround short of updating the server.
Data tags — chat.advanced (OP-only by default)
These read live server state and can leak information to whoever reads the message — entity/block NBT, scoreboard values, nearby entities — the same reason vanilla restricts raw JSON text components like these to permission level 2+.
OP-only by default
chat.advanced isn't declared in plugin.yml, so like chat.reload/chat.update
it's OP-only until a permission plugin grants it deliberately — think twice
before handing it to regular staff.
<selector:@e[limit=5]> # Lists matching entities (alias: sel)
<score:PlayerName:objective> # A scoreboard value
<nbt:entity:'@s':Health> # NBT data from an entity/block/storage (alias: data)Resolved against the message sender, needs Paper 1.21.4+
These three read live server state and (per Adventure's own docs) are
"rendered serverside" against "platform-defined context" — a resolution
step SlateChat does for you (via Paper's PaperComponents.resolveWithContext,
using the sender as both the command context and the @s/scoreboard
subject) before the message goes out. That API only exists from Paper
1.21.4 onward; on an older server the resolve step is silently skipped and
these tags fall back to showing their raw pattern (e.g. @e[limit=5])
instead of resolved names.
