Colyseus v1.0 Roadmap

Colyseus is an independent open-source project that has been around since 2015. The project has been used in production by several indies and companies and has been battle-tested in many different scenarios. The project is currently stable, but there are still many features and improvements that we’d like to add.

Issue-level tracking lives in the 1.0 milestone on GitHub.

If you’d like to support the project, please consider sponsoring my work.

  • Netcode:
    • Stabilize the input and prediction tools that 0.18 introduced. Settle the public API, and replace the runtime warnings that guard today’s contracts with designs that resist misuse.
    • Close the SDK gap. The native C core and Flutter are complete. The Godot bindings read fields by struct offset, and GameMaker has no documented input API.
  • State Sync:
    • @colyseus/schema - Bidirectional schema instances:
      • Allow to send schema instance updates from client to server. 0.18 covers flat primitive fields through defineInput(). Nested schemas and collections are not supported yet.
      • Wild idea: support RPC calls via schema instances (?)
    • Decouple @colyseus/schema from the core:
      • Allow to use other serialization methods for the state. The serializer seam exists, but the core still depends on @colyseus/schema for message framing, state views, rewind and dev mode.
  • WebTransport:
    • Improve and stabilize WebTransport support. The transport carries no authentication headers on the socket connection, and latency simulation is not implemented.
  • Matchmaking:
    • Improve filtering and sorting options. Every driver compares filters by strict equality. There are no range or set operators.
  • General improvements:

Shipped in v0.18 (Aug 2026)

  • Database-first features:
    • Since Colyseus doesn’t currently have an official database recommendation tool, we can’t provide built-in database-first features. Features that depend on a database tool are: player identity, leaderboards, configs, etc.
      • Added the official @colyseus/database package: player identity, cloud saves, leaderboards, and live configs.
      • Added @colyseus/admin, the operations console built on top of it.
  • Native SDK:
    • Shared native cross-platform SDK aimed to be used on Godot, Game Maker, Unreal, etc.
  • State Sync:
    • Client-side prediction: Allow to specify client-side prediction techniques on the frontend
      • Added first-class client-side prediction and lag compensation via defineInput() / setFixedTimestep() / allowRewindState() (server) and room.input() / Predict / room.clock (client). See Netcode.
    • Yjs (CRDT) connection provider via Colyseus Rooms.
      • Added @colyseus/yjs: a room plugin, a ready-made room, and a client provider that mirrors y-websocket.
    • Released @colyseus/schema 5.0, the foundation of this release: a faster encoder, the decorator-free schema() builder API, delivery modifiers, quantized floats, and streaming collections.
  • General improvements:
    • Add request/response model to rooms (#331)
      • Added a request/response model to room messages: the client awaits a reply with room.request(type, payload) or room.send(type, payload, callback). The server answers by returning a value from its matching onMessage(type, ...) handler.
    • Added a framework-owned fixed timestep: setFixedTimestep() runs the simulation at a constant step, and setSimulationInterval() was renamed to setTimestep().

Shipped in v0.17 (January 2026)

  • Matchmaking:
    • SQL Driver - Provide a SQL driver as alternative to @colyseus/redis-driver (should support SQLite / PostgreSQL, possibly on top of Kysely)
    • New “queue” matchmaking type:
      • A queue would keep more clients than needed before starting a match
      • User specifies logic that combines clients into a new room
      • Reserve seats for selected clients and redirect them to the newly created room
      • Added Queue matchmaking type
  • Full-stack + TypeScript Improvements:
    • Allow to specify client.auth and client.userData types on the backend only once
    • Allow to infer types for room message and payload definitions from frontend (room.send())
    • Allow to infer http routes and request/response body types from frontend (client.http.*)