Welcome to the Hangar Open Beta. Please report any issue you encounter on GitHub!
Easy-to-use, flexible GUI library with reusable components for building rich interfaces.
WMenus
A modern, extensible GUI framework for building rich inventory interfaces with minimal boilerplate. Ships with reusable components, dialogs, and pickers, while making custom component development straightforward. All using Vanilla / Paper. No custom resource packs or client-side mods.
Testing releases of the library are being constantly uploaded. You can check them at the Testing Channel. Any recommendations, bug reports and testing results are always welcomed.
To use this library:
- add the jar to the classpath of your project
- add
depend: [WMenus]to plugin.yml - have the jar in the plugins directory of the server
Wojo menus
Showcase

Minimal example
WojoDialog.builder()
.title("Wojo Dialog")
.entries(List.of(
WojoEntry.item("item")
.categories(List.of(
ItemPickerCategory.ARMOR,
ItemPickerCategory.FOOD,
ItemPickerCategory.TOOLS,
ItemPickerCategory.WEAPONS))
.initial(ItemType.DIAMOND_SWORD)
.label("Item")
.title("Select item type")
.tooltip("Choose the item to be given to the player."),
WojoEntry.amount("count")
.start(1)
.end(64)
.step(1)
.initial(16)
.label("Count")
.title("Select item count")
.tooltip("Choose how many items are to be given to the player."),
WojoEntry.duration("cooldown")
.allowNull(true)
.initial(null)
.label("Cooldown")
.title("Select the cooldown period")
.tooltip("Choose the time to wait before making the reward available again.")))
.callback(view -> {
player.sendMessage(Component.join(JoinConfiguration.newlines(),
Component.text("Wojo selection:"),
Component.text("Item: ").append(Component.translatable(view.getItemType("item"))),
Component.text("Count: ").append(Component.text(view.getFloat("count"))),
Component.text("Cooldown: ")
.append(Component.text(String.valueOf(view.getDuration("cooldown"))))));
})
.cancel(() -> player.sendMessage("Wojo picker cancelled."))
.open(player);
Amount picker:

AmountPicker
.builder()
.title("Select amount")
.start(1)
.end(64)
.step(1)
.initial(16)
.callback(amount -> {
player.sendMessage("Selected amount: " + amount);
})
.cancel(() -> {
player.sendMessage("Amount selection cancelled.");
})
.open(player);
World picker:
WorldPicker
.builder()
.title("Select destination world")
.callback(world -> {
player.teleport(world.getSpawnLocation());
player.sendMessage("Teleported to " + world.getName());
})
.open(player);
Dialogs
Confirmation Dialog
Message Dialog
Text Input Dialog
Pickers
Amount Picker
Biome Picker
Block Picker
Difficulty Picker
Dye Color Picker
Enchantment Picker
Entity Picker
Game Mode Picker
Instrument Picker
Item Picker
Mirror Picker
Particle Picker
Rotation Picker
Sound Picker
Duration Picker
Weather Picker
World Picker
Information
Category
Miscellaneous
Published
June 16, 2026
License
LGPL
2Downloads
1Stars
Library
Pages
Members
1Owner