Ship Multiplayer
Games FasterShip Multiplayer
Games FasterBuild and ship real-time multiplayer experiences with Colyseus. Open-source framework for Node.js with built-in matchmaking, state sync, and SDKs for Unity, Defold, Construct, Haxe, JavaScript, and more.
$ `npm create colyseus-app@latest ./my-server` Copied!
Supports your favorite engine & platform
-
TypeScript -
Unity -
Godot Alpha -
GameMaker Alpha -
Defold -
Haxe -
C Alpha -
Construct 3
Trusted by teams with millions of players
See It In Action
Real-Time State Sync in Minutes
Define your game state on the server. Colyseus syncs it to all clients automatically — no manual serialization needed.
TypeScript React
Unity
Godot
GameMaker
Defold
Haxe
C
Construct 3
GameRoom.ts Server
import { Room, Client } from "colyseus";import { GameState, Player } from "./GameState";
export class GameRoom extends Room { state = new GameState();
messages = { // listen for "move" messages from clients move(client: Client, data: any) { const player = this.state.players.get(client.sessionId); if (player) { player.x = data.x; player.y = data.y; } }, }
onJoin(client: Client) { const player = new Player(); this.state.players.set(client.sessionId, player); }
onLeave(client: Client) { this.state.players.delete(client.sessionId); }}client.ts Client
import { Client, Callbacks } from "@colyseus/sdk";
const client = new Client("https://your-server.com");const room = await client.joinOrCreate("game_room");const callbacks = Callbacks.get(room);
callbacks.onAdd("players", (player, key) => { addSpriteForPlayer(player); callbacks.onChange(player, () => moveSprite(key, player.x, player.y));});
callbacks.onRemove("players", (player, key) => removeSpriteForPlayer(key));
room.send("move", { x: 10, y: 20 });`npm install @colyseus/sdk`
Game.tsx Client
import { Client } from "@colyseus/sdk";import { useRoom, useRoomState } from "@colyseus/react";
const client = new Client("https://your-server.com");
function Game() { const { room, isConnecting } = useRoom( () => client.joinOrCreate("game_room"), ); const state = useRoomState(room);
if (isConnecting) return <p>Connecting...</p>;
return ( <ul> {state?.players.map((player, key) => ( <li key={key}>Player at {player.x}, {player.y}</li> ))} </ul> );}`npm install @colyseus/react`
GameClient.cs Client
using Colyseus;using Colyseus.Schema;
var client = new Client("https://your-server.com");var room = await client.JoinOrCreate<GameState>("game_room");var callbacks = Callbacks.Get(room);
callbacks.OnAdd(state => state.players, (sessionId, player) => { AddSpriteForPlayer(player); callbacks.OnChange(player, () => MoveSprite(sessionId, player.x, player.y));});
callbacks.OnRemove(state => state.players, (sessionId, player) => RemoveSpriteForPlayer(sessionId));
await room.Send("move", new { x = 10, y = 20 });client.gd Client
var client: ColyseusClient = Colyseus.create_client()client.set_endpoint("wss://your-server.com")var room: ColyseusRoom = client.join_or_create("game_room")
room.joined.connect(func(): var callbacks = Colyseus.callbacks(room)
callbacks.on_add("players", func(player, key): add_sprite_for_player(player) callbacks.on_change(player, func(): move_sprite(key, player.x, player.y) ) )
callbacks.on_remove("players", func(player, key): remove_sprite_for_player(key) )
room.send("move", {"x": 10, "y": 20}))obj\_client.gml Client
client = new ColyseusClient("https://your-server.com");room = client.join_or_create("game_room");callbacks = ColyseusCallbacks(room);
callbacks.on_add("players", function(player, key) { add_sprite_for_player(player); callbacks.on_change(player, function() { move_sprite(key, player.x, player.y); });});
callbacks.on_remove("players", function(player, key) { remove_sprite_for_player(key);});
room.send("move", { x: 10, y: 20 });client.lua Client
local ColyseusSDK = require "colyseus.sdk"
local client = ColyseusSDK.Client("https://your-server.com")client:join_or_create("game_room", function(room) local callbacks = ColyseusSDK.callbacks(room)
callbacks:on_add("players", function(player, key) add_sprite_for_player(player) callbacks:on_change(player, function() move_sprite(key, player.x, player.y) end) end)
callbacks:on_remove("players", function(player, key) remove_sprite_for_player(key) end)
room:send("move", { x = 10, y = 20 })end)Client.hx Client
import io.colyseus.Client;import io.colyseus.schema.Callbacks;
var client = new Client("https://your-server.com");client.joinOrCreate("game_room", [], MyRoomState, function(err, room) { var callbacks = Callbacks.get(room);
callbacks.onAdd("players", (player, key) -> { addSpriteForPlayer(player); callbacks.onChange(player, () -> moveSprite(key, player.x, player.y)); });
callbacks.onRemove("players", (player, key) -> removeSpriteForPlayer(key));
room.send("move", {x: 10, y: 20});});`haxelib install colyseus`
client.c Client
#include "colyseus.h"
colyseus_client_t* client = colyseus_client_new("https://your-server.com");colyseus_room_t* room = colyseus_join_or_create(client, "game_room");colyseus_callbacks_t* callbacks = colyseus_callbacks_get(room);
void on_player_add(colyseus_state_t* player, const char* key) { add_sprite_for_player(player); colyseus_on_change(callbacks, player, on_player_change, (void*)key);}
void on_player_change(colyseus_state_t* player, void* ctx) { float x = colyseus_get_float(player, "x"); float y = colyseus_get_float(player, "y"); move_sprite((const char*)ctx, x, y);}
colyseus_on_add(callbacks, "players", on_player_add, NULL);colyseus_on_remove(callbacks, "players", on_player_remove, NULL);colyseus_room_send(room, "move", data, data_len);game.js Client
const client = new Colyseus.Client("https://your-server.com");const room = await client.joinOrCreate("game_room");const callbacks = Colyseus.Callbacks.get(room);
callbacks.onAdd("players", (player, key) => { const sprite = runtime.objects.Player.createInstance("Game", player.x, player.y); callbacks.onChange(player, () => { sprite.x = player.x; sprite.y = player.y; });});
callbacks.onRemove("players", (player, key) => { // destroy sprite instance});
room.send("move", { x: 10, y: 20 });Why Colyseus
Everything You Need for Multiplayer
Real-Time State Sync Automatic binary state synchronization. Define your state once, sync everywhere. Built-in Matchmaking Automatic room creation and player matching. Customizable filtering and sorting. Scalable Architecture Scale from 10 to 10,000+ CCU. Distribute rooms across multiple processes or machines.
Cheat-Proof by Design
Authoritative server architecture. Clients send inputs — the server decides what happens.
Multi-Platform SDKs JavaScript, Unity, Defold, Construct 3, Haxe, Cocos Creator, and more. Use the tools you already know. Free & Open Source MIT licensed. Free forever, even for commercial games. Full control over your infrastructure.
Showcase
Games Using Colyseus
A selection of multiplayer games made by happy developers.
Pixels.xyz by Banger Inc
Bloxd.io by Arthur Baker
Sword Masters by Emolingo Games
Cryzen.io by Adel Norberg
Make it Meme by prealpha
SongTrivia2 by SongTrivia
Kirka.io by xip
Rainbow Obby by Emolingo Games
Pixels.xyz by Banger Inc
Bloxd.io by Arthur Baker
Sword Masters by Emolingo Games
Cryzen.io by Adel Norberg
Make it Meme by prealpha
SongTrivia2 by SongTrivia
Kirka.io by xip
Rainbow Obby by Emolingo Games
Unboxing the Cryptic Killer by Eleven Puzzles
Knight's Edge by Lightfox Games
Seep King by Jaspreet Singh
Exploder.io by Piotr Dawidiuk
The Kraken Wakes by Charisma Entertainment
Exposed - Who's Most Likely To by VYS Games
Raft Wars Multiplayer by TinyDobbins
Unboxing the Cryptic Killer by Eleven Puzzles
Knight's Edge by Lightfox Games
Seep King by Jaspreet Singh
Exploder.io by Piotr Dawidiuk
The Kraken Wakes by Charisma Entertainment
Exposed - Who's Most Likely To by VYS Games
Raft Wars Multiplayer by TinyDobbins
No Vendor Lock-In
Your Server, Your Rules
Colyseus is a standard Node.js application. Deploy it anywhere — no proprietary runtimes, no walled gardens, no surprises.
Standard Node.js
No proprietary runtime. Your Colyseus server is just a Node.js app — use any npm package, any tooling you already know.
Host Anywhere
AWS, Google Cloud, DigitalOcean, Fly.io, Railway, bare metal — if it runs Node.js, it runs Colyseus.
Don't want to manage servers?
Colyseus Cloud handles deployment, scaling, and monitoring across 32 global locations. Starting at $15/mo.
Explore Cloud Speak with the founder
Compare
How Colyseus Compares
vs Photon
vs Mirror
vs Nakama
vs From Scratch
Success Stories
Trusted by Indies and Studios Worldwide
"...the operational cost associated with running a Colyseus server is substantially lower than alternatives we tried."
Adrian Olczyc CEO at Eleven Puzzles
"I had previously never worked with Websockets, authoritative multiplayer servers, or Node.js. But that wasn’t a problem, as Colyseus provided me with an intuitive start. This strong foundation allowed us to grow to where we are today."
Sandro Wahl Creator of Make it Meme
"We have been in love with Colyseus since the first moment we discovered it. It is amazing to have such an extraordinary product available for free and as open source."
Pablo and Eibriel Creators of GolfCraft
Community
Join Our Growing Community
Connect with thousands of multiplayer game developers
759K+ Downloads
7.2K GitHub Stars
80 Contributors
3.1K Discord Members
Sponsors
Colyseus is free and open source, made possible by these amazing people.
Sponsors
Scorewarrior
Pixels
Petr Kharitonov
Poki
bloxd
Wavedash
Backers
Dan Hendrickson
Tim Lange
Sandro
emre-sahinn
Geoduck
Bruno Raymundo
Danny Brian
dstrawberrygirl pastean
YORN
Kai o((>ω< ))o )o")
Denys Chebotaiev
Pawel
Stefan Smiljkovic
chris dillman
Damian Pastorini
Past Sponsors
Supporters get exclusive demos, full source & premium guides.




