Two people can look at the same 3D object without sharing the same task. One may be presenting a design while the other changes a dimension. A third may only need to review a saved version.
Before choosing a synchronization library, define what collaboration means in your product.
Synchronize intent, not every triangle
For a procedural configurator, a compact document may describe dimensions, materials, and features. Each client can derive its scene from that document.
Sending generated vertices for every parameter change can multiply traffic and obscure the authoritative state. But deriving geometry independently also requires compatible generator versions and consistent rules.
Record the document schema and generator version together. A shared value is not enough if clients interpret it differently.
Distinguish presence from decisions
A cursor position, active selection, or “currently editing” indicator is temporary presence. A placed door or accepted layout is durable document state.
They need different persistence and expiry behavior. Old cursors should disappear. Accepted decisions should survive a reconnect.
Do not store every pointer movement as permanent history merely because the transport makes it easy.
Choose conflict behavior in product terms
If two people move the same window, what should happen? If one deletes a wall while another adds a feature to it, which state is valid?
A CRDT can provide convergence for supported data types. It does not automatically guarantee that the converged result satisfies the application’s geometry or business rules.
You may need ownership during a drag, explicit conflict review, or validation of the resulting document. Decide this before describing the system as “conflict-free.”
The Yjs project documentation describes its shared types and synchronization ecosystem. Library capabilities should be evaluated against the conflicts your product actually permits.
Authorize every room
A room identifier is not a permission check. A person who guesses a document key should not thereby gain access to it.
Validate membership when joining and when performing consequential operations. Decide what happens when access is revoked during an active session.
Separate presenter, editor, and viewer behavior in the server’s rules. Hiding editing controls only changes the interface.
Make reconnect a first-class flow
Test a client that falls offline, changes local state, and returns after someone else has edited the document. Also test schema upgrades, expired sessions, and deleted documents.
The user needs an explanation when offline work cannot be applied safely. Silently discarding it feels like data loss; silently forcing it through can overwrite important decisions.
Provide a way to preserve a local draft or compare it with the current shared state.
Make undo belong to the editor’s intent
The current Yjs API documentation includes an UndoManager with tracked transaction origins. That lets an application distinguish selected local edits from other changes when building undo history. It does not decide whether undoing an old placement is still meaningful after a collaborator deletes its parent wall.
Group a drag into one product action and tag the transaction with its origin. Before committing a consequential derived result, validate the resulting document against current constraints. If an undo restores an invalid relationship, explain the conflict and offer a valid alternative rather than quietly inventing geometry.
A useful fixture has two editors: one changes wall length while the other positions a window. They then undo in different orders. Verify both convergence of document data and validity of the resulting building. Those are separate acceptance criteria.
Separate collaborative drafts from accepted records
A shared editing session can converge while the accepted quote remains fixed. Store a named checkpoint containing the document revision, generator version, catalog revision, and validation result. Acceptance refers to that checkpoint, not to whichever CRDT state arrives next.
When a database transaction decides whether a checkpoint can become authoritative, handle concurrency explicitly. PostgreSQL’s isolation guidance requires applications using serializable transactions to handle retries after serialization failure.
Test a disconnected editor returning after acceptance. Preserve its edits as a draft or a new revision under the product’s rules. Do not allow a late synchronization message to mutate an already accepted commercial record. Collaboration should help people work together without making their agreements move underneath them.
Keep the first release small
A shared review link with read-only presence can be valuable. So can a controlled presenter mode. Neither requires every participant to edit every field simultaneously.
Start with the collaborative behavior the customer needs, then add complexity when you can demonstrate its value.
A coherent shared document is the foundation. Animated cursors are the decoration.
Keep a good idea close.
Follow Signal Tower


