irt.io vs Nakama

Nakama is an open source game server with accounts, social features, leaderboards, matchmaking and authoritative matches. You run it, or use managed hosting. irtio is narrower: shared room state for web games, with nothing to operate.

The structural difference is what the server hands you. A Nakama authoritative match gives you a loop and a message channel, and you decide what to send. An irtio room gives you a shared object with an owner per instance, and the wire is derived from your schema.

When Nakama is the better choice

  • You ship outside the browser. Nakama has client SDKs for the major engines and native platforms. irtio clients are JavaScript and TypeScript in a browser, and that is all.
  • You want a backend, not just multiplayer. Accounts, friends, groups, chat, tournaments, storage and matchmaking arrive together and are mature. irtio has small pieces of that surface and does not try to match the rest.
  • You want to own the data and the deployment. Nakama is open source, runs on your own infrastructure, and keeps your data in a database you control.
  • You want server logic in a language of your choice. Nakama’s runtime takes Go, Lua and TypeScript modules. irtio rooms are TypeScript only.

When irt.io is the better choice

  • Your game is a web game and you do not want to operate anything. No server, no database, no container. irtio deploy ships the room file.
  • You want replicated state rather than messages. You declare collections and fields once, and every client’s copy stays in sync. You never write an encoder, a message id or a broadcast loop.
  • You want physics and prediction without writing netcode. A room can step a Rapier or matter2d world, and the client can predict the bodies it steers.
  • You want rooms that cost nothing while empty. A quiet room saves its state, stops, and resumes at the same tick when someone joins.

Model comparison

Nakamairt.io
AuthorityServer, in an authoritative match handlerServer, per collection
Who operates the serverYou, or a managed hostirt.io
State modelMatch state you encode and broadcast yourselfSchema of collections, synced as binary deltas
PredictionYou write itBuilt in, one option on joinRoom
PhysicsNot includedRapier or matter2d, stepped in the room
VoiceBring your ownjoinVoice(room)
TestingYour language’s own toolsIn-process rooms with real clients, plus load runs
Idle roomsThe server runs whether or not a match is liveRooms hibernate and wake with state intact
LanguageGo, Lua or TypeScript on the server; many client SDKsTypeScript on both sides

What porting looks like

The match handler is the piece that maps across. A Nakama authoritative match has a join hook, a leave hook and a loop that receives inbound match data and broadcasts outbound match data. An irtio room has onJoin, onLeave and tick, so the control flow survives the move.

The message layer does not survive, and that is most of the win. Every opcode a client sends becomes either a typed RPC or a write to an instance that client owns. Every piece of match state you were packing into an outbound payload becomes a field in the schema, and irtio decides what each client needs to receive. The encoding and decoding on both sides is deleted rather than translated.

Persistence splits into three. Per-player values that outlive the match move to room.kv. Named snapshots of a whole room move to room.save(). Ranked tables move to the leaderboards API. irtio has no query language over stored data, so anything you were doing with Nakama’s storage engine that needs listing or filtering stays in a database of yours.

The social surface has no equivalent. Accounts, friends, groups and chat are not part of irtio. If your game depends on them, either keep Nakama for that half or plan to build it.

Next steps

This page describes each product’s model as it stood at the page’s last review. If something here is wrong or out of date, write to hello@irt.io and it gets fixed.