Introduction
Colyseus Hero Image

Colyseus Multiplayer Framework

Colyseus is an open-source Node.js framework for building authoritative game servers — with real-time state synchronization, matchmaking, and effortless integration into any game engine or frontend.

Key Features

How does it look like?

Create a server

Create and start a new Colyseus server using the following commands:

Terminal: Node.js
# Create a new Colyseus project
npm create colyseus-app@latest ./my-server
 
# Enter the project directory
cd my-server
 
# Run the server
npm start

Define your Room State

The Room state is the data structure that will be synchronized between the server and the connected clients:

src/rooms/MyState.ts
import { Schema, MapSchema, type } from "@colyseus/schema";
 
export class Player extends Schema {
    @type("number") x: number = 0;
    @type("number") y: number = 0;
}
 
export class MyState extends Schema {
    @type({ map: Player }) players = new MapSchema<Player>();
}

Create your Room code

Define the game logic and client interactions with the game state within your Room code.

src/rooms/MyRoom.ts
import { Room, Client } from "@colyseus/core";
import { MyState, Player } from "./MyState";
 
export class MyRoom extends Room {
    maxClients = 4;
    state = new MyState();
 
    messages = {
        doSomething: (client, payload) => {
            // handle client's "doSomething" message
        }
    }
 
    // Called when the room is created
    onCreate(options) { }
 
    // Called when a client joins the room
    onJoin(client: Client, options: any) {
        this.state.players.set(client.sessionId, new Player());
    }
 
    // Called when a client leaves the room
    onLeave(client: Client, options: any) {
        this.state.players.delete(client.sessionId);
    }
 
    // Called when the room is disposed
    onDispose() { }
}

Expose the Room identifier

Exposing the room type allows clients to connect to the server and dynamically create instances of it.

src/app.config.ts
import { defineServer, defineRoom } from "colyseus";
import { MyRoom } from "./MyRoom";
 
const server = defineServer({
    rooms: {
        my_room: defineRoom(MyRoom),
    },
});

Join the Room from the client SDK

Communication between the client and server occurs through room connections. Below are examples for each SDK showing how to join a room and listen for state changes:

client.ts
import { Client, Callbacks } from "@colyseus/sdk";
 
async function connect() {
    const client = new Client('http://localhost:2567');
    const room = await client.joinOrCreate('my_room', {
        /* custom join options */
    });
    const callbacks = Callbacks.get(room);
 
    // Listen to 'player' instance additions
    callbacks.onAdd("players", (player, sessionId) => {
        console.log('Player joined:', player);
    });
 
    // Listen to 'player' instance removals
    callbacks.onRemove("players", (player, sessionId) => {
        console.log('Player left:', player);
    });
 
    // Send messages to the server
    room.send("doSomething", {/* ... */});
 
    return room;
}
 
connect();

Explore more

Explore more about Colyseus by following the tutorials and example projects: