MC Toolkit

Guides / Commands & Data

The same red text breaks on Java and Bedrock

A colour code that renders perfectly in one plugin shows up as literal ampersands in the next. The format is the reason, not the plugin.

A § code and a MiniMessage tag can describe the same colour and still be rejected by the same server. Coloured server text is not one format — it is at least five, and plugins disagree about which they accept.

The five dialects

DialectLooks likeWhere it survives
Legacy section§cHelloVanilla chat, older plugins
Ampersand legacy&cHelloConfig files, many plugins
BungeeCord hex&x&f&f&0&0&0&0Proxy plugins, some chat
MiniMessage<red>Hello</red>Modern Paper plugins
JSON component{"text":"Hello","color":"red"}Vanilla commands, /tellraw

The ampersand form is not a colour code at all until something translates it. Paste &c into a plugin that expects MiniMessage and players read the literal characters.

Legacy codes run out of colours

The section-sign system carries a fixed set of colour letters plus formatting toggles. There is no way to express an arbitrary colour in it. Hex arrived later, and the BungeeCord form encodes it one character at a time — &x followed by six &-prefixed hex digits, which is why it looks so long.

MiniMessage takes #ff0000 directly. JSON takes the same hex as a string value.

Java and Bedrock do not agree

Bedrock uses the section sign too, but its colour set and its handling of formatting resets differ from Java. A string that renders correctly on a Java server can show stray characters on Bedrock clients, and cross-play proxies often translate between the two rather than passing text through. If your server accepts Bedrock players, test the output on both.

The nesting trap

Legacy codes are stateful: a colour code resets formatting, so §l§cBold is red and bold, but §c§lBold is bold red only until the next colour code, which clears the bold. MiniMessage is a tree — <red><bold>text</bold></red> closes cleanly. Converting a nested MiniMessage string to legacy codes loses the structure, because legacy has no closing tag.

Escaping

MiniMessage treats < as syntax. A player named <Steve> breaks any plugin that parses their name as a component. Legacy formats have the same problem with &, which is why many plugins require && or a config flag to escape it.

Write the text once, pick the dialect your plugin actually parses, and copy the exact string from Server Text Studio.

Server Text Studio →

More guides

Browse all →

Looking for more Minecraft tools?

A suite of client-side generators, viewers and converters — all free, all in your browser.