// 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.jsonif it exists, usinggamemodefor tone defaults andchatFormatterto 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-helperfor the LuckPerms tracks and meta. - ▸Fetches unfamiliar plugin keys with
learn-plugin-docsfirst, 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.
| Target | Format to emit | Key caveat |
|---|---|---|
Velocity motd | MiniMessage | also accepts §/JSON; gradients OK |
| MiniMOTD | MiniMessage | two lines are separate line1/line2 keys, not \n |
| ServerListPlus | legacy & + &#RRGGBB | NOT MiniMessage |
vanilla server.properties | legacy § only | no &, no MiniMessage, no native gradient; 59 chars or fewer per line; 2 lines unreliable, use MiniMOTD or a proxy |
| TAB (tablist, scoreboard, nametag) | MiniMessage | also &/hex; can mix MM and legacy |
| EssentialsX chat | legacy &/§ + &#RRGGBB by default | MiniMessage only if the string is prefixed MM|| (EssentialsX 2.21.0+) |
| LuckPerms prefix/suffix | match the chat formatter | LP stores raw text and renders nothing itself; MiniMessage only with a MM-aware formatter, else store legacy & |
| DecentHolograms | legacy only + its own &#RRGGBB | no MiniMessage |
| DeluxeMenus (name, lore, title) | legacy + hex by default | MiniMessage only with per-item modern_use_minimessage: true |
Decision rule
- ▸Read
chatFormatterfrom 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.
&#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>(alsoshow_item,show_entity). - ▸
<click:ACTION:'value'>text</click>where ACTION isrun_command,suggest_command,open_url,copy_to_clipboard,change_page, oropen_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.
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-legacyexpands gradients and rainbow to per-character&#RRGGBB, and maps named and hex colors and decorations to legacy codes. - ▸
--to-mmconverts legacy back to MiniMessage. This direction is naive: tags are opened but not closed, so review the result. - ▸
--previewprints a sanity check (gradient stops, sampled colors, hex and named tags). The terminal cannot render colors.
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 withpermissions-helper. - ▸Match the format to the plugin. A MiniMessage MOTD pasted into
server.propertiesshows 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.