Deepslate Studios
SlateChat

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>

pride's flag argument

Can be any of: pride, progress, trans, bi, pan, nb, lesbian, ace, agender, demisexual, genderqueer, genderfluid, intersex, aro, baker, philly, queer, gay, bigender, demigender, femboy, or intersex inclusive.

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.

Always render in their own real colors

Regardless of any color active around them (a channel's own color, a sender's /chatcolor, etc.) — SlateChat neutralizes color and decorations around every <head>/<sprite> before it reaches the client, so the texture is never tinted.

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.

On this page