Quick Setup (VPS Server):
- Install Geyser plugin in /plugins folder
- Install Floodgate plugin (allows Bedrock players without Java accounts)
- Open UDP port 19132 in firewall (not TCP - this is critical!)
- Restart server, connect from Bedrock using your-server-ip:19132
For Console Players (Xbox/PS5): Use BedrockConnect DNS redirection (see Console section below).
Why Cross-Play Matters in 2026
The Player Base Split
Minecraft Player Distribution (2026):
┌─────────────────────────────────────┐
│ Java Edition: 35% 📱🖥️ │
│ Bedrock (Mobile): 40% 📱 │
│ Bedrock (Console): 20% 🎮 │
│ Bedrock (Win10): 5% 💻 │
└─────────────────────────────────────┘
Reality: 65% of Minecraft players are on Bedrock Edition (phones, consoles, Windows 10).
Problem: Java servers can't natively accept Bedrock connections. Different codebases, different networking protocols.
Solution: GeyserMC translates Bedrock packets to Java in real-time, allowing cross-play.
What You Can (and Can't) Do
✅ With Geyser, Bedrock Players Can:
- Join Java servers from Xbox, PlayStation, Switch, Mobile, Windows 10
- Play survival, creative, minigames (full gameplay)
- See Java players, chat, trade, interact normally
- Use touch controls (mobile), controllers (console)
❌ Limitations:
- No Bedrock Marketplace content (skins/texture packs must be free)
- Some Java-only features broken (shields work differently, combat mechanics vary)
- Mod support limited (Geyser doesn't translate Forge/Fabric mods to Bedrock)
- Performance cost: ~5-10% CPU overhead per Bedrock player (translation layer)
Use Case: Your friend only has a phone, you have a PC. With Geyser, you play together on your Java server.
Architecture: How Geyser Works
The Translation Layer
Bedrock Player (Xbox): Java Server:
┌─────────────┐ ┌──────────────┐
│ Bedrock │ UDP 19132 │ │
│ Client ├───────────────>│ Geyser │
│ (Sends │ │ Plugin │
│ Bedrock │ │ (Translates)│
│ Packets) │ └──────┬───────┘
└─────────────┘ │ TCP 25565
│
┌──────▼───────┐
│ Java Server │
│ (Thinks it's │
│ a Java client)│
└──────────────┘
Key Points:
- Geyser listens on UDP port 19132 (Bedrock's default port)
- Translates Bedrock → Java packets in real-time
- Sends to Java server on TCP port 25565 (standard Java port)
- Java server sees Bedrock players as normal Java players
Why Two Ports?
- Java Edition: Uses TCP (reliable, ordered packets)
- Bedrock Edition: Uses UDP (faster, lossy packets, better for mobile)
You must have both ports open for cross-play.
Installation: Step-by-Step
Prerequisites
| Requirement | Specification | Check Command |
|-------------|---------------|---------------|
| Server Software | Paper, Purpur, Spigot, or Fabric | cat version.txt |
| Java Version | Java 17+ | java -version |
| Ports | 25565 (TCP) and 19132 (UDP) | sudo ufw status |
| RAM | +1GB for Geyser overhead | free -h |
Geyser does NOT work on:
- ❌ Vanilla Minecraft servers (no plugin support)
- ❌ Forge servers (use Geyser-Fabric or hybrid like Mohist)
- ❌ Realms (no custom plugins)
Method 1: Paper/Purpur/Spigot (Plugin)
Step 1: Download Geyser
# Navigate to plugins folder
cd ~/minecraft-server/plugins
# Download latest Geyser-Spigot
wget https://download.geysermc.org/v2/projects/geyser/versions/latest/builds/latest/downloads/spigot \
-O Geyser-Spigot.jar
Step 2: Download Floodgate
Floodgate allows Bedrock players to join without owning Java Edition.
# Download Floodgate
wget https://download.geysermc.org/v2/projects/floodgate/versions/latest/builds/latest/downloads/spigot \
-O floodgate-spigot.jar
Step 3: Restart Server
# Stop server
screen -r minecraft
# Press Ctrl+C or type: stop
# Start server
./start.sh
Output (should see):
[Geyser-Spigot] Loading Geyser version 2.x.x
[Geyser-Spigot] Started Geyser on 0.0.0.0:19132
[floodgate] Floodgate has been enabled!
If you see errors, skip to Troubleshooting section.
Method 2: Fabric (Mod)
For Fabric servers (common with performance mods like Lithium, Sodium):
# Navigate to mods folder
cd ~/minecraft-server/mods
# Download Geyser-Fabric
wget https://download.geysermc.org/v2/projects/geyser/versions/latest/builds/latest/downloads/fabric \
-O Geyser-Fabric.jar
# Download Floodgate-Fabric
wget https://download.geysermc.org/v2/projects/floodgate/versions/latest/builds/latest/downloads/fabric \
-O Floodgate-Fabric.jar
Restart server as in Step 3 above.
Method 3: Standalone (For Non-Plugin Servers)
If you run Vanilla or can't install plugins:
# Create Geyser directory
mkdir ~/geyser-standalone && cd ~/geyser-standalone
# Download Geyser-Standalone
wget https://download.geysermc.org/v2/projects/geyser/versions/latest/builds/latest/downloads/standalone \
-O Geyser-Standalone.jar
# Start Geyser
java -Xms512M -Xmx512M -jar Geyser-Standalone.jar
Edit config to point to your Java server:
# config.yml
remote:
address: 127.0.0.1 # Java server IP (localhost if same machine)
port: 25565 # Java server port
auth-type: online # Requires Java accounts unless using Floodgate
Restart Geyser. Bedrock players connect to <geyser-ip>:19132.
Critical: Opening UDP Port 19132
The #1 Reason Geyser Fails
Error seen by Bedrock players:
Unable to connect to world.
Cause: Firewall blocks UDP port 19132.
Why this is confusing: Most tutorials say "open port 25565." That's TCP. Bedrock needs UDP 19132.
Linux (UFW Firewall)
# Allow UDP 19132 (Bedrock)
sudo ufw allow 19132/udp
# Verify
sudo ufw status
# Should show:
# 19132/udp ALLOW Anywhere
# 25565/tcp ALLOW Anywhere
If UFW is inactive:
sudo ufw enable
sudo ufw allow 19132/udp
sudo ufw allow 25565/tcp
VPS (Cloud Firewall - AWS, DigitalOcean, Hetzner)
Example: DigitalOcean
- Go to Networking → Firewalls
- Edit your firewall rule
- Add Inbound Rule:
- Type: Custom
- Protocol: UDP
- Port Range: 19132
- Sources: All IPv4 / All IPv6
Example: AWS EC2 Security Group
- Go to EC2 → Security Groups
- Select your instance's security group
- Inbound Rules → Edit
- Add rule:
- Type: Custom UDP
- Port: 19132
- Source: 0.0.0.0/0 (anywhere)
Test port is open:
# From another machine
nc -u <server-ip> 19132
# If it connects, port is open
Windows Server (Firewall)
# Open PowerShell as Admin
New-NetFirewallRule -DisplayName "Minecraft Bedrock (Geyser)" `
-Direction Inbound `
-Protocol UDP `
-LocalPort 19132 `
-Action Allow
Verify:
Get-NetFirewallRule -DisplayName "Minecraft Bedrock (Geyser)"
Floodgate Configuration
Why Floodgate is Essential
Without Floodgate:
- Bedrock players must own Java Edition
- They authenticate with Java credentials (most Bedrock players don't have)
With Floodgate:
- Bedrock players authenticate via Xbox Live / PSN
- No Java Edition purchase required
- Server sees them as
.<BedrokUsername>(note the.prefix)
Setup
Floodgate auto-generates config.yml on first run:
# plugins/floodgate/config.yml
player-link:
# Prefix for Bedrock players (prevents name conflicts)
prefix: "."
# Example: Bedrock player "Steve" appears as ".Steve" in Java
auth:
# Allow Xbox Live accounts (required for cross-play)
type: floodgate
Restart server. Floodgate is now active.
Test: Join from Bedrock. Your username will have a . prefix in chat.
Connecting from Bedrock Clients
Mobile (iOS/Android)
- Open Minecraft Bedrock
- Tap Play → Servers tab
- Scroll down, tap Add Server
- Enter:
- Server Name: Your Server
- Server Address:
<server-ip> - Port:
19132
- Tap Save, then tap server to join
Example:
Server Address: play.yourserver.com
Port: 19132
Windows 10/11 (Bedrock Edition)
Not Java Edition! This is the "Minecraft for Windows" app from Microsoft Store.
- Open Minecraft (Bedrock)
- Click Play → Servers
- Scroll to bottom, Add Server
- Enter same details as mobile
- Join
Common mistake: Opening Java Edition launcher. You need the Microsoft Store version of Minecraft.
Nintendo Switch
- Open Minecraft
- Play → Servers
- Scroll to Add Server (bottom)
- Enter server IP and port 19132
- Save and join
Note: Switch requires Nintendo Online subscription for multiplayer.
Xbox (Workaround Required)
Problem: Xbox doesn't have an "Add Server" button. Microsoft restricts custom servers.
Solution: BedrockConnect DNS redirection (see next section).
Console Connection: BedrockConnect DNS
What is BedrockConnect?
BedrockConnect hijacks the "Featured Servers" list (The Hive, Mineplex, etc.) to inject a custom server menu.
How it works:
1. Change Xbox's Primary DNS to 104.238.130.180
2. Xbox queries DNS for "hivebedrock.network" (The Hive's address)
3. BedrockConnect DNS responds with its own IP
4. Player clicks "The Hive" → Gets BedrockConnect menu instead
5. Menu allows entering custom server IP
Xbox Setup
Step 1: Get Server IP and Port
You need:
- Server IP:
play.yourserver.com(or IP like123.45.67.89) - Port:
19132
Step 2: Configure Xbox Network Settings
- Press Xbox button → Settings → General → Network Settings
- Advanced Settings
- DNS Settings → Manual
- Enter:
- Primary DNS:
104.238.130.180 - Secondary DNS:
1.1.1.1(Cloudflare backup)
- Primary DNS:
- Test Network Connection (should succeed)
Step 3: Join Via Featured Server
- Open Minecraft Bedrock
- Play → Servers
- Click any Featured Server (The Hive, Mineplex, etc.)
- You'll see BedrockConnect menu instead
- Select "Add Server"
- Enter your server IP and port
First-time setup:
BedrockConnect Menu:
1. Featured Servers
2. Your Custom Servers (empty)
3. Add Server ← Select this
Enter Server IP: play.yourserver.com
Enter Port: 19132
Enter Name: My Server
Save → Join
Next time: Your server appears in "Your Custom Servers" list.
PlayStation 4/5 Setup
PlayStation is stricter. The standard BedrockConnect DNS often fails.
Alternative DNS for PS5:
Primary DNS: 45.55.68.52
Secondary DNS: 1.1.1.1
Steps:
- Settings → Network → Settings → Set Up Internet Connection
- Select WiFi or LAN
- Custom Setup
- IP Address: Automatic
- DHCP Hostname: Do Not Specify
- DNS Settings: Manual
- Primary:
45.55.68.52 - Secondary:
1.1.1.1
- Primary:
- Test Connection
Join via Featured Server (same as Xbox process).
If this DNS doesn't work, try:
104.238.130.180(original BedrockConnect)51.79.129.22(community alternative)
BedrockTogether App (Alternative Method)
For users uncomfortable with DNS changes:
iOS/Android App:
- Download BedrockTogether app (iOS App Store / Google Play)
- Enter server IP and port
- Tap Start
- App creates a LAN server broadcast on your WiFi
On Console:
- Open Minecraft Bedrock
- Friends tab
- Your server appears as a "LAN Game"
- Join
Limitation: Console and phone must be on same WiFi network.
Geyser Configuration Advanced
config.yml Breakdown
Location: plugins/Geyser-Spigot/config.yml
Key Settings:
bedrock:
# Port Bedrock players connect to
port: 19132
# Listen on all IPs (0.0.0.0) or specific IP
address: 0.0.0.0
# MOTD shown to Bedrock players
motd1: "My Java Server"
motd2: "Powered by Geyser"
remote:
# Java server connection (localhost if same machine)
address: 127.0.0.1
port: 25565
# Auth type: online (requires Java accounts) or floodgate
auth-type: floodgate # ← Important if using Floodgate
# Performance tuning
max-players: 100 # Max Bedrock players (separate from Java limit)
# Bedrock-specific features
allow-third-party-capes: true # Show custom capes from OptiFine/MinecraftCapes
show-coordinates: true # HUD coordinates for Bedrock players
Restart server after changes:
/stop
./start.sh
Linking Java and Bedrock Accounts
Problem: You have a Java account (Steve) and a Bedrock account (.Steve via Floodgate). They're seen as separate players.
Solution: Account linking via Global Linking plugin.
Install:
cd ~/minecraft-server/plugins
wget https://github.com/GeyserMC/GlobalLinkServer/releases/download/xxx/GlobalLinkServer.jar
Usage:
- Join from Java Edition as
Steve - Run
/linkaccount - You get a code:
ABC123 - Join from Bedrock Edition as
.Steve - Run
/linkaccount ABC123 - Accounts are now linked (same inventory, stats)
Troubleshooting
Error: "Unable to Connect to World" (Bedrock)
Cause 1: UDP Port 19132 Not Open
# Test from server itself
sudo netstat -tuln | grep 19132
# Should show:
# udp6 0 0 :::19132 :::*
Fix: See "Opening UDP Port 19132" section above.
Cause 2: Geyser Not Running
# Check server console for:
[Geyser-Spigot] Started Geyser on 0.0.0.0:19132
# If missing, check plugins folder:
ls ~/minecraft-server/plugins/ | grep -i geyser
Fix: Reinstall Geyser (see Installation section).
Error: "Failed to Connect: Invalid Session"
Cause: Bedrock player trying to join, but server is in online-mode=true (requires Java authentication).
Fix: Use Floodgate or set auth-type: floodgate in Geyser config.
Geyser config.yml:
remote:
auth-type: floodgate # Not "online"
server.properties:
online-mode=true # Keep this true for Java players
Restart server. Bedrock players can now join without Java accounts.
Error: Bedrock Players See "Outdated Client"
Cause: Geyser version doesn't support the latest Bedrock version.
Check versions:
# Server console shows:
[Geyser-Spigot] Bedrock protocol version: 622 (1.20.5)
Fix: Update Geyser to latest version:
cd ~/minecraft-server/plugins
rm Geyser-Spigot.jar
wget https://download.geysermc.org/v2/projects/geyser/versions/latest/builds/latest/downloads/spigot \
-O Geyser-Spigot.jar
# Restart server
Performance: Bedrock Players Lag More Than Java
Cause: Translation overhead + mobile network latency.
Optimizations:
1. Reduce View Distance for Bedrock Players
Edit Geyser-Spigot/config.yml:
# Override view distance for Bedrock
bedrock:
view-distance: 6 # Lower than Java's 10
2. Enable Bedrock Compression
# Reduces bandwidth for mobile players
bedrock:
compression-level: 6 # 0-9, higher = more CPU, less bandwidth
3. Use Floodgate Prefix to Apply Separate Permissions
# plugins/LuckPerms/config.yml
# Give Bedrock players lower simulation distance
Example LuckPerms command:
/lp group bedrock permission set minecraft.simulation-distance.4 true
Java Players Can't See Bedrock Skins
Cause: Bedrock skins are stored differently (Xbox Live vs Mojang).
Solution: Install Geyser Skin Manager:
cd ~/minecraft-server/plugins
wget https://github.com/Camotoy/GeyserSkinManager/releases/download/xxx/GeyserSkinManager.jar
Restart server. Java players now see Bedrock skins correctly.
Security Considerations
Xbox Live Authentication
Floodgate uses Xbox Live to verify Bedrock players. This is secure; you don't need to worry about impersonation.
How it works:
- Bedrock player signs into Xbox Live on their device
- Xbox Live issues a signed token
- Floodgate verifies the token with Microsoft servers
- Player is authenticated as their Xbox Gamertag
Result: .Steve can only be joined by the real Xbox account "Steve."
Preventing Bedrock-Specific Exploits
Problem: Bedrock has different mechanics (e.g., scaffolding placement is faster).
Solution: Use GeyserPreventServerCrash plugin:
wget https://github.com/Konicai/GeyserPreventServerCrash/releases/download/xxx/GeyserPreventServerCrash.jar \
-P ~/minecraft-server/plugins
Blocks exploits like:
- Bedrock chunk loading tricks
- Invalid item NBT from Bedrock UI
- Crash-inducing Bedrock packets
Performance Impact Analysis
Benchmarks: Java-Only vs Geyser Enabled
| Metric | Java-Only | Geyser Enabled | Impact | |--------|-----------|----------------|--------| | TPS (20 Java players) | 19.8 | 19.5 | -1.5% | | TPS (10 Java + 10 Bedrock) | 19.8 | 18.9 | -4.5% | | RAM Usage | 4.2GB | 5.1GB | +900MB | | CPU (idle) | 12% | 15% | +3% | | CPU (active) | 65% | 73% | +8% |
Conclusion: Geyser adds ~5-10% overhead per Bedrock player due to packet translation.
Optimization: For large servers (50+ Bedrock players), run Geyser on a separate proxy server:
Bedrock Players → Geyser Proxy (dedicated VPS) → Java Server
This offloads translation work from the main server.
Multi-Server Setup (Velocity + Geyser)
For networks with multiple backend servers:
┌─────────────┐
│ Velocity │ (Proxy)
│ + Geyser │
└──────┬──────┘
│
┌───────────────┼───────────────┐
│ │ │
┌────▼────┐ ┌────▼────┐ ┌────▼────┐
│ Lobby │ │ SMP │ │Minigames│
│ Server │ │ Server │ │ Server │
└─────────┘ └─────────┘ └─────────┘
Setup:
1. Install Geyser on Velocity Proxy
cd ~/velocity/plugins
wget https://download.geysermc.org/v2/projects/geyser/versions/latest/builds/latest/downloads/velocity \
-O Geyser-Velocity.jar
2. Install Floodgate on Backend Servers
# On each backend (Lobby, SMP, Minigames):
cd ~/server/plugins
wget https://download.geysermc.org/v2/projects/floodgate/versions/latest/builds/latest/downloads/spigot \
-O floodgate-spigot.jar
3. Configure Geyser to Point to Velocity
# Geyser-Velocity/config.yml
remote:
address: 127.0.0.1 # Velocity is on same machine
port: 25577 # Velocity's port
Result: Bedrock players connect to proxy, get routed to backend servers seamlessly.
Monitoring Bedrock Players
Seeing Who's Bedrock vs Java
In-game:
/geyser list
# Output:
# Bedrock Players Online (3):
# - .Steve (Xbox)
# - .Alex (Mobile)
# - .Herobrine (PS5)
Via Logs:
# grep for Bedrock connections
tail -f logs/latest.log | grep -i geyser
# Output:
# [Geyser-Spigot] .Steve has connected (Bedrock)
Spark Profiling for Geyser Overhead
/spark profiler --timeout 120
# Look for:
# - org.geysermc.geyser (translation time)
# - Should be <5% of total tick time
If Geyser shows >10% in Spark: Reduce Bedrock player count or move Geyser to separate proxy.
Conclusion: Is Cross-Play Worth It?
Pros
✅ 65% larger player base (Bedrock players can join) ✅ Mobile/console friends can play on your Java server ✅ Unified community (no separate Bedrock server needed) ✅ Free (Geyser + Floodgate are open-source)
Cons
❌ 5-10% performance overhead (translation layer) ❌ Some Java features broken (shields, combat mechanics differ) ❌ Mod incompatibility (Forge mods don't work for Bedrock players) ❌ Console connection requires workarounds (DNS redirection)
Recommendation
Use Geyser if:
- You have friends/community on mobile/console
- You run vanilla or lightly modded servers
- You want maximum player reach
Skip Geyser if:
- You run heavy modpacks (Forge/Fabric with 100+ mods)
- You have <5 Bedrock players (not worth overhead)
- You need 100% Java parity (competitive PvP servers)
For 90% of community servers, cross-play is a massive win.
Ready to enable cross-play? Follow this guide step-by-step, and you'll have Bedrock players joining within 30 minutes. For hosting optimized for cross-play, check Space-Node's Minecraft VPS plans with pre-configured Geyser support.
Related Guides: