Introduction
irt.io is server-authoritative multiplayer for web games. You describe your shared state once, write to what you own like local variables, and the SDK keeps every client in sync — with a real server you can trust for anything cheat-sensitive. No dedicated netcode layer, no player-hosted lobbies, no rewrite when your game gets more serious.
It drops into the stack you already ship — Three.js, Phaser, plain canvas, Vite, Vercel — as plain TypeScript. Nothing about irt.io is a framework you build your game inside; it’s a library your game calls.
The one idea
Shared game state lives in a room on our servers. Every entity has an owner — a client or the server — and only the owner may write it.
import { joinRoom } from '@irtio/client';
import { schema } from './irtio/schema';
const room = await joinRoom(schema);
// You own your player. Write to it like local state; everyone else sees it.
room.state.players[room.me].x += dx; That’s the model. Everything else — validation, RPCs, server-driven simulation — is a small, local step up from here, never a rewrite.
What you get
| Piece | Does |
|---|---|
| Schema | One typed description of your shared state |
| Room file | Ownership, validation, and server logic in one place |
| Client SDK | joinRoom, reactive state, RPCs, presence |
| Simulated players | Headless bots that prove your netcode in tests |
| Dashboard | Moderation, live rooms, usage, and billing |
Where to next
- New to it? Follow the quickstart — two tabs sharing a link in five minutes.
- Want the whole picture first? Read the mental model.
This is placeholder documentation. Copy and APIs are provisional and will change before 1.0.