- Each contact and each deal is a Yjs document on the device, stored in IndexedDB. The page is cached by a service worker, so it opens with no network.
- A change is written on the device first. The records with changes wait in a list, and each is sent as the difference from what the server has acknowledged.
- The server keeps every update and answers with the updates from other devices since the device’s last sync. Over the WebSocket the server sends a message when there is something new, with the record each device has open.
- Text merges letter by letter. Tags, people and tasks are sets and lists that keep what both sides added. A stage, an owner, an amount or a date chosen differently on two devices keeps both values, and each device shows the conflict until a person keeps one.