Frostyh Plugins

Plugins / Nameplates

Nameplates

Multi-line nametags on display entities: rows, conditions, animations, LuckPerms, PlaceholderAPI.

Get Nameplates

$7.99 on BuiltByBit, list price on 16 October 2026. BuiltByBit sales can lower it, the listing shows the current price.

Buy on BuiltByBit

Also in Complete Collection: Every Plugin, Server Polish Bundle.

Try it live

Nameplates runs on a public demo server, set up so you can use it yourself. Join, try it, then decide.

Address: try.zeropvp.xyz:25570 (Java Edition 1.21.11)

In Minecraft: Multiplayer, Add Server, paste the address, Join. Type /demo go nameplates to land at its booth, or right-click the compass and pick it. The world resets every night.

Overview

Nameplates

Stack as many lines above a player's head as you want, each with its own text and condition

Vanilla gives you one line above a player's head, and a scoreboard team gives you a prefix on it. Nameplates gives you as many lines as you want, each one its own object with its own text, size, background, animation and the condition that decides whether it appears at all.

Built on Minecraft's own text display entities, so there is no packet library, no resource pack and nothing to break on the next update.

Stacked rows above each player: rank, level, health, name.

Latest version
1.2.0
Server
Paper or Purpur, Java 21
BuiltByBit
Nameplates on BuiltByBit
What changed in 1.2.0
  • Fixed: LuckPerms prefixes, suffixes and group names written with & or § colour codes (including &#rrggbb hex) showed the codes as text above the head. They are now drawn in colour, and a bold or coloured prefix no longer spills onto the name after it. PlaceholderAPI values with colour codes are converted the same way.
  • Plates now go away while a player is invisible (potion), in spectator mode, or vanished by a vanish plugin (EssentialsX, SuperVanish, PremiumVanish and others that mark vanished players). Before, the plate floated on and gave the player away.
  • Sneaking players get a faint plate that does not show through walls, like the vanilla name. hide.sneaking can be dim, hide or none.
  • All of these are in the new hide: block in config.yml and on the Layout screen of /nameplates.
  • /plate is now remembered across relogs and restarts (stored in hidden-players.txt).
  • New permission nameplates.toggle (default: everyone) for /plate.
  • An existing config.yml does not get the hide: block written into it, but the new defaults apply anyway. Add the block by hand, or use the Layout screen, to change them.

Features

Why server owners pick it

What makes it different

Works with

What you get

Every player gets their own rows, filled in live.

How a row looks in the config

Each row is one line of config, switched on or off here.

rows:
  name:
    text: "{prefix}<white>{player}</white>{suffix}"
    scale: 1.0
    background: "#40000000"
  health:
    text: "<red>H</red> <white>{health}</white><gray>/{maxhealth}</gray>"
    scale: 0.7
    condition: "{health} < 20"      only while hurt
  rank:
    text: "<gradient:#ffd166:#ff7f50><bold>{groupname}</bold></gradient>"
    permission: "nameplates.row.rank"
    animate: pulse

Conditions understand >, <, >=, <=, ==, !=, contains and startswith, on placeholders or plain text.

The editor

The editor: rows, layout, preview your own plate, rebuild.

FAQ

Which servers does it run on?

Paper or Purpur 1.21.11 or a newer 1.21.x, with Java 21.

Do I need other plugins?

No. LuckPerms and PlaceholderAPI are supported if you have them.

Is there DRM or a licence key?

No. There is nothing to activate and no licence server to reach, and the code is not obfuscated.

How long does setup take?

Drop the jar into /plugins and restart. The setup guide above has 3 short steps.

Can I try it before I buy?

Yes. This page has a test server with the plugin installed.

Where do I get help?

In the active support Discord, in the discussion tab on this page, or in the documentation.

Do vanished players give themselves away with their plate?

No. Plates hide for vanished players (EssentialsX, SuperVanish, PremiumVanish and others), for invisibility and in spectator mode.

Updates

Released on September 16, 2026 and updated 5 times since. The latest version is v1.3.0 (October 16, 2026). Every update is free, new Minecraft versions included.

Also by Frostyh

If this plugin helps your server, a short review on this page would mean a lot. Thank you!

Installation

Requirements

Server software
Paper, or a Paper fork such as Purpur. Spigot and CraftBukkit are not supported: the plugin uses Paper-only APIs.
Minecraft version
plugin.yml api-version 1.21; built against Paper API 1.21.11
Java
21 or newer
Required plugins
none
Optional plugins
PlaceholderAPI, LuckPerms

Steps

  1. Download Nameplates.jar from BuiltByBit. There is no licence key to enter.
  2. Stop the server and put the jar into the plugins folder.
  3. Start the server. The plugin creates plugins/Nameplates/config.yml with the defaults shown under Configuration.
  4. Edit config.yml to suit your server.
  5. Apply the changes with /nameplates reload (Reload the config and rebuild every plate), or restart the server.

Setup guide

  1. Drop Nameplates.jar into /plugins and restart. The default config already shows a name row, a health row and a rank row.
  2. Edit the rows to your ranks and stats, then /nameplates reload.
  3. Use /nameplates preview to check the text without walking around.

SMP: name with the LuckPerms prefix, a health row that only appears when someone is hurt, a clan tag row driven by a placeholder.

RPG: a level row, a class row behind a permission, and a boss title that pulses.

PvP: a kill-streak row that only shows past three kills, and a rank row for donors.

Commands

From plugin.yml. "Not set" in the permission column means plugin.yml attaches no permission to the command itself; the nodes the plugin checks are listed under Permissions.

CommandAliasesUsageDescriptionPermission
/nameplates/np/nameplates reload|refresh|rows|previewNameplates admin.not set
/platenone/plateHide or show your own nameplate.not set

Subcommands in detail

/plate                 Hide or show your own nameplate.
/nameplates reload     Reload the config and rebuild every plate.
/nameplates refresh    Rebuild every plate without reloading.
/nameplates rows       List the loaded rows.
/nameplates preview    Print your own rows in chat, for tuning text.

Permissions

From plugin.yml.

NodeDefaultDescriptionChildren
nameplates.adminoperatorsReload and refresh.none
nameplates.toggleeveryoneUse /plate to hide or show your own nameplate.none
nameplates.exemptnobody until grantedNever gets a nameplate.none
nameplates.row.rankeveryoneShows the rank row from the default config.none

The store page also describes these groups and patterns:

Placeholders

This plugin registers no PlaceholderAPI placeholders.

With PlaceholderAPI installed, it fills in placeholders from other plugins inside its own text.

Configuration reference

The default files as they ship in the jar, with their comments. The plugin writes them to plugins/Nameplates/ on first start.

config.yml

Top-level keys:

KeyDefaultComment above it
menutruebare /nameplates opens the editor instead of printing the help
update-ticks10how often the text is refreshed (20 = once a second)
base-height0.25how high the first row sits above the head
line-height0.28spacing between rows
mount-offset0none
view-range0.5how far away plates are visible (1.0 is about 64 blocks)
hide-vanilla-nametagtruenone
hidesection, 4 keysWhen a plate is taken down, so it never gives away a player who is meant to be hidden.
rowssection, 3 keysnone
themesection, 11 keysEvery message below is written against these names, not against hex codes: <accent>Open</accent> rather than <#4ad0c8>Open</#4ad0c8>. Change a colour here and it changes on every screen at once. Ordinary MiniMessage still works, so <gradient:#a:#b> and...
messagessection, 75 keysnone
review-remindertrueOne thank-you line with the BuiltByBit review link: once in the console after install and once in chat for the first operator who joins. It never repeats and sends nothing anywhere. false turns it off.
plugins/Nameplates/config.yml
# Nameplates - stacked nametags on display entities.
#
# Every row below is one line above the player's head, listed bottom to top. A row shows only when
# its permission and its condition both pass, so one config covers every rank.
#
# Text supports MiniMessage, {player} {world} {health} {maxhealth} {ping} {level},
# LuckPerms {prefix} {suffix} {group} {groupname}, and any PlaceholderAPI placeholder.

menu: true                # bare /nameplates opens the editor instead of printing the help
update-ticks: 10          # how often the text is refreshed (20 = once a second)
base-height: 0.25         # how high the first row sits above the head
line-height: 0.28         # spacing between rows
mount-offset: 0.0
view-range: 0.5           # how far away plates are visible (1.0 is about 64 blocks)
hide-vanilla-nametag: true

# When a plate is taken down, so it never gives away a player who is meant to be hidden.
hide:
  invisible: true         # while under an invisibility potion
  spectator: true         # while in spectator mode
  vanished: true          # while a vanish plugin hides them (EssentialsX, SuperVanish, PremiumVanish...)
  # While sneaking: dim (faint and not through walls, like the vanilla name), hide, or none.
  sneaking: dim

rows:
  name:
    enabled: true                   # a row can be switched off here or in the editor
    text: "{prefix}<white>{player}</white>{suffix}"
    scale: 1.0
    background: "#40000000"
    see-through: false
    shadow: false
    animate: none

  health:
    text: "<red>❤</red> <white>{health}</white><gray>/{maxhealth}</gray>"
    scale: 0.7
    gap: 0.02
    background: "#30000000"
    condition: "{health} < 20"      # only shows when they are hurt
    animate: none

  rank:
    text: "<gradient:#ffd166:#ff7f50><bold>{groupname}</bold></gradient>"
    scale: 0.8
    gap: 0.04
    background: none
    permission: "nameplates.row.rank"
    animate: pulse
    speed: 1.0

# ------------------------------------------------------------------------------------------------
# THEME
# ------------------------------------------------------------------------------------------------
# Every message below is written against these names, not against hex codes: <accent>Open</accent>
# rather than <#4ad0c8>Open</#4ad0c8>. Change a colour here and it changes on every screen at
# once. Ordinary MiniMessage still works, so <gradient:#a:#b> and <#ff0000> are fine anywhere.
theme:
  accent: "#4ad0c8"     # your colour: headings and anything the player is meant to click
  accent2: "#9be5e1"    # a lighter accent, for a second level of emphasis
  title: "#f4f7ff"      # screen titles
  text: "#c2ccdd"       # ordinary prose
  muted: "#6b7a94"      # hints, separators, anything the eye should skip
  value: "#ffffff"      # the numbers and names the player opened the screen to read
  good: "#57e08a"
  warn: "#ffc857"
  bad: "#ff6b6b"
  small-caps: false     # ᴇхᴀᴍᴘʟᴇ - a garnish; whole menus in it read badly
  # Real Minecraft item pictures beside the buttons and in the chest screens. Drawn from the
  # client's own textures, so there is nothing to install and no resource pack: it needs a
  # 1.21.9 or newer client, and older ones simply see the buttons as words.
  item-icons: true

messages:
  prefix: "<accent><bold>Plates</bold></accent> <muted>»</muted> "
  no-permission: "<bad>You cannot do that.</bad>"
  players-only: "<text>Players only.</text>"
  help: "<text>/nameplates reload · refresh · rows · preview  ·  /plate to hide your own</text>"
  reloaded: "<value>Reloaded {rows} row(s).</value>"
  refreshed: "<value>Every nameplate rebuilt.</value>"
  rows: "<text>Rows: </text><value>{list}</value>"
  own-hidden: "<text>Your nameplate is hidden.</text>"
  own-shown: "<text>Your nameplate is back.</text>"

  # The editor. Every line here is a screen title, a button label or a tooltip.
  menu-title: "<value>Nameplates</value>"
  menu-close: "<white><icon:close></white><text>Close</text>"
  menu-back: "<white><icon:back></white><text>Back</text>"
  menu-back-tip: "<text>Back to the screen before.</text>"
  menu-everyone: "everyone"
  menu-always: "always"
  menu-home-rows: "<text>Rows: </text><value>{on} on</value><text> of {count}</text>"
  menu-home-layout: "<text>Base {base} · line {line} · refresh every {ticks} ticks</text>"
  menu-rows: "<white><icon:layout></white><accent>Rows</accent>"
  menu-rows-tip: "<text>The lines above the head, bottom to top.</text>"
  menu-rows-title: "<value>Rows</value>"
  menu-rows-empty: "<text>No rows in the config.</text>"
  menu-row-line: "<text> - </text><value>{row}</value><text>: {text}</text>"
  menu-row-open-tip: "<text>Open the row {row}.</text>"
  menu-row-title: "<value>Row: {row}</value>"
  menu-row-preview: "<text>Text: </text>{text}"
  menu-row-facts: "<text>Scale {scale} · gap {gap} · {animate} · {permission} · {condition}</text>"
  menu-row-field-text: "<text>Text of this row</text>"
  menu-row-field-permission: "<text>Permission, empty for everyone</text>"
  menu-row-save: "<white><icon:yes></white><good>Save text and permission</good>"
  menu-row-save-tip: "<text>Write both fields to config.yml and rebuild the plates.</text>"
  menu-row-enabled: "<white><icon:yes></white>Row on"
  menu-row-enabled-tip: "<text>A row that is off never shows.</text>"
  menu-row-scale: "<white><icon:layout></white>Scale"
  menu-row-scale-tip: "<text>How big the line is.</text>"
  menu-row-gap: "<white><icon:layout></white>Gap"
  menu-row-gap-tip: "<text>Extra space above the row below.</text>"
  menu-row-animate: "<white><icon:fire></white><value>Animation: </value><accent>{animate}</accent>"
  menu-row-animate-tip: "<text>none, bob, pulse, wiggle, rainbow.</text>"
  menu-row-shadow: "<white><icon:layout></white>Shadow"
  menu-row-shadow-tip: "<text>Drop shadow behind the text.</text>"
  menu-row-see-through: "<white><icon:layout></white>See through walls"
  menu-row-see-through-tip: "<text>Show the row even behind blocks.</text>"
  menu-layout: "<white><icon:layout></white><accent>Layout</accent>"
  menu-layout-tip: "<text>Height, spacing and view range.</text>"
  menu-layout-title: "<value>Layout</value>"
  menu-layout-intro: "<text>Where the stack sits and how far away it can be seen.</text>"
  menu-layout-base: "<white><icon:layout></white>Height"
  menu-layout-base-tip: "<text>How high the first row sits above the head.</text>"
  menu-layout-line: "<white><icon:layout></white>Line spacing"
  menu-layout-line-tip: "<text>Distance between two rows.</text>"
  menu-layout-range: "<white><icon:layout></white>View range"
  menu-layout-range-tip: "<text>1.0 is about 64 blocks.</text>"
  menu-layout-vanilla: "<white><icon:layout></white>Hide vanilla nametag"
  menu-layout-vanilla-tip: "<text>Hide the plain name Minecraft draws itself.</text>"
  # The hide: switches on the layout screen.
  menu-hide-invisible: "Hide when invisible"
  menu-hide-invisible-tip: "<text>Take the plate down under an invisibility potion.</text>"
  menu-hide-spectator: "Hide in spectator"
  menu-hide-spectator-tip: "<text>Take the plate down in spectator mode.</text>"
  menu-hide-vanished: "Hide when vanished"
  menu-hide-vanished-tip: "<text>Take the plate down while a vanish plugin hides the player.</text>"
  menu-hide-sneaking: "<white><icon:layout></white><value>Sneaking: </value><accent>{mode}</accent>"
  menu-hide-sneaking-tip: "<text>none, dim (faint, not through walls) or hide.</text>"
  menu-preview: "<white><icon:layout></white><value>Preview mine</value>"
  menu-preview-tip: "<text>Print your own rows in chat.</text>"
  menu-mine-shown: "<good>■</good> <value>My plate is showing</value>"
  menu-mine-hidden: "<muted>■</muted> <text>My plate is hidden</text>"
  menu-mine-tip: "<text>Hide or show your own nameplate.</text>"
  menu-refresh: "<white><icon:reload></white><text>Rebuild all plates</text>"
  menu-refresh-tip: "<text>Tear every plate down and build it again.</text>"
  menu-reload: "<white><icon:reload></white><text>Reload config</text>"
  menu-reload-tip: "<text>Read config.yml again.</text>"
  switch-on: "<white><icon:yes></white><good><bold>ON</bold></good>  <value>{title}</value>"
  switch-off: "<white><icon:no></white><bad><bold>OFF</bold></bad> <text>{title}</text>"
  step-up: "<value>{title} +</value> <muted>({value})</muted>"
  step-down: "<value>{title} -</value> <muted>({value})</muted>"

# One thank-you line with the BuiltByBit review link: once in the console after install and once
# in chat for the first operator who joins. It never repeats and sends nothing anywhere. false turns it off.
review-reminder: true

Config guide

The annotated summary from the store page. Where it and the default file above differ, the file is what the plugin ships.

update-ticks: 10       how often text is refreshed (20 = once a second)
base-height: 0.25      how high the first row sits
line-height: 0.28      spacing between rows
view-range: 0.5        1.0 is about 64 blocks
hide-vanilla-nametag: true
rows: ...              your lines

Text placeholders: {player} {world} {health} {maxhealth} {ping} {level} {prefix} {suffix} {group} {groupname}, plus every PlaceholderAPI placeholder.

FAQ

Which servers and versions does it run on?

It needs Paper or a Paper fork such as Purpur, because it uses Paper-only APIs (the dialog API for its menus, Adventure text components). Spigot and CraftBukkit are not supported. plugin.yml declares api-version 1.21, the jar is built against Paper API 1.21.11, and it needs Java 21 or newer.

Does it need other plugins?

No other plugin is required (plugin.yml has no hard dependencies). Optional: PlaceholderAPI, LuckPerms (plugin.yml softdepend), used when present.

How do I apply config changes?

Edit plugins/Nameplates/config.yml and run /nameplates reload (reload the config and rebuild every plate). A restart works too.

Does it run on Folia, or for Bedrock players?

Not tested on Folia, and plugin.yml does not declare folia-supported. Bedrock players (through Geyser) have not been tested either.

What licence do I get?

The licence terms are the BuiltByBit EULA shown on the listing. There is no licence key to enter, and the plugin never contacts a licence server.