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
| Dialect | Looks like | Where it survives |
|---|---|---|
| Legacy section | §cHello | Vanilla chat, older plugins |
| Ampersand legacy | &cHello | Config files, many plugins |
| BungeeCord hex | &x&f&f&0&0&0&0 | Proxy 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.