GeyserMenu-Companion
Server-side companion plugin for GeyserMenu — register buttons, send Bedrock forms, and handle player events via a simple API on Spigot/Paper or Velocity.
GeyserMenu-Companion
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
- Command buttons — register buttons with icons, priorities, and click handlers - Command buttons — send simple, modal, and custom forms to Bedrock players - Command buttons — conditionally show buttons based on player permissions - Command buttons — listen for Bedrock join/leave, check if a player is Bedrock - Command buttons — supports Spigot/Paper and Velocity from a single codebase - Command buttons — automatically reconnects to the GeyserMenu extension on disconnect - Command buttons — register buttons that execute commands without writing click handlers
Requirements
- Spigot/Paper 21+ or Velocity 21+ - Java 21+ - Floodgate - 21+ extension running on Geyser
Installation
1. Download the JAR for your platform — `Spigot` or `Velocity` 2. Place it in your `plugins/` folder 3. Start the server once to generate `config.yml` 4. Set the `host`, `port`, and `secret-key` to match your GeyserMenu extension config 5. Restart — the plugin will connect and sync buttons automatically
Configuration
```yaml extension: host: "localhost" port: 19133 secret-key: "your-secret-key-here"
connection: auto-reconnect: true reconnect-delay: 5
server: identifier: "lobby" ```
Quick API Example
```java 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.