Drawgether originally ran on Supabase Realtime's channel model, one channel per room. Migrating to a `RoomDO` Durable Object per room code kept the same natural per-room scoping, but moved connection state, reconnection, and message relay onto infrastructure the app owns outright, with no client-side filtering by room ID needed.
The Durable Object runs on Cloudflare's hibernation API (`acceptWebSocket`), so idle connections don't keep it billed as active. Stroke segments are buffered client-side and flushed as one batched message roughly every 40ms, keeping message rates low even on the free Cloudflare plan.
One Durable Object per room acts as a websocket relay, scoped naturally per room, with no separate realtime infrastructure to run.