Skip to main content

What is MiniMessage?

MiniMessage is a modern text formatting system for Minecraft that replaces legacy color codes with a powerful, tag-based syntax. Unlike traditional &c color codes, MiniMessage supports:
  • Gradients and smooth color transitions
  • Hex colors for precise color matching
  • Interactive elements (hover text, click events)
  • Font changes and text decorations
  • Clean, readable syntax
Runway brings MiniMessage support to any plugin by intercepting and processing packets at the protocol level, meaning you can use MiniMessage formatting in plugins that don’t natively support it.

What can be formatted?

Runway can format messages from any plugin across these game elements:

Chat messages

System messages and plugin notifications

Titles & subtitles

Screen titles and subtitle text

Items

Item names and lore text

Inventory menus

Menu titles and item descriptions

Tab list

Player list header and footer

Scoreboards

Team prefixes and suffixes
Each element can be individually enabled or disabled in the config:
config.yml
listeners:
  system-messages: true
  tablist: true
  titles: true
  scoreboards: false
  inventory:
    title: true
    items: true
  items: true

The [mm] prefix

By default, Runway requires the [mm] prefix to identify text that should be formatted with MiniMessage. This prefix can appear anywhere in the text and is removed during processing.
broadcast: "[mm]<gradient:red:blue>Welcome to the server!</gradient>"

How the prefix works

Here’s the actual implementation from ProcessHandler.java:66-82:
ProcessHandler.java
boolean requirePrefixMM = config.getOrDefault("require-prefix.minimessage", true);

if (requirePrefixMM && !s.contains("[mm]")) {
    if (s.contains("§")) return Component.text(s);
    else return miniMessage.deserialize(s);
}

if (s.contains("§")) {
    if (ignoreLegacy) {
        s = s.replace("§", "&");
    } else {
        config.set("ignore-legacy", true);
        Bukkit.getLogger().log(Level.WARNING, "Detected Legacy colors! Runway is now ignoring legacy colors.");
    }
}

s = s.replace("[mm]", "");
s = s.replace("\\<", "<");
The prefix is checked first, then removed before processing. You can disable the prefix requirement in config:
config.yml
require-prefix:
  minimessage: false  # Format ALL text with MiniMessage
Disabling the prefix means all plugin messages will be processed as MiniMessage. This may cause issues with plugins that use < and > characters literally.

MiniMessage syntax examples

Basic colors

[mm]<red>Error:</red> <gray>Could not find player

Hex colors

[mm]<#FF5733>Custom color text

Gradients

[mm]<gradient:red:blue>This text fades from red to blue</gradient>

Rainbow text

[mm]<rainbow>Animated rainbow text!</rainbow>
Rainbow text cycles through all colors automatically. It works great for titles and special announcements.

Text decorations

[mm]<bold>Bold text
[mm]<italic>Italic text
[mm]<underlined>Underlined text
[mm]<strikethrough>Strikethrough text

Hover events

[mm]<hover:show_text:'<green>This is tooltip text!'>Hover over me</hover>
[mm]<hover:show_text:'Line 1<newline>Line 2<newline>Line 3'>Hover me</hover>

Click events

[mm]<click:run_command:/help>Click for help</click>

Combined effects

[mm]<gradient:gold:yellow><bold><hover:show_text:'<green>Click to teleport!'><click:run_command:/spawn>Teleport to spawn</click></hover></bold></gradient>
This creates clickable, hoverable text with a gradient effect.

Before & after examples

Chat plugin messages

prefix: "&8[&cServer&8]&7"
message: "&aPlayer &f%player% &ajoined the game!"

Economy plugin messages

balance: "&eBalance: &f$%balance%"
insufficient-funds: "&cYou don't have enough money!"

Quest plugin items

name: "&6&lQuest Item"
lore:
  - "&7Rarity: &aUncommon"
  - "&7Click to start quest"

Escaping MiniMessage tags

If you need to display literal < or > characters, escape them:
[mm]Use \<tag\> for formatting
The ProcessHandler automatically handles escaped tags (line 82):
ProcessHandler.java
s = s.replace("\\<", "<");

Disabling italics in items

By default, Minecraft italicizes item names and lore. Runway automatically adds <italic:false> to prevent this:
ProcessHandler.java
boolean disableItalics = config.getOrDefault("disable-italics", true);
if (disableItalics) s = noItalics + s;
You can disable this behavior in config:
config.yml
disable-italics: false

Legacy color code handling

If Runway detects legacy color codes (§), it can automatically convert them to & to prevent conflicts:
config.yml
ignore-legacy: true
When legacy colors are detected, Runway will log a warning and automatically enable ignore-legacy to prevent formatting issues.

Next steps

Placeholder integration

Combine MiniMessage with PlaceholderAPI

Action bar messages

Send formatted messages to action bar

Build docs developers (and LLMs) love