Skip to main content
Runway uses a prefix-based system to control when and how messages are processed. This gives you fine-grained control over which messages get formatted with MiniMessage and which placeholders get resolved.

Available Prefixes

Runway supports three main prefixes that can be included anywhere in your message text:

[mm] - MiniMessage Prefix

Enables MiniMessage formatting for the message. When require-prefix.minimessage is set to true (default), messages must contain [mm] to be processed.
# Example messages with [mm] prefix
[mm]<gradient:red:blue>Welcome to the server!</gradient>
<red>This won't work without the prefix
You have [mm]<gold>5</gold> coins  # Prefix can be anywhere
How it works (ProcessHandler.java:66-69):
  • If require-prefix.minimessage: true and no [mm] is found, the message is not formatted
  • The [mm] prefix is removed before processing (ProcessHandler.java:81)
  • If the message contains legacy color codes (§) and no prefix, it’s returned as plain text
The [mm] prefix can appear anywhere in the message - front, middle, or end. Runway searches the entire string for the prefix.

[p] - Placeholder Prefix

Enables PlaceholderAPI and MiniPlaceholders resolution. When require-prefix.placeholders is set to true (default), placeholder parsing only occurs when [p] is present.
# Example messages with [p] prefix
[mm][p]Welcome %player_name%!
[p]You have <yellow>%vault_eco_balance%</yellow> coins
[mm]Hello <player_name>  # MiniPlaceholders won't work without [p]
How it works (ProcessHandler.java:87-98):
  1. Checks if PlaceholderAPI or MiniPlaceholders is enabled in config
  2. If require-prefix.placeholders: true, looks for [p] in the message
  3. Removes the [p] prefix before processing
  4. Applies PlaceholderAPI placeholders first (if enabled)
  5. Then applies MiniPlaceholders with player context (if enabled)
  6. Falls back to custom placeholders from placeholders.yml
The [p] prefix requires a player context to work. System messages or broadcasts without a target player will only use custom placeholders from placeholders.yml.

[actionbar] - Action Bar Prefix

Redirects system messages to display in the player’s action bar instead of chat. Only works for system messages (plugin messages).
# Example messages with [actionbar] prefix
[mm][actionbar]<green>Quest completed!
[actionbar][mm][p]You earned %vault_eco_balance% coins
How it works (SystemChatListener.java:32-35):
  • Only processes packets of type SYSTEM_CHAT_MESSAGE
  • When [actionbar] is found, the original chat packet is cancelled
  • The message is stripped of [actionbar] and sent via player.sendActionBar()
  • Still processes through the full formatting pipeline (MiniMessage + placeholders)
The action bar prefix only works for system messages sent by plugins. Player chat messages cannot be redirected to the action bar.

Configuration: require-prefix

The require-prefix section in config.yml controls whether prefixes are mandatory:
require-prefix:
  # Is [mm] required for packets to be parsed by MiniMessage? (default: true)
  minimessage: true
  # Is [p] required for packets to be parsed by PlaceholderAPI/MiniPlaceholders? (default: true)
  placeholders: true
  • Only messages with [mm] are formatted with MiniMessage
  • Gives plugins and players explicit control over formatting
  • Prevents unexpected formatting in plain text messages
  • Legacy plugins continue working without modifications

minimessage: false

  • All messages are automatically formatted with MiniMessage
  • No need to add [mm] prefix
  • The [mm] prefix is still recognized but not required
  • Legacy color codes (§) trigger warnings

placeholders: true/false

Follows the same logic as minimessage but for placeholder resolution:
  • true: Requires [p] prefix to parse PlaceholderAPI/MiniPlaceholders
  • false: Automatically parses placeholders in all messages
Setting placeholders: false can impact performance if you have many placeholders, as every message will be processed through PlaceholderAPI/MiniPlaceholders even if it contains no placeholders.

Combining Prefixes

You can combine multiple prefixes in a single message. The order doesn’t matter, but understanding the processing order does:

Processing Order (ProcessHandler.java:56-101)

  1. Check for [mm] prefix requirement
  2. Handle legacy color codes (§)
  3. Remove [mm] prefix
  4. Add italic disable tag if configured
  5. Check for [p] prefix requirement
  6. Remove [p] prefix
  7. Apply PlaceholderAPI placeholders
  8. Apply MiniPlaceholders with player context
  9. Parse MiniMessage tags
  10. Apply custom placeholders from config

Examples

# Message with MiniMessage, placeholders, and action bar
message: "[mm][p][actionbar]<green>Welcome %player_name%!"

# Result: Displays in action bar with:
# - Green color from MiniMessage
# - Player name from PlaceholderAPI
Prefix order doesn’t affect functionality. [mm][p] and [p][mm] produce identical results.

Best Practices

Setting require-prefix.minimessage: true prevents accidental formatting of messages that weren’t intended to use MiniMessage. This is especially important when:
  • Running legacy plugins that might send messages with angle brackets
  • Players can input text that gets broadcasted (chat plugins)
  • You want explicit control over which messages use formatting
# Recommended for most servers
require-prefix:
  minimessage: true
  placeholders: true
Don’t add [p] to every message. Only include it when you’re actually using PlaceholderAPI or MiniPlaceholders:
# ❌ Unnecessary - no placeholders
message: "[mm][p]<red>Error!</red>"

# ✅ Correct - using placeholder
message: "[mm][p]<red>%player_name% died!</red>"

# ✅ Also correct - no [p] needed
message: "[mm]<red>Error!</red>"
This improves performance by skipping unnecessary placeholder resolution.
Use /runway parse to test how your prefixes work together:
/runway parse [p]Welcome %player_name%!
/runway parse <gradient:red:blue>Test</gradient>
Note: /runway parse automatically adds [mm], so you don’t need to include it in your test.
If you’re a plugin developer, document whether your plugin requires prefixes:
# In your plugin's config example:
messages:
  welcome: "[mm][p]<gradient:green:blue>Welcome %player_name%!</gradient>"
  # Note: Requires Runway with [mm] and [p] prefixes enabled
Action bar messages are temporary and can be overwritten by other plugins. Best used for:
  • Quick notifications (quest updates, achievement unlocks)
  • Temporary status displays (health, position)
  • Non-critical information that shouldn’t clutter chat
Avoid for:
  • Important warnings or errors
  • Messages that need to be read carefully
  • Information players might want to reference later

Troubleshooting

Symptoms: Tags like <red> appear as plain textSolutions:
  1. Check if require-prefix.minimessage: true - if so, add [mm] to your message
  2. Verify the message is being sent through a supported listener (check config.yml listeners section)
  3. Test with /runway parse <red>test</red> to confirm Runway is working
Symptoms: Placeholders like %player_name% display literallySolutions:
  1. Verify PlaceholderAPI or MiniPlaceholders is installed and loaded
  2. Enable the hook in config: placeholder-hook.placeholderapi: true
  3. Add [p] prefix if require-prefix.placeholders: true
  4. Confirm the placeholder exists: /papi parse me %player_name%
  5. Check that the message has a player context (some system messages don’t)
Symptoms: Message appears in chat instead of action barSolutions:
  1. Confirm the message is a system message (plugin-sent), not a player chat message
  2. Check listeners.system-messages: true in config.yml
  3. Verify [actionbar] prefix is included in the message
  4. Some plugins send messages through different packet types - action bar only works with SYSTEM_CHAT_MESSAGE packets
Symptoms: Messages with § codes don’t show colorsSolution: This is intentional. Runway converts § to & to prevent conflicts (ProcessHandler.java:73). Update your messages to use MiniMessage format:
# ❌ Old format (won't work):
message: "§cError message"

# ✅ New format:
message: "[mm]<red>Error message</red>"

Technical Reference

For developers interested in the implementation details:
  • Prefix checking: ProcessHandler.java:66 (mm), ProcessHandler.java:87 (p)
  • Prefix removal: ProcessHandler.java:81 (mm), ProcessHandler.java:91 (p), SystemChatListener.java:33 (actionbar)
  • Action bar logic: SystemChatListener.java:32-35
  • Config loading: config.yml:1-5
  • Processing pipeline: ProcessHandler.java:56-101

Build docs developers (and LLMs) love