// documentation

Server branding

Turn a server name and vibe into a cohesive brand kit, with every piece emitted in the format the target plugin actually parses.

What it does

The server-branding skill turns a server name and vibe into a cohesive brand kit, then emits each piece in the format the target plugin actually parses. It is pure knowledge: it writes copy and color, and defers exact config keys to learn-plugin-docs and rank tracks to permissions-helper.

Brand kit pieces

  • Identity: 3 to 5 name ideas (skip if named), a tagline, a one-line pitch, and a palette of 4 to 6 hex swatches plus one MiniMessage gradient that uses them.
  • MOTD: a 2-line server-list message, emitted in the right format per the matrix.
  • Rank ladder: themed rank names, prefixes matched to the chat formatter, and a per-rank perk line, ready to hand off as LuckPerms tracks.
  • Store copy: package names, short descriptions, and a tier structure, kept compliant.
  • Discord: category, channel, and role layout, a welcome message, and a short rules template.
  • In-game text: a scoreboard or TAB layout sketch, plus join, leave, broadcast, vote, and crate lines, with kit and crate names that match the tone.

How it engages

  • Reads the server profile at skills/_cache/server-profile.json if it exists, using gamemode for tone defaults and chatFormatter to choose MiniMessage vs legacy. Without a profile it asks only for the name, vibe, gamemode, and which MOTD/chat plugins are in use.
  • Picks a tone and keeps naming, punctuation, emoji use, and palette consistent across every piece.
  • Hands the rank ladder to permissions-helper for the LuckPerms tracks and meta.
  • Fetches unfamiliar plugin keys with learn-plugin-docs first, then cites real keys. It never invents config keys, permission nodes, or version numbers.

Format-target matrix

The most common branding mistake is assuming MiniMessage works everywhere. It does not. Emit the format each target actually parses. When you are unsure which plugin the user runs, give both a MiniMessage and a legacy & + &#RRGGBB version.

TargetFormat to emitKey caveat
Velocity motdMiniMessagealso accepts §/JSON; gradients OK
MiniMOTDMiniMessagetwo lines are separate line1/line2 keys, not \n
ServerListPluslegacy & + &#RRGGBBNOT MiniMessage
vanilla server.propertieslegacy § onlyno &, no MiniMessage, no native gradient; 59 chars or fewer per line; 2 lines unreliable, use MiniMOTD or a proxy
TAB (tablist, scoreboard, nametag)MiniMessagealso &/hex; can mix MM and legacy
EssentialsX chatlegacy &/§ + &#RRGGBB by defaultMiniMessage only if the string is prefixed MM|| (EssentialsX 2.21.0+)
LuckPerms prefix/suffixmatch the chat formatterLP stores raw text and renders nothing itself; MiniMessage only with a MM-aware formatter, else store legacy &
DecentHologramslegacy only + its own &#RRGGBBno MiniMessage
DeluxeMenus (name, lore, title)legacy + hex by defaultMiniMessage only with per-item modern_use_minimessage: true

Decision rule

  • Read chatFormatter from the server profile.
  • If the formatter is MiniMessage-aware (FancyChat, HuskChat, LPC-MiniMessage, TAB, MiniMOTD, Velocity), emit MiniMessage.
  • Otherwise, emit legacy & + &#RRGGBB.
  • For the MOTD and rank prefix, always also provide the other format so it works regardless.
Note. Gradients are not native to legacy. Emulate them by emitting one &#RRGGBB run per character with the format helper described below.

MiniMessage cheatsheet

MiniMessage is parsed by Kyori Adventure (bundled in Paper and Velocity), and a plugin must deserialize it. Vanilla and non-Adventure plugins never render these tags; they show literally. Build MiniMessage strings only from the validated tag set, never invent tags.

Colors

  • 16 named colors, for example <gold>, <aqua>, <dark_gray>, <light_purple>.
  • Hex via <#RRGGBB> or verbose <color:#RRGGBB> (and <color:red>).
  • Shadow on 1.21.4+ clients: <shadow:#RRGGBB> with optional alpha.

