Plugins / HotbarDialogs
HotbarDialogs
Hotbar items that open real dialog menus. Items, menus and buttons all in one config file.
Get HotbarDialogs
$4.99 on BuiltByBit, list price on 16 October 2026. BuiltByBit sales can lower it, the listing shows the current price.
Also in Complete Collection: Every Plugin, SMP Starter Bundle, Server Polish Bundle.
Try it live
HotbarDialogs 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 hotbardialogs to land at its booth, or right-click the compass and pick it. The world resets every night.
Overview
HotbarDialogs
Turn hotbar items into real Minecraft menus instead of chests full of glass panes
Since 1.21.6 Minecraft has real dialog screens: a title, text, buttons with tooltips, laid out by the client. HotbarDialogs puts them on your hotbar. A compass opens a server selector, a head opens the profile, an emerald opens the shop, and every one of them is a proper screen rather than a chest full of renamed glass panes.
Everything is in one config file: which items sit where, what they look like, which menu they open, what each button does. No chest GUI code, no resource pack, no placeholder items.
A hotbar item opens a native dialog menu over the lobby.
- Latest version
- 1.1.0
- Server
- Paper or Purpur, Java 21
- BuiltByBit
- HotbarDialogs on BuiltByBit
What changed in 1.1.0
- New: forms. A menu can now have inputs: text fields, a choice list, an on/off toggle and a number slider. Buttons use {input:<key>} in their actions for what the player entered, so a "report a player" or "apply for staff" menu runs your command with the player's answers. A field can be required, and a text field can have a pattern it must match (for example a valid player name). The new example menu "report" shows how; the comment at the top of config.yml lists every option.
- Typed text is safe to use: it is inserted after PlaceholderAPI has run (so a typed %placeholder% is not expanded), it cannot contain line breaks, and in message: actions it cannot add colours or click events.
- New action: server:<name> sends the player to another server of your BungeeCord or Velocity network. Use it instead of player:/server <name>, which runs on the game server and never reaches the proxy.
- New: a config check on start and on /hotbardialogs reload. The console names every mistake and where it is: a menu: action pointing at a menu that does not exist, a misspelt material, a slot outside the hotbar, two items on one slot, an unknown action, an input key Minecraft cannot use, a bad pattern, an {input:key} the menu does not have. /hotbardialogs reload also says in chat whether problems were found.
- Fixed: a menu or item you deleted from config.yml could still open or be given from the example config inside the jar. Only what is in your config.yml is used now.
- Your existing config.yml is not changed. The example menus in a new install use server: instead of player:/server, and the profile menu has a "Report a player" button. To get the new example report menu, copy it from a fresh config.yml (delete or rename yours once, start, and copy the menu back over).
Features
Why server owners pick it
- Real dialog screens: titles, text and buttons with tooltips
- Server selector, profile, shop: whatever your lobby needs
- One config file, no code and no resource pack
- PlaceholderAPI in your menu text
- No chest GUI tricks to break on updates
What makes it different
- Uses Minecraft's own dialog screens instead of chest menus filled with renamed glass panes
- Menus can be forms: text fields, choice lists, toggles and sliders whose answers the buttons use
- On start and on reload the console names every config mistake and where it is
The hotbar item itself, with its name and lore from config.
Works with
- Paper or Purpur 1.21.11 (or newer 1.21.x), Java 21+. Dialogs need clients on 1.21.6 or newer.
- PlaceholderAPI optional
- No DRM, no licence key and no licence server; the code is not obfuscated
What you get
- New in v1.2.0: Forms: menus can have text fields, choice lists, toggles and sliders, and buttons use the answers, for report or staff application menus
- New in v1.2.0: Network support: the server:<name> action sends players to another server on your BungeeCord or Velocity network
- New in v1.2.0: Config check: on start and on reload the console names every mistake and where it is
- Hotbar items defined in config: slot, material, name, lore, glow, custom model data, permission
- Menus defined in config: title, body lines, buttons with label and tooltip, column count, button width, close label
- One small action language for items and buttons: open a menu, run a command as the player, run a command from console, send a message, play a sound, close. Several actions in a row are fine.
- Buttons can require a permission and either hide or show as locked
- {player}, {world}, {online} and every PlaceholderAPI placeholder in any text
- Given on join, respawn and world change; only in the worlds you list, removed elsewhere
- Locked: items cannot be moved, dropped, swapped to the offhand or lost on death
- Left-click and right-click can do different things
- /menu <id> opens any menu from a command, so other plugins, NPCs and signs can open them too
- MiniMessage everywhere; every message, title and label editable; reload without restart
A second menu with placeholders filled in for the viewer.
Buttons carry their own hover text.
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. PlaceholderAPI is supported if you have it.
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 4 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.
Does the server selector work on a BungeeCord or Velocity network?
Yes. Use the server:<name> action on a button and the player is sent through the proxy.
Updates
Released on September 15, 2026 and updated 4 times since. The latest version is v1.2.0 (October 16, 2026). Every update is free, new Minecraft versions included.
Also by Frostyh
- Holograms: floating text and boards
- Nameplates: stacked custom nametags
- Alias: nicknames with the matching skin
- Complete Collection: all my published plugins in one purchase, 40% off
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
Steps
- Download
HotbarDialogs.jarfrom BuiltByBit. There is no licence key to enter. - Stop the server and put the jar into the
pluginsfolder. - Start the server. The plugin creates
plugins/HotbarDialogs/config.ymlwith the defaults shown under Configuration. - Edit
config.ymlto suit your server. - Apply the changes with
/hotbardialogs reload(Reload config and re-give the hotbar to everybody), or restart the server.
Setup guide
- Drop HotbarDialogs.jar into /plugins and restart. The default config already has a navigator, profile, shop and spawn item so you can see it working.
- Set worlds to your lobby world(s).
- Change the commands in the example menus to yours (server:<name> for network servers, mv tp, warps, whatever you use).
- /hotbardialogs reload. Everybody in the lobby gets the new hotbar immediately.
Networks and lobbies: a server selector with one button per server, a cosmetics menu, a "report a player" menu that runs your report command.
Duel / FFA servers: a mode picker on the compass, a kit or settings menu on another slot; buttons run your existing commands.
SMP: a spawn hotbar with warps, rules, the store link and a "vote" menu; remove it in the survival world by listing only the spawn world.
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.
| Command | Aliases | Usage | Description | Permission |
|---|---|---|---|---|
/menu | /menus, /dialog | /menu <id> [player] | Open a dialog menu. | not set |
/hotbardialogs | /hbd | /hotbardialogs reload|give|clear|list | Manage the hotbar and menus. | hotbardialogs.admin |
Subcommands in detail
/menu <id> Open a menu.
/menu <id> <player> (admin) Open a menu for somebody else (NPC plugins, command blocks).
/hotbardialogs reload (admin) Reload config and re-give the hotbar to everybody.
/hotbardialogs give [player] (admin) Give the hotbar.
/hotbardialogs clear [player] (admin) Remove the hotbar items.
/hotbardialogs list (admin) Items and menus that are loaded.
Permissions
From plugin.yml.
| Node | Default | Description | Children |
|---|---|---|---|
hotbardialogs.admin | operators | Reload, give and clear hotbars, open menus for others. | none |
The store page also describes these groups and patterns:
<your own nodes>: set per item (items.<id>.permission) and per button (buttons[].permission)
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/HotbarDialogs/ on first start.
config.yml
Top-level keys:
| Key | Default | Comment above it |
|---|---|---|
worlds | [lobby, world] | Worlds where the hotbar is given. Empty list = every world. |
give | section, 3 keys | none |
lock | true | menu items cannot be moved, dropped or swapped |
select-slot | true | put the player's hand on selected-slot after giving the items |
selected-slot | 0 | none |
click-cooldown-ms | 250 | none |
open-sound | "ui.button.click:0.6:1" | none |
close-label | "Close" | none |
locked-label | "<gray>{label}</gray>" | none |
locked-tooltip | "<red>You do not have access to this.</red>" | none |
items | section, 4 keys | none |
menus | section, 4 keys | none |
theme | section, 11 keys | Every message below is written against these names, not against hex codes: <accent>Open</accent> rather than <#ff8a5c>Open</#ff8a5c>. Change a colour here and it changes on every screen at once. Ordinary MiniMessage still works, so <gradient:#a:#b> and... |
messages | section, 14 keys | none |
review-reminder | true | 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. |
# HotbarDialogs - hotbar items that open native Minecraft dialogs (1.21.6+).
#
# items: what sits in the hotbar and what a click does.
# menus: the dialog screens. Buttons use the same actions as items.
#
# Actions:
# menu:<id> open a menu from this file
# player:/command run a command as the player ({player} works)
# console:command {player} run a command from console
# message:<green>text</green> send a MiniMessage line
# sound:entity.experience_orb.pickup:1:1.4 play a sound (name:volume:pitch)
# server:lobby send the player to another server of your BungeeCord or Velocity
# network. Use this, not player:/server lobby: /server is a proxy
# command, and a command run by the plugin never reaches the proxy.
# close close the dialog
# One action goes in "action:", several go in "actions: [a, b, c]" and run in order.
# Text supports MiniMessage, {player}, {world}, {online} and PlaceholderAPI placeholders.
#
# Forms: a menu can have inputs: (see the "report" menu below). Its buttons then use
# {input:<key>} in their actions for what the player entered. Input types:
# text a text field. max-length, width, initial, required: true, pattern: (a regex the
# text must match, e.g. "[A-Za-z0-9_]{3,16}" for a player name)
# choice a list to pick from. options: ["value:Shown text", ...], initial: <value>
# toggle on or off, gives true or false. initial: true|false
# number a slider. min, max, step, initial, width
# Keys are lowercase letters, digits and _, and "id" is reserved. Be careful with console:
# actions that use typed text: give text inputs a pattern so nobody can add extra arguments.
# The console checks this file on start and on /hotbardialogs reload and names every mistake.
# Worlds where the hotbar is given. Empty list = every world.
worlds:
- lobby
- world
give:
on-join: true
on-respawn: true
on-world-change: true
lock: true # menu items cannot be moved, dropped or swapped
select-slot: true # put the player's hand on selected-slot after giving the items
selected-slot: 0
click-cooldown-ms: 250
open-sound: "ui.button.click:0.6:1"
close-label: "Close"
locked-label: "<gray>{label}</gray>"
locked-tooltip: "<red>You do not have access to this.</red>"
items:
navigator:
slot: 0
material: COMPASS
name: "<#ff7f50><bold>Navigator</bold></#ff7f50>"
lore:
- "<gray>Right-click to pick a game.</gray>"
action: "menu:games"
profile:
slot: 4
material: PLAYER_HEAD
name: "<#ff7f50><bold>Profile</bold></#ff7f50>"
lore:
- "<gray>Your settings and stats.</gray>"
action: "menu:profile"
shop:
slot: 7
material: EMERALD
name: "<#ff7f50><bold>Shop</bold></#ff7f50>"
lore:
- "<gray>Ranks and cosmetics.</gray>"
action: "menu:shop"
lobby:
slot: 8
material: NETHER_STAR
name: "<#ff7f50><bold>Back to spawn</bold></#ff7f50>"
lore:
- "<gray>Teleports you to spawn.</gray>"
actions:
- "player:/spawn"
- "sound:entity.enderman.teleport:0.8:1.2"
menus:
games:
title: "<#ff7f50><bold>Play</bold></#ff7f50>"
body:
- "<gray>Hey <white>{player}</white>, pick a mode.</gray>"
- "<gray><white>{online}</white> players online.</gray>"
columns: 2
button-width: 150
buttons:
- label: "<white>Survival</white>"
tooltip: "<gray>The main SMP world.</gray>"
action: "console:mv tp {player} survival"
- label: "<white>FFA</white>"
tooltip: "<gray>Free for all, no teams.</gray>"
action: "server:ffa"
- label: "<white>Duels</white>"
tooltip: "<gray>1v1 with kits.</gray>"
action: "server:duels"
- label: "<white>Creative</white>"
tooltip: "<gray>Plots and building.</gray>"
permission: "rank.vip"
show-locked: true
action: "server:creative"
profile:
title: "<#ff7f50><bold>Profile</bold></#ff7f50>"
body:
- "<gray>Name: <white>{player}</white></gray>"
- "<gray>World: <white>{world}</white></gray>"
columns: 1
buttons:
- label: "<white>Settings</white>"
action: "player:/settings"
- label: "<white>Stats</white>"
action: "player:/stats"
- label: "<white>Report a player</white>"
action: "menu:report"
- label: "<white>Back</white>"
action: "menu:games"
# A form: the player fills in the fields, the button uses what they entered.
report:
title: "<#ff7f50><bold>Report a player</bold></#ff7f50>"
body:
- "<gray>Staff read every report.</gray>"
columns: 1
inputs:
- key: target
type: text
label: "<white>Player name</white>"
max-length: 16
required: true
pattern: "[A-Za-z0-9_]{3,16}"
- key: reason
type: choice
label: "<white>Reason</white>"
options:
- "cheating:Cheating"
- "chat:Chat abuse"
- "griefing:Griefing"
- "other:Something else"
# The report goes to players with the "staff" tag (/tag <name> add staff). Swap the console:
# line for your own report or ticket command if you have one.
buttons:
- label: "<white>Send report</white>"
tooltip: "<gray>Sends the report to online staff.</gray>"
actions:
- "console:tellraw @a[tag=staff] {\"text\":\"[Report] {player} reported {input:target} for {input:reason}\",\"color\":\"red\"}"
- "message:<green>Thanks, your report about {input:target} was sent.</green>"
- "close"
shop:
title: "<#ff7f50><bold>Shop</bold></#ff7f50>"
body:
- "<gray>Ranks, cosmetics and more on the website.</gray>"
columns: 1
buttons:
- label: "<white>Open store link in chat</white>"
actions:
- "message:<#ff7f50>Store:</#ff7f50> <white><click:open_url:'https://store.example.com'>store.example.com</click></white>"
- "close"
# ------------------------------------------------------------------------------------------------
# THEME
# ------------------------------------------------------------------------------------------------
# Every message below is written against these names, not against hex codes: <accent>Open</accent>
# rather than <#ff8a5c>Open</#ff8a5c>. 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: "#ff8a5c" # your colour: headings and anything the player is meant to click
accent2: "#ffbfa5" # 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: "<#ff7f50><bold>Menu</bold></#ff7f50> <muted>»</muted> "
no-permission: "<bad>You cannot do that.</bad>"
unknown-menu: "<bad>No menu called </bad><value>{menu}</value><bad>.</bad>"
unknown-player: "<bad>Unknown player: </bad><value>{name}</value>"
usage-menu: "<text>/menu <id> [player] · menus: </text><value>{menus}</value>"
admin-help: "<text>/hotbardialogs reload · give [player] · clear [player] · list</text>"
reloaded: "<value>Reloaded: {items} item(s), {menus} menu(s).</value>"
gave: "<text>Hotbar given to </text><value>{player}</value><text>.</text>"
cleared: "<text>Hotbar cleared for </text><value>{player}</value><text>.</text>"
list: "<text>Items: </text><value>{items}</value><text> · Menus: </text><value>{menus}</value>"
# After /hotbardialogs reload: what the config check found.
config-ok: "<good>config.yml checked: no problems.</good>"
config-problems: "<warn>{count} problem(s) in config.yml.</warn><text> The console lists each one and where it is.</text>"
# Forms: a required field left empty, or a text that does not match its pattern.
input-required: "<bad>Fill in </bad><value>{field}</value><bad> first.</bad>"
input-invalid: "<bad>That is not a valid </bad><value>{field}</value><bad>.</bad>"
# 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: trueConfig guide
The annotated summary from the store page. Where it and the default file above differ, the file is what the plugin ships.
worlds: [lobby] where the hotbar exists; empty = every world
give: { on-join: true, on-respawn: true, on-world-change: true }
lock: true items cannot be moved or dropped
open-sound: "ui.button.click:0.6:1"
items:
navigator:
slot: 0
material: COMPASS
name: "<#ff7f50><bold>Navigator</bold></#ff7f50>"
lore: ["<gray>Right-click to pick a game.</gray>"]
action: "menu:games"
menus:
games:
title: "<#ff7f50><bold>Play</bold></#ff7f50>"
body:
- "<gray>Hey <white>{player}</white>, pick a mode.</gray>"
columns: 2
buttons:
- label: "<white>Survival</white>"
tooltip: "<gray>The main world.</gray>"
action: "console:mv tp {player} survival"
- label: "<white>Creative</white>"
permission: "rank.vip"
show-locked: true
action: "server:creative"
Actions:
menu:<id> open another menu
player:/command run as the player
server:<name> send the player to another server of your network
console:command {player} run from console
message:<green>Hi</green> send a line (MiniMessage, click events allowed)
sound:name:volume:pitch play a sound
close close the dialog
Use action: for one, actions: [a, b, c] for several. Items also accept left-action / left-actions for the left mouse button.
Differences between this summary and the shipped files (an example in the summary may use values of its own):
worlds: the summary shows[lobby], the default file has[lobby, world].
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 (plugin.yml softdepend), used when present.
How do I apply config changes?
Edit plugins/HotbarDialogs/config.yml and run /hotbardialogs reload (reload config and re-give the hotbar to everybody). 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.
Links
- BuiltByBit: HotbarDialogs
- Support Discord: discord.gg/KG4ubAZEuw
- All plugins on BuiltByBit: the collection
- More plugins: all plugins
- Custom work: commissions
Support
Questions, bugs or ideas: the active support Discord or the discussion tab on this page. When something breaks, include your server version and the error from the console.
Full setup guide, commands, permissions and config reference: documentation.