Overview
Silt is infrastructure for browser multiplayer — the rooms, relay, and
presence layer for realtime games, joined straight from the browser with
@siltrun/client. Spin up a real-time room, never touch the QUIC, cert, or
routing plumbing, and let idle rooms scale to zero: a room’s VM doesn’t run until
someone arrives.
Everything below is published on npm. npm create siltrun@latest my-room
scaffolds a room and a client; the Quickstart walks the
whole path.
Two kinds of room
Section titled “Two kinds of room”- A compute room runs your own authoritative logic. You write one TypeScript
file that default-exports
tick(state, inputs), the server runs it 60 times a second, and it owns the truth. Browsers send intent; yourtickdecides what actually happens and the result broadcasts to everyone. Start at the Quickstart. - A relay room decides nothing. Silt carries packets between peers and each client is its own authority. This is the lighter path for cursors, presence, and anything without contested state. Start at Relay rooms.
The same @siltrun/client talks to both, and the wire is the same; compute is
additive.
Two lanes
Section titled “Two lanes”A room gives every peer two lanes over one WebTransport connection:
- Presence — unreliable datagrams, latest-wins, the ~20Hz position firehose.
- Events — reliable, ordered, for discrete actions you can’t drop.
A plain WebSocket can’t do the unreliable lane — it head-of-line-blocks under loss. That two-lane split is what Silt is for.
import { joinRoom } from "@siltrun/client";
const room = await joinRoom("https://your-relay.example/room/lobby", { id: "alice" });
room.on("presence", (peerId, state) => { console.log(peerId, "is at", state);});
room.presence.set({ x: 10, y: 20, heading: 90 });Where to go next
Section titled “Where to go next”QuickstartWrite a room, run it locally, and connect a client.
LimitsWhat a room can and cannot do. Read before you design a game.
Build a multiplayer gameWalk the whole surface through Drift — one real 397-line game.
The two-lane modelPresence vs events — which lane carries what, and why.
API referenceEvery method and event on the @siltrun/client surface.
Wire protocolThe two-lane frame format, identity, and reconnect.
What’s live today
Section titled “What’s live today”- WebTransport hit browser Baseline (March 2026) — supported in current
Chrome, Edge, Firefox, and Safari. The client handles the datagram-writer
API migration (
datagrams.createWritable()vs the legacy.writableattribute) automatically, so datagrams work across all of them. - Scale-to-zero with wake-on-packet — a room VM that doesn’t exist until someone arrives, woken on the first inbound packet inside the QUIC handshake’s retransmit window; restore measured at ~70ms.
- Runs on Firecracker microVMs, routed by Connection-ID to the VM running that room, live today.
- Drift — the live demo. Every visitor is a moving dot in one shared room over WebTransport, across real devices on the public internet.