{"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":16,"y":16,"width":288,"height":93.2,"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":36,"y":34,"width":248,"height":57.2,"fontSize":22,"fontFamily":1,"text":"ID | Type | FileID |\nDetails","originalText":"ID | Type | FileID |\nDetails","textAlign":"left","verticalAlign":"middle","containerId":"shape-0","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":1}},{"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-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":16,"y":153.2,"width":288,"height":407.8,"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":36,"y":171.2,"width":248,"height":371.8,"fontSize":22,"fontFamily":1,"text":"1 | created | F1 |\n/Documents/report.pd\nf v1\n2 | created | F2 |\n/Photos/cat.jpg v1\n3 | modified | F1 |\n/Documents/report.pd\nf v2\n4 | deleted | F2 |\n/Photos/cat.jpg\n5 | moved | F1 |\n/Docs/report.pdf →\n/Archive","originalText":"1 | created | F1 |\n/Documents/report.pd\nf v1\n2 | created | F2 |\n/Photos/cat.jpg v1\n3 | modified | F1 |\n/Documents/report.pd\nf v2\n4 | deleted | F2 |\n/Photos/cat.jpg\n5 | moved | F1 |\n/Docs/report.pdf →\n/Archive","textAlign":"left","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":16,"y":605,"width":288,"height":1666.2,"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":36,"y":623,"width":248,"height":1630.2,"fontSize":22,"fontFamily":1,"text":"Sync Protocol:\nJournal-Based\nCursor Sync\n\nServer maintains an\nappend-only journal\nof all changes\nper namespace (user\naccount or shared\nfolder).\n\nJournal:\n\nClient sync protocol:\n\n1. Client stores local\ncursor\n(last_change_id =\n3)\n2. Client polls: GET\n/sync/changes?cursor\n=3\n3. Server returns:\nchanges 4 and 5\n4. Client applies:\n→ Delete cat.jpg\nlocally\n→ Move report.pdf to\n/Archive\n5. Client updates\ncursor to 5\n\nPush notification for\ninstant sync:\n• Server pushes\n\"changes available\"\nvia long-poll /\nWebSocket\n• Client immediately\nfetches changes (no\nperiodic polling)\n• Fallback: poll every\n60 seconds if push\nfails\n\nFirst sync (new\ndevice):\n• cursor = null →\nserver returns ALL\nfiles (paginated)\n• Client downloads\nfile tree + block\nhashes\n• Downloads blocks\nas needed\n(already-local blocks\nskipped)","originalText":"Sync Protocol:\nJournal-Based\nCursor Sync\n\nServer maintains an\nappend-only journal\nof all changes\nper namespace (user\naccount or shared\nfolder).\n\nJournal:\n\nClient sync protocol:\n\n1. Client stores local\ncursor\n(last_change_id =\n3)\n2. Client polls: GET\n/sync/changes?cursor\n=3\n3. Server returns:\nchanges 4 and 5\n4. Client applies:\n→ Delete cat.jpg\nlocally\n→ Move report.pdf to\n/Archive\n5. Client updates\ncursor to 5\n\nPush notification for\ninstant sync:\n• Server pushes\n\"changes available\"\nvia long-poll /\nWebSocket\n• Client immediately\nfetches changes (no\nperiodic polling)\n• Fallback: poll every\n60 seconds if push\nfails\n\nFirst sync (new\ndevice):\n• cursor = null →\nserver returns ALL\nfiles (paginated)\n• Client downloads\nfile tree + block\nhashes\n• Downloads blocks\nas needed\n(already-local blocks\nskipped)","textAlign":"left","verticalAlign":"middle","containerId":"shape-4","lineHeight":1.3,"autoResize":false,"customData":{"revealStep":3}}],"appState":{"viewBackgroundColor":"#fbfbf8","gridSize":null},"files":{}}