As of 1/16/26, this version of NodeTunnel is no longer in development. The relay server will remain up until 2/16/26.
Please consider switching to the Rust rewrite of NodeTunnel.
It is more performant, has far more features, and is receiving consistent updates and bug fixes.
Easy P2P multiplayer networking for Godot through relay servers
⚠️ EARLY DEVELOPMENT - This is experimental software! Expect bugs, breaking changes, and dragons. Not recommended for production use. Please report any issues you run into!
NodeTunnel provides peer-to-peer multiplayer without NAT traversal, port forwarding, or dedicated servers. Simply connect through a relay server and start playing!
- Drop-in replacement for Godot's built-in multiplayer
- No port forwarding or firewall configuration needed
- Works behind NAT and restrictive networks
- Easy host/join workflow with shareable room codes
- Compatible with existing Godot networking code
- Download from GitHub Releases
- Extract to your project's
addons/folder - Enable "NodeTunnel" in Project Settings > Plugins
extends Node2D
func _ready():
var peer = NodeTunnelPeer.new()
multiplayer.multiplayer_peer = peer
# Connect to the free public relay
# Note that this **must** be done before hosting/joining
peer.connect_to_relay("relay.nodetunnel.io", 9998)
await peer.relay_connected
print("Connected! Your ID: ", peer.online_id)
func host():
# Host a game
peer.host()
await peer.hosting
print("Share this ID: ", peer.online_id)
func join():
# Join a game
peer.join(host_id)
await peer.joined
# Use normal Godot multiplayer from here!
@rpc("any_peer")
func player_moved(position: Vector2):
print("Player moved to: ", position)- Connect to a relay server
- Get an Online ID (like
ABC12345) - Host or join using someone's ID
- Play using normal Godot multiplayer
The relay forwards packets between players, so everyone can connect regardless of network setup.
I provide a free relay server for testing:
- Host:
relay.nodetunnel.io:9998 - Uptime: See nodetunnel.io
Note: Don't rely on this for anything important! Server source code will be available soon for self-hosting.
relay_connected(online_id: String)- Connected to relayhosting- Started hostingjoined- Joined a sessionroom_left- Disconnected from the room
connect_to_relay(host: String, port: int)- Connect to relayhost()- Start hostingjoin(host_oid: String)- Join using host's online IDleave_room()- Leaves the current room, will delete the room when called from hostdisconnect_from_relay()- Disconnect
online_id: String- Your unique session IDdebug_enabled: bool- Enable debug logging
Enable debug logging:
peer.debug_enabled = trueCommon issues:
- Check internet connection
- Verify online IDs are correct
- Make sure both players use the same relay server
- Early alpha - expect bugs and breaking changes
- WebGL not supported (use WebRTC for web games)
- Free relay has no uptime guarantees
- API will change without notice
MIT License
- 🐛 Issues: GitHub Issues
- 💬 Discord: Discord Server