Open a second tab. Turn a knob. Watch it move.
the second tab opens beside this one. it only shares with tabs in this browser.
| key | value · bound to the room |
|---|---|
| seed | |
| density | |
| hueBase | |
| hueDrift | |
| symmetry |
cd forge/visual/test && npm ci && node --test room.test.mjs · real Yjs, an asynchronous channel bus: late join, convergence, the fallbackOpen a second tab. Turn a knob. Watch it move. One shared composition. Every tab is a hand on the same instrument. A Yjs document shared over BroadcastChannel. Each tab renders the same seed and parameters locally.
this browser only Only tabs in this browser share this composition.
Open a second tabChanges live in these tabs and are not saved.
Starting the room…
Open this page in another tab of the same browser. Changing a control updates the field in both tabs. Different controls can be changed together. If two tabs change the same control, they eventually agree on one value.
CRDT layer: forge/visual/shared.js (createSharedPiece) with Yjs 13.6.20 (MIT, Gate BS-1), loaded from jsDelivr. Tabs exchange a complete document snapshot on arrival, then incremental updates over BroadcastChannel. Concurrent edits to separate parameters merge; concurrent edits to one parameter converge on one value.
This page does not connect people across devices. LiveKit is a planned transport adapter, not an active connection here. Closing every tab discards the room. Private windows, browser profiles and different site origins keep separate rooms.