Welcome to the Hangar Open Beta. Please report any issue you encounter on GitHub!
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 on | June 16, 2026 |
| License | LGPL |
| Downloads | 2 |
| Stars | 1 |
| Watchers | 1 |
Library
Pages
Members
Owner