name: crdt
description: Loro CRDT state management with loro-mirror. Use when working on files in src/lib/crdt/.
CRDT Guidelines
Critical: Draft-Style Mutations Only
// CORRECT - mutate in place
setState((state) => {
state.transactions[id] = transaction;
});
// WRONG - returning new objects breaks change tracking
setState((state) => ({
...state,
transactions: { ...state.transactions, [id]: transaction },
}));
Rules
- Import types from
schema.ts, don't redeclare
- Soft deletes: Set
deletedAt timestamp, never remove from document
- Use
crypto.randomUUID() for IDs, Date.now() for timestamps
Schema Pattern
export const entitySchema = schema.LoroMap({
id: schema.String({ required: true }),
// ... fields
deletedAt: schema.Number(), // 0 = not deleted, >0 = timestamp
});
React Hooks
useActiveTransactions() - excludes soft-deleted
useTransactions() - includes soft-deleted
useVaultAction() - for mutations
Sync
- Updates encrypted before leaving client
- Loro handles versioning via version vectors
- Conflicts: last-write-wins per field