Releases: SendableMetatype/Geyser-Education-Extension
v3.1.0
Nethernet API Migration
The extension now uses EduGeyser's built-in Nethernet transport instead of bundling its own WebRTC server. This dramatically reduces the extension JAR size and simplifies the architecture.
Requires the latest EduGeyser release (v2.10.0-edu.1 or newer). Older EduGeyser versions do not have the Nethernet API.
Known Issues
Join code and connection ID users may occasionally experience an "End of stream" error when connecting. This is being actively investigated. If you encounter it, reconnecting usually works.
v3.0.0
Education Edition 1.21.133 Support
Education Edition 1.21.133 removed client-side support for all direct IP connection methods. The extension is now required for students to connect.
- Connection ID works out of the box with no accounts or configuration
- Join Codes and Server List continue to work as before
See the Setup Guide for installation instructions.
v2.4.0
- Bundle configurate-yaml at runtime (fixes second-run crash)
- Use String for nethernet connection ID (fixes overflow on 20-digit IDs)
- Fix config load failure cascading into unnecessary reauthentication
- Improve error messages for invalid connection-id
EduGeyser Extension v2.3.0
- Fix: respect custom port in server-ip config for tunneling setups (e.g. playit.gg)
- Port is now a separate server-port config option for clarity
Note: Delete your existing joincode_config.yml and serverlist_config.yml to let them regenerate with the new server-port option. Your connection ID and server name will be regenerated, so note them down first if needed.
EduGeyser Extension v2.2.3
Fix: v2.2.2 broke join code connections
v2.2.2 tried to isolate the extension's Netty from the server's, which introduced a pipeline error (IncompatibleClassChangeError) that prevented clients from connecting via join codes.
This release reverts to a simpler approach that works on all platforms. Confirmed working on Spigot and Velocity.
No config changes needed — just replace the jar and restart.
Requirements
- EduGeyser
- Drop the jar in Geyser's
extensions/folder
EduGeyser Extension v2.2.2
Fix: runtime errors on Spigot
The previous version crashed on some Spigot servers with NoClassDefFoundError: io/netty/util/LeakPresenceDetector because of a version mismatch between the bundled Netty code and the Netty version Spigot ships.
The extension now bundles its own isolated copy of Netty so it works identically on any platform regardless of what Netty version the host server uses.
No config changes needed — just replace the jar and restart.
Requirements
- EduGeyser
- Drop the jar in Geyser's
extensions/folder
EduGeyser Extension v2.2.1
Fix: Spigot support
Join codes now work on Spigot/Paper servers. The previous version only worked on Velocity because Spigot doesn't provide the Netty WebSocket module that the signaling connection needs.
The extension now bundles this module directly, pinned to match Geyser's Netty version (4.2.7) for compatibility.
No config changes needed — just replace the jar and restart.
Requirements
- EduGeyser
- Drop the jar in Geyser's
extensions/folder
EduGeyser Extension v2.2
Before upgrading
Delete plugins/Geyser-*/extensions/edu/joincode_config.yml and restart. This regenerates the config with the new Connection ID field. Your signed-in accounts will restore automatically.
What's new
Direct connection IDs
You now have a 10-digit Connection ID that students can enter directly in Education Edition to join your server — no join code needed, and it works across any school tenant. The ID stays the same across restarts, so you only need to share it once.
Of course join codes still work like before, and you can use both.
More stable long-running hosting
Fixed a bug where clients couldn't connect after the server had been running for many hours, even though join codes appeared valid. The extension now checks the connection every 2 minutes and automatically recovers if something is wrong.
Cleaner logs
The console now shows the signed-in user's email instead of a cryptic tenant ID. Example:
[JoinCode] Connection ID: 1234567890
[JoinCode] teacher@school.edu: Cake, Sign, Sign, Pickaxe | https://education.minecraft.net/joinworld/...
Requirements
- EduGeyser
- Drop the jar in Geyser's
extensions/folder
EduGeyser Extension v2.1
Changes from v2.0
- UPN display: Shows the signed-in user's email (e.g.
teacher@school.edu) instead of raw tenant UUIDs in all logs and commands - Reduced log verbosity: Only final results and device code prompts at INFO level; intermediate steps (restoring, nethernet IDs, tenant settings) moved to debug
- Port always from Geyser: Config
server-ipis now IP/hostname only; port is always read from Geyser's actual listener, preventing mismatches - Reduced memory: Nethernet worker threads capped to 2 per account instead of
availableProcessors * 2 - Heartbeat fix: Added missing
api-version: 2.0header to Discovery heartbeat/update/dehost calls - Education handshake: Redirect handler now echoes the client's server token and uses education codec (3 extra StartGamePacket fields)
- Native WebRTC: Bundled native libraries for all platforms (Windows/Linux/macOS, x86_64/aarch64)
Requirements
- EduGeyser fork (tokentest/master branch)
- Place the jar in Geyser's
extensions/folder
EduGeyser Extension v2.0
What's New
Join Code System
Education Edition join codes allow students to connect via the in-game "Join Code" UI or share links. Join codes are tenant-scoped, so multiple accounts can be registered to serve students from different tenants.
Commands:
/edu joincode— show active join codes with share links/edu joincode add— authenticate with an education account and create a join code/edu joincode remove <number>— remove a join code
How it works:
- Device code OAuth flow to get an MS access token (one sign-in per tenant)
- Anonymous PlayFab auth for MCToken (Nethernet signaling)
- Nethernet WebRTC server accepts incoming connections
- Discovery API registers the join code
- Heartbeat every 100s keeps the code alive
- Clients are redirected to Geyser's RakNet port via TransferPacket
Configuration: joincode_config.yml (world name, host name, server IP, max players)
Join codes change on server restart. Active codes are printed to the console every 3 minutes.
Server List (unchanged)
MESS server list registration from v1.0 continues to work as before.
Requirements
- EduGeyser fork (tokentest/master branch)
- Place the jar in Geyser's
extensions/folder