Sync overview
Sync keeps every device on the same household history. Each change is a domain mutation in a durable outbox. A server sequencer assigns a monotone server_seq. Clients pull operations after their cursor and replay any still-pending local work. There is no Dropbox-style file copy.
What is pushed
- You edit the register, or a device materializes a reminder occurrence.
- The mutation is applied locally and written to the outbox before the UI confirms.
- When the device is online it pushes the batch. The same op id or idempotency key is a no-op (exactly once).
- The cursor advances only after the batch commits. Closing the app is safe; pending work is retried.
Two devices that auto-record the same monthly reminder both emit MaterializeOccurrence(reminder, due date). After they reconnect, exactly one transaction exists for that occurrence.
Modes
- Cloud sync — the sequencer can read plaintext and enforce invariants.
- Private sync — payloads are encrypted on the device. The server is a blind relay plus sequencer. You hold a recovery key.
PowerSync is a documented fallback only. This release uses the custom op-log.
Restores and repair
Restoring a backup is a new epoch. The app shows a confirm-diff and does not change server data until you accept. Rejecting rebuilds this device from the server and leaves other devices alone. Rebuild this device wipes local state and reapplies the snapshot plus the tail.