{"type":"excalidraw","version":2,"source":"https://AwesomeSystemDesign.dev","elements":[{"angle":0,"strokeColor":"#6577aa","backgroundColor":"#eef1fc","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-1"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-1"}],"updated":0,"link":null,"locked":false,"id":"shape-0","type":"rectangle","seed":41,"x":36,"y":32,"width":215.11624,"height":68,"customData":{"revealStep":1}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-1"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-1","type":"text","seed":114,"x":56,"y":54.3,"width":175.11624,"height":23.400000000000002,"fontSize":18,"fontFamily":1,"text":"Char | ID | Visible?","originalText":"Char | ID | Visible?","textAlign":"center","verticalAlign":"middle","containerId":"shape-0","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":1}},{"angle":0,"strokeColor":"#628572","backgroundColor":"#edf5ee","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-2"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-3"}],"updated":0,"link":null,"locked":false,"id":"shape-2","type":"rectangle","seed":187,"x":291.11624,"y":32,"width":194.22364000000002,"height":106.2,"customData":{"revealStep":2}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-2"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-3","type":"text","seed":260,"x":311.11624,"y":50,"width":154.22364000000002,"height":70.2,"fontSize":18,"fontFamily":1,"text":"'A' | (1,A) | true\n'B' | (2,A) | true\n'C' | (3,A) | true","originalText":"'A' | (1,A) | true\n'B' | (2,A) | true\n'C' | (3,A) | true","textAlign":"center","verticalAlign":"middle","containerId":"shape-2","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":2}},{"angle":0,"strokeColor":"#a68a53","backgroundColor":"#fff7e6","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-3"],"frameId":null,"roundness":null,"boundElements":[{"type":"text","id":"shape-5"}],"updated":0,"link":null,"locked":false,"id":"shape-4","type":"rectangle","seed":333,"x":36,"y":178.2,"width":556.95776,"height":1052.6,"customData":{"revealStep":3}},{"angle":0,"strokeColor":"#394557","backgroundColor":"transparent","fillStyle":"solid","strokeWidth":1.5,"strokeStyle":"solid","roughness":0.7,"opacity":100,"version":1,"versionNonce":1,"isDeleted":false,"groupIds":["step-3"],"frameId":null,"roundness":null,"boundElements":null,"updated":0,"link":null,"locked":false,"id":"shape-5","type":"text","seed":406,"x":56,"y":196.19999999999993,"width":516.95776,"height":1016.6,"fontSize":17,"fontFamily":1,"text":"CRDTs for Collaborative Editing\n\nCore idea: Design the data structure so that concurrent\noperations ALWAYS commute — no transformation needed.\n\nInstead of position-based operations (Insert at pos 3),\nassign each character a globally unique, ordered ID.\n\nSequence CRDT (e.g., RGA, LSEQ, Yjs YATA):\n\nDocument: \"ABC\"\n\nInternal representation:\n\nID format: (lamport_timestamp, user_id)\nIDs are globally unique and totally\nordered.\n\nInsert 'X' between A and B:\n→ Create ID between (1,A) and (2,A)\n→ New ID: (1.5,B) or use fractional\nindexing / tree-based IDs\n\nDelete 'B':\n→ Mark (2,A) as tombstone (visible=false)\n→ Never remove from structure\n\nYjs (most popular CRDT library):\n\nUses YATA (Yet Another Transformation\nApproach) algorithm:\n\nEach item has:\n- id: {client_id, clock}\n- left: reference to left neighbor\n- right: reference to right neighbor\n- content: the actual character(s)\n- deleted: boolean (tombstone)\n\nConcurrent inserts at same position:\n→ Deterministic ordering by client_id\n→ No transformation needed!\n\nMerging: Just integrate all items into\nthe linked list following YATA rules.\nAlways converges.","originalText":"CRDTs for Collaborative Editing\n\nCore idea: Design the data structure so that concurrent\noperations ALWAYS commute — no transformation needed.\n\nInstead of position-based operations (Insert at pos 3),\nassign each character a globally unique, ordered ID.\n\nSequence CRDT (e.g., RGA, LSEQ, Yjs YATA):\n\nDocument: \"ABC\"\n\nInternal representation:\n\nID format: (lamport_timestamp, user_id)\nIDs are globally unique and totally\nordered.\n\nInsert 'X' between A and B:\n→ Create ID between (1,A) and (2,A)\n→ New ID: (1.5,B) or use fractional\nindexing / tree-based IDs\n\nDelete 'B':\n→ Mark (2,A) as tombstone (visible=false)\n→ Never remove from structure\n\nYjs (most popular CRDT library):\n\nUses YATA (Yet Another Transformation\nApproach) algorithm:\n\nEach item has:\n- id: {client_id, clock}\n- left: reference to left neighbor\n- right: reference to right neighbor\n- content: the actual character(s)\n- deleted: boolean (tombstone)\n\nConcurrent inserts at same position:\n→ Deterministic ordering by client_id\n→ No transformation needed!\n\nMerging: Just integrate all items into\nthe linked list following YATA rules.\nAlways converges.","textAlign":"left","verticalAlign":"middle","containerId":"shape-4","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":3}}],"appState":{"viewBackgroundColor":"#fbfbf8","gridSize":null},"files":{}}