Set up the workspace and the room connection
A Bun workspace with three packages and two apps, and enough of the wire to prove the shape works: a WebSocket carrying one room, identity asserted at the upgrade, and presence relayed to everyone already there. Identity is a claimed GitHub handle, stored per tab rather than per origin so two tabs are two people. The socket URL is derived from `location` and never configured, so localhost, a LAN address and a tunnel all work from one build; Vite proxies `/ws` in development so the browser sees a single origin in either mode. A browser cannot read the status of a refused upgrade, so a connection that never opened asks the same endpoint over HTTP to find out why. Otherwise a rejected access key is indistinguishable from an unreachable server, and the client would back off against a door that will not open. Lexical, Yjs and React are deduped in Vite up front: two copies of Lexical throw `incompatible editors` and every node operation fails quietly afterwards.
28 files changed+2014-0
StackedSplit