Compatibility
Minecraft: Java Edition
1.21.x
1.20.x
Platforms
Links
Creators
Details
Licensed GPL-3.0-or-later
Published 3 months ago
GeyserMenu Companion
The server-side half of the GeyserMenu stack. Connects to the GeyserMenu Geyser extension over TCP and exposes a clean Java API for registering menu buttons, sending native Bedrock forms, and listening to Bedrock player events — on both Spigot/Paper and Velocity.
How It Works
Once connected to the GeyserMenu extension, your plugins use the companion API to register buttons that appear in the Bedrock menu. When a player clicks a button, the event is forwarded to your plugin's handler. You can also send forms directly to any Bedrock player at any time.
Features
- Button registration API — register buttons with icons, priorities, and click handlers
- Form builder API — send simple, modal, and custom forms to Bedrock players
- Permission-based visibility — conditionally show buttons based on player permissions
- Bedrock player events — listen for Bedrock join/leave, check if a player is Bedrock
- Multi-platform — supports Spigot/Paper and Velocity from a single codebase
- Auto-reconnect — automatically reconnects to the GeyserMenu extension on disconnect
- Command buttons — register buttons that execute commands without writing click handlers
Requirements
- Spigot/Paper 1.20.4+ or Velocity 3.3.0+
- Java 21+
- Floodgate
- GeyserMenu extension running on Geyser
Installation
- Download the JAR for your platform —
SpigotorVelocity - Place it in your
plugins/folder - Start the server once to generate
config.yml - Set the
host,port, andsecret-keyto match your GeyserMenu extension config - Restart — the plugin will connect and sync buttons automatically
Configuration
extension:
host: "localhost"
port: 19133
secret-key: "your-secret-key-here"
connection:
auto-reconnect: true
reconnect-delay: 5
server:
identifier: "lobby"
Quick API Example
GeyserMenuAPI api = GeyserMenuAPI.getInstance();
api.registerButton(MenuButton.builder()
.id("myplugin-main")
.text("My Plugin")
.imageUrl("https://example.com/icon.png")
.priority(50)
.onClick((player, session) -> openMenu((Player) player))
.build());
Full API documentation is available on the GitHub repository.


