Compatibility
Minecraft: Java Edition
Platforms
Tags
Creators
Details
Dialogs+
Build fully custom in-game menus using Minecraft's native Dialog system. No resource packs, no client mods, zero installs required for your players.
Dialogs+ lets you create interactive menus, sub-menus, and forms entirely through simple YAML config files, or build them in-game with the built-in editor. It is powered by the vanilla Dialog UI introduced in Minecraft 1.21.6 (Paper API since 1.21.7). Every player who joins your server sees these menus with nothing extra installed, because it's all built on top of what Paper already ships.
Features
- YAML menus: one file per menu, loaded from
plugins/DialogsPlus/menus/ - In-game editor (
/dialogsplus edit): create, edit, preview and delete menus, components and actions without touching YAML - Multiple input types: text fields, toggles, number sliders, and single-choice options
- Chainable actions per button: run a command (as the player or as console), send a message, close the dialog, or jump to a sub-menu, all in sequence
{input}substitution: feed a player's typed input straight into a command, e.g. a teleport-request button that runs/tpa {target}- Permission-gated buttons and menus: hide specific buttons from players who don't have the right permission, or lock a whole menu
- Item preview icons: show an item (or a specific player's head, or the clicking player's own head) alongside a button
- Instant link and command-suggestion buttons:
OPEN_URLandSUGGEST_COMMANDactions fire natively when used on their own - PlaceholderAPI support: use placeholders in titles, body text, button labels and tooltips (optional)
- Import and export: share individual menus as
.ymlfiles - Custom commands: map any command (e.g.
/menu) straight to a menu inconfig.yml - Live reload: update your menus with
/dialogsplus reload, no restart needed
Requirements
- Paper 1.21.11+ (or a Paper fork built on it)
- Java 25
- (Optional) PlaceholderAPI, if you want placeholders in titles, body text and tooltips
Why so few versions? If I find a big bug, I will probably delete the old version containing it, so people can't download it and run into problems that have already been fixed.
Quick start
- Drop the jar into your
plugins/folder and start the server. - Run
/dialogsplus editand click + New menu, or add your own.ymlfile toplugins/DialogsPlus/menus/. - Open your menu with
/dialogs <menu-id>.
Example menu (plugins/DialogsPlus/menus/main.yml):
id: main
title: "Main Menu"
body:
- "Welcome! Choose an option below."
components:
- id: homes
label: "Homes"
icon: GRASS_BLOCK
type: BUTTON
actions:
- type: CLOSE
- type: RUN_COMMAND
command: "homes"
Commands
| Command | Description |
|---|---|
/dialogs <menu-id> |
Opens the given menu for the player running it |
/dialogsplus reload |
Reloads all menu files from disk |
/dialogsplus export <menu-id> |
Copies a menu file into plugins/DialogsPlus/exports/ |
/dialogsplus import <file> |
Copies a file from plugins/DialogsPlus/imports/ into menus/ and reloads |
/dialogsplus edit |
Opens the in-game menu editor (players only) |
/dialogsplus edit <menu-id> |
Opens the editor directly on one menu |
Plus any custom commands you've mapped in config.yml (see Command mapping).
Permissions
| Permission | Description |
|---|---|
dialogsplus.edit |
Use the in-game editor (default: op) |
Reload, export and import use the reload permission set in config.yml.
Warning: treat
dialogsplus.editlike console access. Anyone who has it can createRUN_COMMAND_AS_CONSOLEactions. Give it to trusted admins only.
First run
On first startup, Dialogs+ creates:
plugins/DialogsPlus/
menus/ <- put your menu .yml files here
exports/ <- menus you've exported land here
imports/ <- drop a menu file here before importing it
backups/ <- created by the editor
config.yml <- plugin settings, command mapping, messages
README.txt <- the readme, auto-copied here once
The menus folder starts empty. Create your first menu in-game with /dialogsplus edit, or add menu files by hand and run /dialogsplus reload.
Note:
README.txtis only copied on first run. After updating the plugin, deleteplugins/DialogsPlus/README.txtand restart to get the newest copy.
In-game editor
Run /dialogsplus edit to open the editor. It is built from the same native Dialog system as your menus, so it needs no extra mods, ports or web server.
From the menu list you can:
- Create a new menu ("+ New menu": an ID and a title; it starts with one Close button, because a dialog needs at least one button)
- Open any menu to edit it
- Delete a menu (with confirmation)
Inside a menu you can edit:
- Settings: title, external title, permission, can-close-with-escape
- Body text: one line per message
- Components: add, edit, reorder (Move up / Move down) and delete, for all 5 types (
BUTTON,TEXT_INPUT,BOOLEAN_INPUT,NUMBER_INPUT,SINGLE_OPTION_INPUT) - Actions on buttons: add, edit, reorder and delete, for all 7 action types
- Preview: opens the real menu. Its buttons really run their actions!
Every change is saved to the menu's YAML file immediately. There is no separate "apply" step and you don't need to run /dialogsplus reload.
Backups and things to know:
- Saving rewrites the whole YAML file, so comments in your file are lost. The first time the editor saves a menu, your original file is copied to
plugins/DialogsPlus/backups/<id>.original.yml - Deleting a menu keeps a copy in
backups/<id>.deleted.yml - Don't run
/dialogsplus reloadwhile someone is in the middle of editing. Reload replaces the loaded menus, and the open editor would then save stale data. - Not editable in-game yet: renaming a menu ID, changing a component's type (delete and re-add it instead), and the
commands:section ofconfig.yml.
Command mapping
You can map any custom command straight to a menu, so players don't need to know a menu's id at all. Set this in plugins/DialogsPlus/config.yml:
commands:
main: "/menu"
tpa-menu: "/teleport"
Typing /menu then behaves exactly like /dialogs main.
Important: changes to the
commandssection require a full server restart to take effect, unlike menu.ymlfiles, which/dialogsplus reloadpicks up live.
Configuration reference
Menu files
Each .yml file in plugins/DialogsPlus/menus/ is loaded as one menu on startup or on /dialogsplus reload. The menu's id field is what you reference it by (e.g. in /dialogs <id> or an OPEN_MENU action). Menus created in the editor are saved as menus/<id>.yml.
Menu-level fields
id: main # required. Unique id, used in /dialogs <id>
title: "Main Menu" # required. Shown at the top of the dialog
external-title: "Server Menu" # optional. Used if this menu is opened as a
# button/link from elsewhere
can-close-with-escape: true # optional, default true
permission: "dialogsplus.staff" # optional. Whole menu is locked unless
# the player has this permission
body: # optional. Lines of plain text
- "Welcome!"
- "Choose an option below."
components: # required. See Components below
- ...
A menu needs at least one BUTTON component, otherwise it can't be opened.
Components
Each entry in components is either a BUTTON or an input field.
BUTTON
- id: homes # required, unique within this menu
label: "Homes" # required. Text shown on the button
tooltip: "View your homes" # optional. Hover text
icon: GRASS_BLOCK # optional. See Icons below
permission: "homes.use" # optional. Button is hidden if the player
# lacks this permission
type: BUTTON
actions: # required. Run in order, see Actions below
- ...
TEXT_INPUT
- id: target
label: "Player Name"
type: TEXT_INPUT
BOOLEAN_INPUT
- id: confirm
label: "I agree"
type: BOOLEAN_INPUT
NUMBER_INPUT
- id: amount
label: "Amount"
type: NUMBER_INPUT
min: 0
max: 100
step: 1 # optional
initial: 0 # optional
SINGLE_OPTION_INPUT
- id: choice
label: "Pick one"
type: SINGLE_OPTION_INPUT
options:
- "Option A"
- "Option B"
Note: component ids may use letters, numbers,
-and_(max 64 characters).
Icons
icon: GRASS_BLOCK # any vanilla Material name
icon: player_head:Notch # a specific player's head by name
icon: "player_head:{self}" # the CLICKING player's own head (dynamic)
Permissions (menus)
Two levels of permission gating are supported:
- Per-menu: set
permission:at the top level of a menu.ymlfile to lock the whole menu. A player without it gets theno-permissionmessage fromconfig.ymlinstead of the dialog opening. - Per-button: set
permission:on aBUTTONcomponent to hide just that button from players who lack it. The rest of the menu still opens normally.
PlaceholderAPI support
If PlaceholderAPI is installed, placeholders are replaced in:
- Menu title and external-title
- Body text lines
- Button labels
- Button tooltips
title: "Welcome, %player_name%"
body:
- "Your balance: %vault_eco_balance%"
If PlaceholderAPI is not installed, these fields are shown as plain text with the placeholder syntax left in (nothing breaks, it just won't resolve).
Actions
Each button's actions list runs in order when the button is clicked.
| Action | What it does |
|---|---|
RUN_COMMAND |
Runs a command as the clicking player |
RUN_COMMAND_AS_CONSOLE |
Runs a command as console |
CLOSE |
Closes the current dialog |
SEND_MESSAGE |
Sends a plain chat message |
OPEN_MENU |
Opens another menu by id (sub-menu navigation) |
OPEN_URL |
Opens a link |
SUGGEST_COMMAND |
Pre-fills the player's chat bar with a command |
- type: RUN_COMMAND
command: "homes" # no leading slash
- type: RUN_COMMAND_AS_CONSOLE
command: "give {player} diamond 1"
- type: CLOSE
- type: SEND_MESSAGE
message: "Request sent!"
- type: OPEN_MENU
target: tpa-menu
- type: OPEN_URL
url: "https://example.com"
- type: SUGGEST_COMMAND
command: "msg SomePlayer "
Note:
OPEN_URLandSUGGEST_COMMANDonly fire instantly if they are the only action on that button. If chained with other actions, the player instead gets a clickable chat message.
In the editor, a leading / on RUN_COMMAND / RUN_COMMAND_AS_CONSOLE is removed automatically, and OPEN_URL must start with http:// or https://.
{id} substitution
A RUN_COMMAND / RUN_COMMAND_AS_CONSOLE / SEND_MESSAGE / OPEN_URL / SUGGEST_COMMAND value can reference another component's input value in the same menu using {that-component-id}:
components:
- id: target
label: "Player Name"
type: TEXT_INPUT
- id: send
label: "Send Request"
type: BUTTON
actions:
- type: CLOSE
- type: RUN_COMMAND
command: "tpa {target}"
Import and export
Export a menu to share it with someone else or back it up:
/dialogsplus export <menu-id>
-> copies plugins/DialogsPlus/menus/<menu-id>.yml into
plugins/DialogsPlus/exports/<menu-id>.yml
Import a menu someone shared with you:
- Place their
.ymlfile intoplugins/DialogsPlus/imports/ - Run
/dialogsplus import <filename.yml> - It is copied into
menus/and the menus reload automatically
Full working example
plugins/DialogsPlus/menus/main.yml:
id: main
title: "Main Menu"
body:
- "Welcome! Choose an option below."
components:
- id: homes
label: "Homes"
icon: GRASS_BLOCK
tooltip: "View your homes"
type: BUTTON
actions:
- type: CLOSE
- type: RUN_COMMAND
command: "homes"
- id: tpa
label: "Teleport Request"
type: BUTTON
actions:
- type: OPEN_MENU
target: tpa-menu
plugins/DialogsPlus/menus/tpa-menu.yml:
id: tpa-menu
title: "Teleport Request"
components:
- id: target
label: "Player Name"
type: TEXT_INPUT
- id: send
label: "Send Request"
type: BUTTON
actions:
- type: CLOSE
- type: RUN_COMMAND
command: "tpa {target}"
- id: back
label: "Back"
type: BUTTON
actions:
- type: OPEN_MENU
target: main
Roadmap
- Currently no ideas for the roadmap, but more stuff is coming soon


