Frostyh Plugins

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.

Buy on BuiltByBit

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

What makes it different

The hotbar item itself, with its name and lore from config.

Works with

What you get

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

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

  1. Download HotbarDialogs.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/HotbarDialogs/config.yml with the defaults shown under Configuration.
  4. Edit config.yml to suit your server.
  5. Apply the changes with /hotbardialogs reload (Reload config and re-give the hotbar to everybody), or restart the server.

Setup guide

  1. 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.
  2. Set worlds to your lobby world(s).
  3. Change the commands in the example menus to yours (server:<name> for network servers, mv tp, warps, whatever you use).
  4. /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.

CommandAliasesUsageDescriptionPermission
/menu/menus, /dialog/menu <id> [player]Open a dialog menu.not set
/hotbardialogs/hbd/hotbardialogs reload|give|clear|listManage 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.

NodeDefaultDescriptionChildren
hotbardialogs.adminoperatorsReload, give and clear hotbars, open menus for others.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/HotbarDialogs/ on first start.

config.yml

Top-level keys:

KeyDefaultComment above it
worlds[lobby, world]Worlds where the hotbar is given. Empty list = every world.
givesection, 3 keysnone
locktruemenu items cannot be moved, dropped or swapped
select-slottrueput the player's hand on selected-slot after giving the items
selected-slot0none
click-cooldown-ms250none
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
itemssection, 4 keysnone
menussection, 4 keysnone
themesection, 11 keysEvery 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...
messagessection, 14 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/HotbarDialogs/config.yml
# 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: 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.

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):

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.