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.

  • 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; your tick decides 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.

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 });
  • 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 .writable attribute) 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.