Gradient and rainbow

  • <gradient:#a:#b>text</gradient> with 2+ stops; optional phase is the last numeric arg, range -1 to 1.
  • <rainbow>text</rainbow>; reversed <rainbow:!>; with phase <rainbow:0.5>.
  • <transition:#a:#b:phase> samples a single solid color along a to b at the given phase.

Decorations and structure

  • <bold> (alias <b>), <italic>, <underlined>, <strikethrough>, <obfuscated>. Negate with <!bold> or <bold:false>.
  • <reset> clears all formatting. Close any tag with </tag> or self-close with <tag/>. New line via <newline> or <br>.

Hover and click (lossy to legacy)

  • <hover:show_text:'...'>text</hover> (also show_item, show_entity).
  • <click:ACTION:'value'>text</click> where ACTION is run_command, suggest_command, open_url, copy_to_clipboard, change_page, or open_file.
  • These interactivity tags have no legacy equivalent and are dropped when converting to legacy.

Validated examples

Tone presets

Pick one tone and keep it consistent across every piece of server text. Each preset fixes voice, rank-name style, and a palette leaning. Six presets ship; adapt them to the actual server name.

cozy-smp

Warm, welcoming, lowercase-friendly. Ranks like Guest to Member to Friend to Elder to Patron. Palette leans greens, warm browns, and soft gold.

hardcore-anarchy

Blunt and terse, no hand-holding. Earned ranks like Survivor, Veteran, Warlord (not bought). Palette leans blood red, ash, and black.

competitive-pvp

Sharp, energetic, stat- and rank-driven. Ranks like Bronze to Diamond to Champion, or Recruit to Pro to Legend. Palette leans electric blue, cyan, sharp white.

kid-friendly

Bright, simple, encouraging, with friendly emoji and positive framing. Ranks like Explorer to Hero to Star (no skulls or weapons). Palette leans rainbow-bright primaries.

premium-clean

Minimal, confident, understated, almost no emoji. Clean tiers like Member to Premium to Elite to Founder. Palette leans charcoal, off-white, and a single accent gold or teal.

meme-edgy

Irreverent, internet-native, self-aware. Ranks like Peasant to Sweat to Goblin King to Certified Menace. Palette leans lime, magenta, and black.

Note. Re-use the chosen palette for the MOTD gradient, rank prefixes, and scoreboard accents so the whole brand reads as one piece. Keep the name's capitalization consistent everywhere.

The format helper

The scripts/format.mjs helper converts between MiniMessage and legacy color formatting, so branding output can target plugins that do not parse MiniMessage. It expands a MiniMessage gradient or rainbow to per-character legacy &#RRGGBB runs, and naively converts legacy back to MiniMessage. It is pure JS with no dependencies on stock Node 18 or newer.

  • --to-legacy expands gradients and rainbow to per-character &#RRGGBB, and maps named and hex colors and decorations to legacy codes.
  • --to-mm converts legacy back to MiniMessage. This direction is naive: tags are opened but not closed, so review the result.
  • --preview prints a sanity check (gradient stops, sampled colors, hex and named tags). The terminal cannot render colors.
Note. Conversion is lossy. Hover, click, and other interactivity tags have no legacy equivalent and are dropped with a warning when converting to legacy.

Guardrails

  • Never invent plugin config keys, permission nodes, or version numbers. Emit color and copy here, fetch real keys with learn-plugin-docs, and build LuckPerms with permissions-helper.
  • Match the format to the plugin. A MiniMessage MOTD pasted into server.properties shows raw tags, and legacy & in a vanilla MOTD shows literally. Use the matrix every time.
  • Keep store and EULA copy compliant. Flag pay-to-win or gameplay-affecting perks, and do not write them unprompted.
  • Confirm before writing files or calling any outward or image-gen service. A logo or banner image is rendered only when the user asks and a tool is available; keep it opt-in, never automatic.