Created
November 20, 2023 18:03
-
-
Save jeremyckahn/9f21bc110f37617f1dc73d6da5b92ea6 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"type": "excalidraw", | |
"version": 2, | |
"source": "https://excalidraw.com", | |
"elements": [ | |
{ | |
"id": "6epLBtPWpajrmXVOPAgjr", | |
"type": "text", | |
"x": 102.5, | |
"y": -44, | |
"width": 403.1795654296875, | |
"height": 25, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": null, | |
"seed": 1402384490, | |
"version": 73, | |
"versionNonce": 505546678, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"text": "Goal 1: Render new or existing document ", | |
"fontSize": 20, | |
"fontFamily": 1, | |
"textAlign": "left", | |
"verticalAlign": "top", | |
"baseline": 18, | |
"containerId": null, | |
"originalText": "Goal 1: Render new or existing document ", | |
"lineHeight": 1.25 | |
}, | |
{ | |
"id": "TnCddcmindlcXhGZNzv9S", | |
"type": "rectangle", | |
"x": 515, | |
"y": 86.5, | |
"width": 123, | |
"height": 335, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": { | |
"type": 3 | |
}, | |
"seed": 1773087018, | |
"version": 89, | |
"versionNonce": 1387001514, | |
"isDeleted": false, | |
"boundElements": [ | |
{ | |
"type": "text", | |
"id": "2y6_iuQTpkGR7esfUCrfy" | |
}, | |
{ | |
"id": "SLUhB6rDAHtTDnbrFAwkZ", | |
"type": "arrow" | |
}, | |
{ | |
"id": "PC7EhAVJ9PcC6HRtS1ART", | |
"type": "arrow" | |
} | |
], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false | |
}, | |
{ | |
"id": "2y6_iuQTpkGR7esfUCrfy", | |
"type": "text", | |
"x": 535.9900436401367, | |
"y": 216.5, | |
"width": 81.01991271972656, | |
"height": 75, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": null, | |
"seed": 486034410, | |
"version": 72, | |
"versionNonce": 1999872246, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"text": "WAF / \nLoad \nbalancer", | |
"fontSize": 20, | |
"fontFamily": 1, | |
"textAlign": "center", | |
"verticalAlign": "middle", | |
"baseline": 68, | |
"containerId": "TnCddcmindlcXhGZNzv9S", | |
"originalText": "WAF / Load balancer", | |
"lineHeight": 1.25 | |
}, | |
{ | |
"id": "pYxrD2qHJbAJ7KkyaGSNw", | |
"type": "rectangle", | |
"x": 220.5, | |
"y": 65, | |
"width": 196, | |
"height": 158.5, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [ | |
"KnSwhrej6gFH4MHmRJvvd" | |
], | |
"frameId": null, | |
"roundness": { | |
"type": 3 | |
}, | |
"seed": 1782243574, | |
"version": 111, | |
"versionNonce": 758122, | |
"isDeleted": false, | |
"boundElements": [ | |
{ | |
"type": "text", | |
"id": "MIbqjljFCkHXU5KFHmAKv" | |
}, | |
{ | |
"id": "YhcF3FbBRwGxWKOL3Odh9", | |
"type": "arrow" | |
}, | |
{ | |
"id": "8s66myWDUJdoOdOxzcWMK", | |
"type": "arrow" | |
}, | |
{ | |
"id": "L--XNP769pNN1MusDCeF4", | |
"type": "arrow" | |
} | |
], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false | |
}, | |
{ | |
"id": "MIbqjljFCkHXU5KFHmAKv", | |
"type": "text", | |
"x": 280.10003662109375, | |
"y": 131.75, | |
"width": 76.7999267578125, | |
"height": 25, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [ | |
"KnSwhrej6gFH4MHmRJvvd" | |
], | |
"frameId": null, | |
"roundness": null, | |
"seed": 672012598, | |
"version": 77, | |
"versionNonce": 88085046, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"text": "Browser", | |
"fontSize": 20, | |
"fontFamily": 1, | |
"textAlign": "center", | |
"verticalAlign": "middle", | |
"baseline": 18, | |
"containerId": "pYxrD2qHJbAJ7KkyaGSNw", | |
"originalText": "Browser", | |
"lineHeight": 1.25 | |
}, | |
{ | |
"type": "rectangle", | |
"version": 177, | |
"versionNonce": 2083116074, | |
"isDeleted": false, | |
"id": "f4iwGG7VtDC62MS17X6He", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"angle": 0, | |
"x": 222, | |
"y": 256.25, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"width": 196, | |
"height": 158.5, | |
"seed": 845038058, | |
"groupIds": [ | |
"KnSwhrej6gFH4MHmRJvvd" | |
], | |
"frameId": null, | |
"roundness": { | |
"type": 3 | |
}, | |
"boundElements": [ | |
{ | |
"type": "text", | |
"id": "kOL1rTh6HjczM65BRblTq" | |
}, | |
{ | |
"id": "8s66myWDUJdoOdOxzcWMK", | |
"type": "arrow" | |
}, | |
{ | |
"id": "0_D0sa2sSdIk2zI9HTLjo", | |
"type": "arrow" | |
}, | |
{ | |
"id": "2XFj1heD7mXy77hwp5RO9", | |
"type": "arrow" | |
}, | |
{ | |
"id": "5JVZiybyig-WoRu1O1rbH", | |
"type": "arrow" | |
}, | |
{ | |
"id": "5Xn_jtA_0Aq_OXSm6Cyyn", | |
"type": "arrow" | |
} | |
], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false | |
}, | |
{ | |
"type": "text", | |
"version": 139, | |
"versionNonce": 321674102, | |
"isDeleted": false, | |
"id": "kOL1rTh6HjczM65BRblTq", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"angle": 0, | |
"x": 281.60003662109375, | |
"y": 323, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"width": 76.7999267578125, | |
"height": 25, | |
"seed": 567440554, | |
"groupIds": [ | |
"KnSwhrej6gFH4MHmRJvvd" | |
], | |
"frameId": null, | |
"roundness": null, | |
"boundElements": [], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"fontSize": 20, | |
"fontFamily": 1, | |
"text": "Browser", | |
"textAlign": "center", | |
"verticalAlign": "middle", | |
"containerId": "f4iwGG7VtDC62MS17X6He", | |
"originalText": "Browser", | |
"lineHeight": 1.25, | |
"baseline": 18 | |
}, | |
{ | |
"type": "rectangle", | |
"version": 139, | |
"versionNonce": 1223802602, | |
"isDeleted": false, | |
"id": "oDnwBaY1fQlQE-tdZkZIr", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"angle": 0, | |
"x": 228, | |
"y": 434.25, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"width": 196, | |
"height": 158.5, | |
"seed": 1677878, | |
"groupIds": [ | |
"KnSwhrej6gFH4MHmRJvvd" | |
], | |
"frameId": null, | |
"roundness": { | |
"type": 3 | |
}, | |
"boundElements": [ | |
{ | |
"type": "text", | |
"id": "0-m2jAj35FMa_sIatR4ew" | |
}, | |
{ | |
"id": "hiB5K0LqrnhFs7XIfrNL7", | |
"type": "arrow" | |
}, | |
{ | |
"id": "0_D0sa2sSdIk2zI9HTLjo", | |
"type": "arrow" | |
} | |
], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false | |
}, | |
{ | |
"type": "text", | |
"version": 106, | |
"versionNonce": 1195211958, | |
"isDeleted": false, | |
"id": "0-m2jAj35FMa_sIatR4ew", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"angle": 0, | |
"x": 287.60003662109375, | |
"y": 501, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"width": 76.7999267578125, | |
"height": 25, | |
"seed": 160752502, | |
"groupIds": [ | |
"KnSwhrej6gFH4MHmRJvvd" | |
], | |
"frameId": null, | |
"roundness": null, | |
"boundElements": [], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"fontSize": 20, | |
"fontFamily": 1, | |
"text": "Browser", | |
"textAlign": "center", | |
"verticalAlign": "middle", | |
"containerId": "oDnwBaY1fQlQE-tdZkZIr", | |
"originalText": "Browser", | |
"lineHeight": 1.25, | |
"baseline": 18 | |
}, | |
{ | |
"id": "YhcF3FbBRwGxWKOL3Odh9", | |
"type": "arrow", | |
"x": 417.5, | |
"y": 140.35597707127891, | |
"width": 99, | |
"height": 104.64402292872109, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": { | |
"type": 2 | |
}, | |
"seed": 859209014, | |
"version": 121, | |
"versionNonce": 1928221098, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"points": [ | |
[ | |
0, | |
0 | |
], | |
[ | |
99, | |
104.64402292872109 | |
] | |
], | |
"lastCommittedPoint": null, | |
"startBinding": { | |
"elementId": "pYxrD2qHJbAJ7KkyaGSNw", | |
"focus": -0.5936327897525097, | |
"gap": 1 | |
}, | |
"endBinding": null, | |
"startArrowhead": null, | |
"endArrowhead": "arrow" | |
}, | |
{ | |
"id": "5JVZiybyig-WoRu1O1rbH", | |
"type": "arrow", | |
"x": 421.5, | |
"y": 337.9346389271576, | |
"width": 96.5, | |
"height": 36.43463892715761, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": { | |
"type": 2 | |
}, | |
"seed": 1755113002, | |
"version": 118, | |
"versionNonce": 924349942, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"points": [ | |
[ | |
0, | |
0 | |
], | |
[ | |
96.5, | |
-36.43463892715761 | |
] | |
], | |
"lastCommittedPoint": null, | |
"startBinding": { | |
"elementId": "f4iwGG7VtDC62MS17X6He", | |
"focus": 0.3505956063087629, | |
"gap": 3.5 | |
}, | |
"endBinding": null, | |
"startArrowhead": null, | |
"endArrowhead": "arrow" | |
}, | |
{ | |
"id": "SLUhB6rDAHtTDnbrFAwkZ", | |
"type": "arrow", | |
"x": 423.5, | |
"y": 503, | |
"width": 88.5, | |
"height": 171.1283639224245, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": { | |
"type": 2 | |
}, | |
"seed": 799448630, | |
"version": 56, | |
"versionNonce": 1028295786, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"points": [ | |
[ | |
0, | |
0 | |
], | |
[ | |
88.5, | |
-171.1283639224245 | |
] | |
], | |
"lastCommittedPoint": null, | |
"startBinding": null, | |
"endBinding": { | |
"elementId": "TnCddcmindlcXhGZNzv9S", | |
"focus": 0.16356777907582307, | |
"gap": 3 | |
}, | |
"startArrowhead": null, | |
"endArrowhead": "arrow" | |
}, | |
{ | |
"id": "kwyQj49P4JQvww4trfR9Z", | |
"type": "rectangle", | |
"x": 718, | |
"y": 135, | |
"width": 276, | |
"height": 348, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [ | |
"mDVEwjwx-Kw_0WS07GL4Z" | |
], | |
"frameId": null, | |
"roundness": { | |
"type": 3 | |
}, | |
"seed": 789468394, | |
"version": 125, | |
"versionNonce": 1305571114, | |
"isDeleted": false, | |
"boundElements": [ | |
{ | |
"id": "VXkfoYN1E__etYE7ii29o", | |
"type": "arrow" | |
}, | |
{ | |
"id": "PC7EhAVJ9PcC6HRtS1ART", | |
"type": "arrow" | |
}, | |
{ | |
"id": "92au75cL6OXmcIrN5KaKL", | |
"type": "arrow" | |
} | |
], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false | |
}, | |
{ | |
"id": "WM1_o9AKnEbkg14ofYaEC", | |
"type": "text", | |
"x": 739.5, | |
"y": 204, | |
"width": 232.49972534179688, | |
"height": 225, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [ | |
"mDVEwjwx-Kw_0WS07GL4Z" | |
], | |
"frameId": null, | |
"roundness": null, | |
"seed": 652142762, | |
"version": 398, | |
"versionNonce": 1168109686, | |
"isDeleted": false, | |
"boundElements": [ | |
{ | |
"id": "VXkfoYN1E__etYE7ii29o", | |
"type": "arrow" | |
} | |
], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"text": "Application server\n(business logic;\ncreates or updates\ndocument server-side.\nProvides session tokens\nand encryption keys.\nAggregates JSON\npatches to construct\nfull document.)", | |
"fontSize": 20, | |
"fontFamily": 1, | |
"textAlign": "left", | |
"verticalAlign": "top", | |
"baseline": 218, | |
"containerId": null, | |
"originalText": "Application server\n(business logic;\ncreates or updates\ndocument server-side.\nProvides session tokens\nand encryption keys.\nAggregates JSON\npatches to construct\nfull document.)", | |
"lineHeight": 1.25 | |
}, | |
{ | |
"id": "PC7EhAVJ9PcC6HRtS1ART", | |
"type": "arrow", | |
"x": 639, | |
"y": 264.32353948365693, | |
"width": 78, | |
"height": 23.163186058416727, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": { | |
"type": 2 | |
}, | |
"seed": 493924586, | |
"version": 138, | |
"versionNonce": 1491991018, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"points": [ | |
[ | |
0, | |
0 | |
], | |
[ | |
78, | |
23.163186058416727 | |
] | |
], | |
"lastCommittedPoint": null, | |
"startBinding": { | |
"elementId": "TnCddcmindlcXhGZNzv9S", | |
"focus": -0.04444731192886553, | |
"gap": 1 | |
}, | |
"endBinding": { | |
"elementId": "kwyQj49P4JQvww4trfR9Z", | |
"focus": -0.09193700363440571, | |
"gap": 1 | |
}, | |
"startArrowhead": null, | |
"endArrowhead": "arrow" | |
}, | |
{ | |
"id": "VXkfoYN1E__etYE7ii29o", | |
"type": "arrow", | |
"x": 995, | |
"y": 315.22204413286295, | |
"width": 33, | |
"height": 21.9677117609927, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": { | |
"type": 2 | |
}, | |
"seed": 405908650, | |
"version": 345, | |
"versionNonce": 1886810550, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"points": [ | |
[ | |
0, | |
0 | |
], | |
[ | |
33, | |
-21.9677117609927 | |
] | |
], | |
"lastCommittedPoint": null, | |
"startBinding": { | |
"elementId": "WM1_o9AKnEbkg14ofYaEC", | |
"gap": 23.000274658203125, | |
"focus": 0.48322868187940066 | |
}, | |
"endBinding": { | |
"elementId": "2gdVtT1TloPtxl85dr_vH", | |
"gap": 1.5, | |
"focus": 0.6054589058462174 | |
}, | |
"startArrowhead": null, | |
"endArrowhead": "arrow" | |
}, | |
{ | |
"id": "lMTX31bbRZj12YVb5ytY6", | |
"type": "text", | |
"x": 607.5, | |
"y": -167, | |
"width": 612.119384765625, | |
"height": 75, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": null, | |
"seed": 1475553450, | |
"version": 137, | |
"versionNonce": 392874742, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"text": "Document data format: JSON\nDocument data transfer: Encrypted JSON-diff within a CRDT\n", | |
"fontSize": 20, | |
"fontFamily": 1, | |
"textAlign": "left", | |
"verticalAlign": "top", | |
"baseline": 68, | |
"containerId": null, | |
"originalText": "Document data format: JSON\nDocument data transfer: Encrypted JSON-diff within a CRDT\n", | |
"lineHeight": 1.25 | |
}, | |
{ | |
"id": "8s66myWDUJdoOdOxzcWMK", | |
"type": "arrow", | |
"x": 319.8787188353933, | |
"y": 228, | |
"width": 0.07615069305626321, | |
"height": 19.5, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": { | |
"type": 2 | |
}, | |
"seed": 870985770, | |
"version": 38, | |
"versionNonce": 28575594, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"points": [ | |
[ | |
0, | |
0 | |
], | |
[ | |
0.07615069305626321, | |
19.5 | |
] | |
], | |
"lastCommittedPoint": null, | |
"startBinding": { | |
"elementId": "f4iwGG7VtDC62MS17X6He", | |
"focus": 0.040193094763353976, | |
"gap": 28.25 | |
}, | |
"endBinding": { | |
"elementId": "pYxrD2qHJbAJ7KkyaGSNw", | |
"focus": -0.010697455895491993, | |
"gap": 24 | |
}, | |
"startArrowhead": null, | |
"endArrowhead": "arrow" | |
}, | |
{ | |
"id": "hiB5K0LqrnhFs7XIfrNL7", | |
"type": "arrow", | |
"x": 320, | |
"y": 416, | |
"width": 1.5, | |
"height": 15, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": { | |
"type": 2 | |
}, | |
"seed": 1349492150, | |
"version": 9, | |
"versionNonce": 687995958, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"points": [ | |
[ | |
0, | |
0 | |
], | |
[ | |
1.5, | |
15 | |
] | |
], | |
"lastCommittedPoint": null, | |
"startBinding": { | |
"elementId": "oDnwBaY1fQlQE-tdZkZIr", | |
"focus": -0.03540240736370073, | |
"gap": 18.25 | |
}, | |
"endBinding": null, | |
"startArrowhead": null, | |
"endArrowhead": "arrow" | |
}, | |
{ | |
"id": "0_D0sa2sSdIk2zI9HTLjo", | |
"type": "arrow", | |
"x": 352, | |
"y": 434.5, | |
"width": 2, | |
"height": 14.5, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": { | |
"type": 2 | |
}, | |
"seed": 374019690, | |
"version": 13, | |
"versionNonce": 1565755946, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"points": [ | |
[ | |
0, | |
0 | |
], | |
[ | |
2, | |
-14.5 | |
] | |
], | |
"lastCommittedPoint": null, | |
"startBinding": { | |
"elementId": "f4iwGG7VtDC62MS17X6He", | |
"focus": 0.4191199746755302, | |
"gap": 19.75 | |
}, | |
"endBinding": { | |
"elementId": "oDnwBaY1fQlQE-tdZkZIr", | |
"focus": -0.13865147198480532, | |
"gap": 14.25 | |
}, | |
"startArrowhead": null, | |
"endArrowhead": "arrow" | |
}, | |
{ | |
"id": "2XFj1heD7mXy77hwp5RO9", | |
"type": "arrow", | |
"x": 354, | |
"y": 252.5, | |
"width": 3.5, | |
"height": 27.5, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": { | |
"type": 2 | |
}, | |
"seed": 1369600438, | |
"version": 22, | |
"versionNonce": 2065761654, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"points": [ | |
[ | |
0, | |
0 | |
], | |
[ | |
-3.5, | |
-27.5 | |
] | |
], | |
"lastCommittedPoint": null, | |
"startBinding": { | |
"elementId": "f4iwGG7VtDC62MS17X6He", | |
"focus": 0.41229656419529837, | |
"gap": 3.75 | |
}, | |
"endBinding": null, | |
"startArrowhead": null, | |
"endArrowhead": "arrow" | |
}, | |
{ | |
"id": "nsmf2fwh5GGRrv7VfjqET", | |
"type": "text", | |
"x": 692.5, | |
"y": -102.5, | |
"width": 261.99969482421875, | |
"height": 175, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": null, | |
"seed": 541525302, | |
"version": 250, | |
"versionNonce": 1594681014, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"text": "Patch structure:\n\nJSON-diff based, contains:\n\n- Diff of document change\n- Cursor position\n- User metadata", | |
"fontSize": 20, | |
"fontFamily": 1, | |
"textAlign": "left", | |
"verticalAlign": "top", | |
"baseline": 168, | |
"containerId": null, | |
"originalText": "Patch structure:\n\nJSON-diff based, contains:\n\n- Diff of document change\n- Cursor position\n- User metadata", | |
"lineHeight": 1.25 | |
}, | |
{ | |
"id": "xNu2QtGyGYFZwUhd03hCq", | |
"type": "rectangle", | |
"x": 504, | |
"y": 512, | |
"width": 169.5, | |
"height": 178.5, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": { | |
"type": 3 | |
}, | |
"seed": 1818856746, | |
"version": 68, | |
"versionNonce": 295864234, | |
"isDeleted": false, | |
"boundElements": [ | |
{ | |
"type": "text", | |
"id": "PQjn5BSaFO9u1fL-ui70T" | |
}, | |
{ | |
"id": "L--XNP769pNN1MusDCeF4", | |
"type": "arrow" | |
} | |
], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false | |
}, | |
{ | |
"id": "PQjn5BSaFO9u1fL-ui70T", | |
"type": "text", | |
"x": 527.6500625610352, | |
"y": 576.25, | |
"width": 122.19987487792969, | |
"height": 50, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": null, | |
"seed": 1192220842, | |
"version": 53, | |
"versionNonce": 896180214, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"text": "STUN/TURN\nserver", | |
"fontSize": 20, | |
"fontFamily": 1, | |
"textAlign": "center", | |
"verticalAlign": "middle", | |
"baseline": 43, | |
"containerId": "xNu2QtGyGYFZwUhd03hCq", | |
"originalText": "STUN/TURN\nserver", | |
"lineHeight": 1.25 | |
}, | |
{ | |
"id": "L--XNP769pNN1MusDCeF4", | |
"type": "arrow", | |
"x": 418.5, | |
"y": 157, | |
"width": 117, | |
"height": 350, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": { | |
"type": 2 | |
}, | |
"seed": 327600694, | |
"version": 28, | |
"versionNonce": 604504682, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"points": [ | |
[ | |
0, | |
0 | |
], | |
[ | |
117, | |
350 | |
] | |
], | |
"lastCommittedPoint": null, | |
"startBinding": { | |
"elementId": "pYxrD2qHJbAJ7KkyaGSNw", | |
"focus": -0.7690273052229344, | |
"gap": 2 | |
}, | |
"endBinding": { | |
"elementId": "xNu2QtGyGYFZwUhd03hCq", | |
"focus": -0.18975931778654645, | |
"gap": 5 | |
}, | |
"startArrowhead": null, | |
"endArrowhead": "arrow" | |
}, | |
{ | |
"id": "5Xn_jtA_0Aq_OXSm6Cyyn", | |
"type": "arrow", | |
"x": 419.5, | |
"y": 355, | |
"width": 97.5, | |
"height": 163.5, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": { | |
"type": 2 | |
}, | |
"seed": 1581131690, | |
"version": 30, | |
"versionNonce": 37695798, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"points": [ | |
[ | |
0, | |
0 | |
], | |
[ | |
97.5, | |
163.5 | |
] | |
], | |
"lastCommittedPoint": null, | |
"startBinding": { | |
"elementId": "f4iwGG7VtDC62MS17X6He", | |
"focus": -0.6049294996289454, | |
"gap": 1.5 | |
}, | |
"endBinding": null, | |
"startArrowhead": null, | |
"endArrowhead": "arrow" | |
}, | |
{ | |
"id": "CH9--Khh0yZpFStzkycjO", | |
"type": "arrow", | |
"x": 422, | |
"y": 519, | |
"width": 85.5, | |
"height": 35.5, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": { | |
"type": 2 | |
}, | |
"seed": 1197013110, | |
"version": 43, | |
"versionNonce": 695215402, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"points": [ | |
[ | |
0, | |
0 | |
], | |
[ | |
85.5, | |
35.5 | |
] | |
], | |
"lastCommittedPoint": null, | |
"startBinding": null, | |
"endBinding": null, | |
"startArrowhead": null, | |
"endArrowhead": "arrow" | |
}, | |
{ | |
"id": "3DeI_TMzeR7GyUb4eppyw", | |
"type": "text", | |
"x": 1256.5, | |
"y": -158.5, | |
"width": 643.8193359375, | |
"height": 150, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": null, | |
"seed": 1700847926, | |
"version": 297, | |
"versionNonce": 15702646, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"text": "When a user makes a change:\n1. Change is converted to an encrypted JSON diff within a CRDT\n2. Change is sent to application server\n3. Change is sent to peers\n\nChanges are debounced 500ms", | |
"fontSize": 20, | |
"fontFamily": 1, | |
"textAlign": "left", | |
"verticalAlign": "top", | |
"baseline": 143, | |
"containerId": null, | |
"originalText": "When a user makes a change:\n1. Change is converted to an encrypted JSON diff within a CRDT\n2. Change is sent to application server\n3. Change is sent to peers\n\nChanges are debounced 500ms", | |
"lineHeight": 1.25 | |
}, | |
{ | |
"id": "7WKBet1XPllqRwcWiJzz2", | |
"type": "rectangle", | |
"x": 1061.5, | |
"y": 137.5, | |
"width": 349.5, | |
"height": 306, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [ | |
"8cPMAImTmlgGrPmpWS0Hn" | |
], | |
"frameId": null, | |
"roundness": { | |
"type": 3 | |
}, | |
"seed": 2042729194, | |
"version": 186, | |
"versionNonce": 943774646, | |
"isDeleted": false, | |
"boundElements": [ | |
{ | |
"type": "text", | |
"id": "uSE_NmzDQ-BSZioGV-HUl" | |
} | |
], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false | |
}, | |
{ | |
"id": "uSE_NmzDQ-BSZioGV-HUl", | |
"type": "text", | |
"x": 1109.9001388549805, | |
"y": 278, | |
"width": 252.69972229003906, | |
"height": 25, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [ | |
"8cPMAImTmlgGrPmpWS0Hn" | |
], | |
"frameId": null, | |
"roundness": null, | |
"seed": 577308842, | |
"version": 110, | |
"versionNonce": 227828394, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"text": "Cached document storage", | |
"fontSize": 20, | |
"fontFamily": 1, | |
"textAlign": "center", | |
"verticalAlign": "middle", | |
"baseline": 18, | |
"containerId": "7WKBet1XPllqRwcWiJzz2", | |
"originalText": "Cached document storage", | |
"lineHeight": 1.25 | |
}, | |
{ | |
"id": "qecfTr9QeLS4AZEj6zNhO", | |
"type": "rectangle", | |
"x": 1451, | |
"y": 136.5, | |
"width": 340.5, | |
"height": 298, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [ | |
"8cPMAImTmlgGrPmpWS0Hn" | |
], | |
"frameId": null, | |
"roundness": { | |
"type": 3 | |
}, | |
"seed": 1094228662, | |
"version": 113, | |
"versionNonce": 240645366, | |
"isDeleted": false, | |
"boundElements": [ | |
{ | |
"type": "text", | |
"id": "Z5LlW0-C4mKiYQB5zWAYQ" | |
}, | |
{ | |
"id": "PlJxgzKQIkViYS8tOav0U", | |
"type": "arrow" | |
}, | |
{ | |
"id": "lAQtbEDnJICEMTxIQ2W5d", | |
"type": "arrow" | |
}, | |
{ | |
"id": "PjZ4yECBIgBPvUXDq3dBN", | |
"type": "arrow" | |
} | |
], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false | |
}, | |
{ | |
"id": "Z5LlW0-C4mKiYQB5zWAYQ", | |
"type": "text", | |
"x": 1473.0901794433594, | |
"y": 273, | |
"width": 296.31964111328125, | |
"height": 25, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [ | |
"8cPMAImTmlgGrPmpWS0Hn" | |
], | |
"frameId": null, | |
"roundness": null, | |
"seed": 960089526, | |
"version": 111, | |
"versionNonce": 453410154, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"text": "Persisted storage (PostGres)", | |
"fontSize": 20, | |
"fontFamily": 1, | |
"textAlign": "center", | |
"verticalAlign": "middle", | |
"baseline": 18, | |
"containerId": "qecfTr9QeLS4AZEj6zNhO", | |
"originalText": "Persisted storage (PostGres)", | |
"lineHeight": 1.25 | |
}, | |
{ | |
"id": "PlJxgzKQIkViYS8tOav0U", | |
"type": "arrow", | |
"x": 1410.5, | |
"y": 294.5, | |
"width": 39, | |
"height": 2.5, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [ | |
"8cPMAImTmlgGrPmpWS0Hn" | |
], | |
"frameId": null, | |
"roundness": { | |
"type": 2 | |
}, | |
"seed": 1570716342, | |
"version": 150, | |
"versionNonce": 1555686966, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"points": [ | |
[ | |
0, | |
0 | |
], | |
[ | |
39, | |
2.5 | |
] | |
], | |
"lastCommittedPoint": null, | |
"startBinding": null, | |
"endBinding": { | |
"elementId": "qecfTr9QeLS4AZEj6zNhO", | |
"focus": -0.14076122903012447, | |
"gap": 1.5 | |
}, | |
"startArrowhead": null, | |
"endArrowhead": "arrow" | |
}, | |
{ | |
"id": "2gdVtT1TloPtxl85dr_vH", | |
"type": "rectangle", | |
"x": 1029.5, | |
"y": 68.5, | |
"width": 1098.5, | |
"height": 403, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [ | |
"8cPMAImTmlgGrPmpWS0Hn" | |
], | |
"frameId": null, | |
"roundness": { | |
"type": 3 | |
}, | |
"seed": 2067314422, | |
"version": 177, | |
"versionNonce": 1357332522, | |
"isDeleted": false, | |
"boundElements": [ | |
{ | |
"id": "VXkfoYN1E__etYE7ii29o", | |
"type": "arrow" | |
} | |
], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false | |
}, | |
{ | |
"id": "mQ_azlM2HYsha6-RxguS5", | |
"type": "text", | |
"x": 1350.5, | |
"y": 89, | |
"width": 151.67984008789062, | |
"height": 25, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [ | |
"8cPMAImTmlgGrPmpWS0Hn" | |
], | |
"frameId": null, | |
"roundness": null, | |
"seed": 1841240810, | |
"version": 94, | |
"versionNonce": 72068982, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"text": "Document data", | |
"fontSize": 20, | |
"fontFamily": 1, | |
"textAlign": "left", | |
"verticalAlign": "top", | |
"baseline": 18, | |
"containerId": null, | |
"originalText": "Document data", | |
"lineHeight": 1.25 | |
}, | |
{ | |
"type": "rectangle", | |
"version": 175, | |
"versionNonce": 2065804010, | |
"isDeleted": false, | |
"id": "OCje6yEjL_Thkb5cCh3gs", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"angle": 0, | |
"x": 1062.5, | |
"y": 563.5, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"width": 349.5, | |
"height": 306, | |
"seed": 1800869674, | |
"groupIds": [ | |
"7qX6sfwGJlxXeFzYNCs4y" | |
], | |
"frameId": null, | |
"roundness": { | |
"type": 3 | |
}, | |
"boundElements": [ | |
{ | |
"type": "text", | |
"id": "BeCtaNWwQ8W5gUdUfxu0N" | |
} | |
], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false | |
}, | |
{ | |
"type": "text", | |
"version": 103, | |
"versionNonce": 22171830, | |
"isDeleted": false, | |
"id": "BeCtaNWwQ8W5gUdUfxu0N", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"angle": 0, | |
"x": 1132.6701202392578, | |
"y": 704, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"width": 209.15975952148438, | |
"height": 25, | |
"seed": 125739498, | |
"groupIds": [ | |
"7qX6sfwGJlxXeFzYNCs4y" | |
], | |
"frameId": null, | |
"roundness": null, | |
"boundElements": [], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"fontSize": 20, | |
"fontFamily": 1, | |
"text": "Cached chat storage", | |
"textAlign": "center", | |
"verticalAlign": "middle", | |
"containerId": "OCje6yEjL_Thkb5cCh3gs", | |
"originalText": "Cached chat storage", | |
"lineHeight": 1.25, | |
"baseline": 18 | |
}, | |
{ | |
"type": "rectangle", | |
"version": 100, | |
"versionNonce": 809549226, | |
"isDeleted": false, | |
"id": "ud9Tno5HupPA9oEshFD0J", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"angle": 0, | |
"x": 1452, | |
"y": 562.5, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"width": 340.5, | |
"height": 298, | |
"seed": 870765738, | |
"groupIds": [ | |
"7qX6sfwGJlxXeFzYNCs4y" | |
], | |
"frameId": null, | |
"roundness": { | |
"type": 3 | |
}, | |
"boundElements": [ | |
{ | |
"type": "text", | |
"id": "VDysBPcXHuTL9v3T7jYkl" | |
}, | |
{ | |
"id": "iAls-LRfw8W7dd11d27pf", | |
"type": "arrow" | |
} | |
], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false | |
}, | |
{ | |
"type": "text", | |
"version": 100, | |
"versionNonce": 2138229238, | |
"isDeleted": false, | |
"id": "VDysBPcXHuTL9v3T7jYkl", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"angle": 0, | |
"x": 1474.0901794433594, | |
"y": 699, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"width": 296.31964111328125, | |
"height": 25, | |
"seed": 1916448618, | |
"groupIds": [ | |
"7qX6sfwGJlxXeFzYNCs4y" | |
], | |
"frameId": null, | |
"roundness": null, | |
"boundElements": [], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"fontSize": 20, | |
"fontFamily": 1, | |
"text": "Persisted storage (PostGres)", | |
"textAlign": "center", | |
"verticalAlign": "middle", | |
"containerId": "ud9Tno5HupPA9oEshFD0J", | |
"originalText": "Persisted storage (PostGres)", | |
"lineHeight": 1.25, | |
"baseline": 18 | |
}, | |
{ | |
"type": "arrow", | |
"version": 124, | |
"versionNonce": 2104457322, | |
"isDeleted": false, | |
"id": "iAls-LRfw8W7dd11d27pf", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"angle": 0, | |
"x": 1411.5, | |
"y": 720.5, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"width": 39, | |
"height": 2.5, | |
"seed": 1455764010, | |
"groupIds": [ | |
"7qX6sfwGJlxXeFzYNCs4y" | |
], | |
"frameId": null, | |
"roundness": { | |
"type": 2 | |
}, | |
"boundElements": [], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"startBinding": null, | |
"endBinding": { | |
"elementId": "ud9Tno5HupPA9oEshFD0J", | |
"focus": -0.14076122903012447, | |
"gap": 1.5 | |
}, | |
"lastCommittedPoint": null, | |
"startArrowhead": null, | |
"endArrowhead": "arrow", | |
"points": [ | |
[ | |
0, | |
0 | |
], | |
[ | |
39, | |
2.5 | |
] | |
] | |
}, | |
{ | |
"type": "rectangle", | |
"version": 151, | |
"versionNonce": 1840388918, | |
"isDeleted": false, | |
"id": "9pbneuDzFx5Ceil6I9Kp7", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"angle": 0, | |
"x": 1029.5, | |
"y": 495, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"width": 817, | |
"height": 403, | |
"seed": 879844586, | |
"groupIds": [ | |
"7qX6sfwGJlxXeFzYNCs4y" | |
], | |
"frameId": null, | |
"roundness": { | |
"type": 3 | |
}, | |
"boundElements": [ | |
{ | |
"id": "92au75cL6OXmcIrN5KaKL", | |
"type": "arrow" | |
} | |
], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false | |
}, | |
{ | |
"type": "text", | |
"version": 92, | |
"versionNonce": 309910314, | |
"isDeleted": false, | |
"id": "IOvVeokkXPjTQ6uErC15y", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"angle": 0, | |
"x": 1351.5, | |
"y": 515, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"width": 106.75987243652344, | |
"height": 25, | |
"seed": 1221210026, | |
"groupIds": [ | |
"7qX6sfwGJlxXeFzYNCs4y" | |
], | |
"frameId": null, | |
"roundness": null, | |
"boundElements": [], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"fontSize": 20, | |
"fontFamily": 1, | |
"text": "Chat data", | |
"textAlign": "left", | |
"verticalAlign": "top", | |
"containerId": null, | |
"originalText": "Chat data", | |
"lineHeight": 1.25, | |
"baseline": 18 | |
}, | |
{ | |
"id": "92au75cL6OXmcIrN5KaKL", | |
"type": "arrow", | |
"x": 968, | |
"y": 483, | |
"width": 61, | |
"height": 131.5, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": { | |
"type": 2 | |
}, | |
"seed": 1961929782, | |
"version": 43, | |
"versionNonce": 309675126, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"points": [ | |
[ | |
0, | |
0 | |
], | |
[ | |
61, | |
131.5 | |
] | |
], | |
"lastCommittedPoint": null, | |
"startBinding": { | |
"elementId": "kwyQj49P4JQvww4trfR9Z", | |
"focus": -0.14304092347275824, | |
"gap": 1 | |
}, | |
"endBinding": { | |
"elementId": "9pbneuDzFx5Ceil6I9Kp7", | |
"focus": -0.739010062983597, | |
"gap": 1 | |
}, | |
"startArrowhead": null, | |
"endArrowhead": "arrow" | |
}, | |
{ | |
"id": "SCRLXHm3FGdMwmIx8Q5Qq", | |
"type": "text", | |
"x": 607.5, | |
"y": -469, | |
"width": 704.5592651367188, | |
"height": 225, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": null, | |
"seed": 294781546, | |
"version": 294, | |
"versionNonce": 1841817066, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"text": "Chat data format: JSON\nChat data transfer: Encrypted JSON payload\n\nChat messsage data structure:\n\n- Message content\n- User metadata\n\nGets sent to server for reconciliation and then echoed back to clients", | |
"fontSize": 20, | |
"fontFamily": 1, | |
"textAlign": "left", | |
"verticalAlign": "top", | |
"baseline": 218, | |
"containerId": null, | |
"originalText": "Chat data format: JSON\nChat data transfer: Encrypted JSON payload\n\nChat messsage data structure:\n\n- Message content\n- User metadata\n\nGets sent to server for reconciliation and then echoed back to clients", | |
"lineHeight": 1.25 | |
}, | |
{ | |
"id": "ofHnoU4jBCW1k1ql5U9MI", | |
"type": "text", | |
"x": 2, | |
"y": -185, | |
"width": 538.179443359375, | |
"height": 75, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": null, | |
"seed": 337169334, | |
"version": 166, | |
"versionNonce": 214221162, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700503046461, | |
"link": null, | |
"locked": false, | |
"text": "Connections:\n- WebSocket for client/server\n- WebRTC for client P2P (enhancment for lower scale)", | |
"fontSize": 20, | |
"fontFamily": 1, | |
"textAlign": "left", | |
"verticalAlign": "top", | |
"baseline": 68, | |
"containerId": null, | |
"originalText": "Connections:\n- WebSocket for client/server\n- WebRTC for client P2P (enhancment for lower scale)", | |
"lineHeight": 1.25 | |
}, | |
{ | |
"id": "zDjQhnq64-1ucQuZ4fyzE", | |
"type": "text", | |
"x": 1427, | |
"y": -362.5, | |
"width": 738.879150390625, | |
"height": 75, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": null, | |
"seed": 626326314, | |
"version": 144, | |
"versionNonce": 141007018, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"text": "Versioning:\n\n- Create a new document version at a debounced rate of every 5 minutes", | |
"fontSize": 20, | |
"fontFamily": 1, | |
"textAlign": "left", | |
"verticalAlign": "top", | |
"baseline": 68, | |
"containerId": null, | |
"originalText": "Versioning:\n\n- Create a new document version at a debounced rate of every 5 minutes", | |
"lineHeight": 1.25 | |
}, | |
{ | |
"id": "YqluD2UjMiaMdmyk5LK04", | |
"type": "ellipse", | |
"x": 1885.5, | |
"y": 110, | |
"width": 184, | |
"height": 154, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": { | |
"type": 2 | |
}, | |
"seed": 1483055222, | |
"version": 68, | |
"versionNonce": 33747818, | |
"isDeleted": false, | |
"boundElements": [ | |
{ | |
"type": "text", | |
"id": "TyzBE5esTnH70ynshpzNz" | |
}, | |
{ | |
"id": "lAQtbEDnJICEMTxIQ2W5d", | |
"type": "arrow" | |
} | |
], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false | |
}, | |
{ | |
"id": "TyzBE5esTnH70ynshpzNz", | |
"type": "text", | |
"x": 1918.05624540574, | |
"y": 174.55277784863583, | |
"width": 118.77986145019531, | |
"height": 25, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": null, | |
"seed": 2045201398, | |
"version": 27, | |
"versionNonce": 1248317494, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"text": "Patch table", | |
"fontSize": 20, | |
"fontFamily": 1, | |
"textAlign": "center", | |
"verticalAlign": "middle", | |
"baseline": 18, | |
"containerId": "YqluD2UjMiaMdmyk5LK04", | |
"originalText": "Patch table", | |
"lineHeight": 1.25 | |
}, | |
{ | |
"id": "qjhLgX2is29LCCdAvGzW4", | |
"type": "ellipse", | |
"x": 1880.5, | |
"y": 295, | |
"width": 187, | |
"height": 156, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": { | |
"type": 2 | |
}, | |
"seed": 1591058422, | |
"version": 44, | |
"versionNonce": 1290073642, | |
"isDeleted": false, | |
"boundElements": [ | |
{ | |
"type": "text", | |
"id": "KRMv8BQz25iDLeg2AcRMq" | |
}, | |
{ | |
"id": "PjZ4yECBIgBPvUXDq3dBN", | |
"type": "arrow" | |
} | |
], | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false | |
}, | |
{ | |
"id": "KRMv8BQz25iDLeg2AcRMq", | |
"type": "text", | |
"x": 1913.5255916426515, | |
"y": 322.8456710674493, | |
"width": 120.7198486328125, | |
"height": 100, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": null, | |
"seed": 432904310, | |
"version": 63, | |
"versionNonce": 413948278, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"text": "Tag table\n(presentad \nas versions \nto user)", | |
"fontSize": 20, | |
"fontFamily": 1, | |
"textAlign": "center", | |
"verticalAlign": "middle", | |
"baseline": 93, | |
"containerId": "qjhLgX2is29LCCdAvGzW4", | |
"originalText": "Tag table\n(presentad as versions to user)", | |
"lineHeight": 1.25 | |
}, | |
{ | |
"id": "lAQtbEDnJICEMTxIQ2W5d", | |
"type": "arrow", | |
"x": 1793, | |
"y": 283.5, | |
"width": 95, | |
"height": 69.5, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": { | |
"type": 2 | |
}, | |
"seed": 38281526, | |
"version": 100, | |
"versionNonce": 1509466346, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"points": [ | |
[ | |
0, | |
0 | |
], | |
[ | |
95, | |
-69.5 | |
] | |
], | |
"lastCommittedPoint": null, | |
"startBinding": { | |
"elementId": "qecfTr9QeLS4AZEj6zNhO", | |
"focus": 0.45201275619411346, | |
"gap": 1.5 | |
}, | |
"endBinding": { | |
"elementId": "YqluD2UjMiaMdmyk5LK04", | |
"focus": 0.37622567599705464, | |
"gap": 3.0629131591650207 | |
}, | |
"startArrowhead": null, | |
"endArrowhead": "arrow" | |
}, | |
{ | |
"id": "PjZ4yECBIgBPvUXDq3dBN", | |
"type": "arrow", | |
"x": 1794, | |
"y": 335, | |
"width": 87.5, | |
"height": 26, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": { | |
"type": 2 | |
}, | |
"seed": 2095954166, | |
"version": 23, | |
"versionNonce": 1477294774, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"points": [ | |
[ | |
0, | |
0 | |
], | |
[ | |
87.5, | |
26 | |
] | |
], | |
"lastCommittedPoint": null, | |
"startBinding": { | |
"elementId": "qecfTr9QeLS4AZEj6zNhO", | |
"focus": -0.00917601923957856, | |
"gap": 2.5 | |
}, | |
"endBinding": { | |
"elementId": "qjhLgX2is29LCCdAvGzW4", | |
"focus": -0.18702489172114295, | |
"gap": 1 | |
}, | |
"startArrowhead": null, | |
"endArrowhead": "arrow" | |
}, | |
{ | |
"id": "uZrQmrZmmZdZok-elhTec", | |
"type": "text", | |
"x": 155, | |
"y": -429, | |
"width": 394.51953125, | |
"height": 100, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": null, | |
"seed": 646971562, | |
"version": 104, | |
"versionNonce": 1154020266, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502799330, | |
"link": null, | |
"locked": false, | |
"text": "UX notes:\n- Web based\n- Responsive design\n- Consider limiting functionality on mobile", | |
"fontSize": 20, | |
"fontFamily": 1, | |
"textAlign": "left", | |
"verticalAlign": "top", | |
"baseline": 93, | |
"containerId": null, | |
"originalText": "UX notes:\n- Web based\n- Responsive design\n- Consider limiting functionality on mobile", | |
"lineHeight": 1.25 | |
}, | |
{ | |
"id": "xDg88X4er_BrZT0yVQQOC", | |
"type": "text", | |
"x": 1215, | |
"y": -545.5, | |
"width": 396.93951416015625, | |
"height": 100, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": null, | |
"seed": 1884707178, | |
"version": 158, | |
"versionNonce": 616147830, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502806130, | |
"link": null, | |
"locked": false, | |
"text": "Offline support:\n\n- Service worker for offline functionality\n- IndexedDB for offline storage", | |
"fontSize": 20, | |
"fontFamily": 1, | |
"textAlign": "left", | |
"verticalAlign": "top", | |
"baseline": 93, | |
"containerId": null, | |
"originalText": "Offline support:\n\n- Service worker for offline functionality\n- IndexedDB for offline storage", | |
"lineHeight": 1.25 | |
}, | |
{ | |
"id": "W2rk_fMges76wl0Ire71X", | |
"type": "text", | |
"x": 739, | |
"y": -607, | |
"width": 399.4195556640625, | |
"height": 75, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": null, | |
"seed": 1337049526, | |
"version": 125, | |
"versionNonce": 739991978, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700502846423, | |
"link": null, | |
"locked": false, | |
"text": "Conflict resolution:\n- Mostly resolved with CRDT\n- Server-side business logic is tiebreaker", | |
"fontSize": 20, | |
"fontFamily": 1, | |
"textAlign": "left", | |
"verticalAlign": "top", | |
"baseline": 68, | |
"containerId": null, | |
"originalText": "Conflict resolution:\n- Mostly resolved with CRDT\n- Server-side business logic is tiebreaker", | |
"lineHeight": 1.25 | |
}, | |
{ | |
"id": "hBdCMaKrOQVRXzdWoWPQS", | |
"type": "text", | |
"x": -11.5, | |
"y": -623, | |
"width": 660.499267578125, | |
"height": 100, | |
"angle": 0, | |
"strokeColor": "#1e1e1e", | |
"backgroundColor": "transparent", | |
"fillStyle": "solid", | |
"strokeWidth": 2, | |
"strokeStyle": "solid", | |
"roughness": 1, | |
"opacity": 100, | |
"groupIds": [], | |
"frameId": null, | |
"roundness": null, | |
"seed": 1464852598, | |
"version": 289, | |
"versionNonce": 1235186294, | |
"isDeleted": false, | |
"boundElements": null, | |
"updated": 1700503014391, | |
"link": null, | |
"locked": false, | |
"text": "Scalability strategies:\n- Degrade functionality for busy documents\n - New joiners read-only access (this defers resolution to server)\n - Don't establish WebRTC connections beyond 25 users ", | |
"fontSize": 20, | |
"fontFamily": 1, | |
"textAlign": "left", | |
"verticalAlign": "top", | |
"baseline": 93, | |
"containerId": null, | |
"originalText": "Scalability strategies:\n- Degrade functionality for busy documents\n - New joiners read-only access (this defers resolution to server)\n - Don't establish WebRTC connections beyond 25 users ", | |
"lineHeight": 1.25 | |
} | |
], | |
"appState": { | |
"gridSize": null, | |
"viewBackgroundColor": "#ffffff" | |
}, | |
"files": {} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2197.379150390625 1541" width="4394.75830078125" height="3082"> | |
<!-- svg-source:excalidraw --> | |
<defs> | |
<style class="style-fonts"> | |
@font-face { | |
font-family: "Virgil"; | |
src: url("https://excalidraw.com/Virgil.woff2"); | |
} | |
@font-face { | |
font-family: "Cascadia"; | |
src: url("https://excalidraw.com/Cascadia.woff2"); | |
} | |
@font-face { | |
font-family: "Assistant"; | |
src: url("https://excalidraw.com/Assistant-Regular.woff2"); | |
} | |
</style> | |
</defs> | |
<rect x="0" y="0" width="2197.379150390625" height="1541" fill="#ffffff"></rect><g transform="translate(124 589) rotate(0 201.58978271484375 12.5)"><text x="0" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Goal 1: Render new or existing document </text></g><g stroke-linecap="round" transform="translate(536.5 719.5) rotate(0 61.5 167.5)"><path d="M30.75 0 C47.34 0.06, 63.69 -1.61, 92.25 0 M30.75 0 C49.95 -0.21, 69.55 0.55, 92.25 0 M92.25 0 C112.47 -0.99, 122.77 8.68, 123 30.75 M92.25 0 C114.67 0.52, 123.02 7.96, 123 30.75 M123 30.75 C123.41 111.91, 122.17 193.89, 123 304.25 M123 30.75 C121.77 103.74, 121.71 176.1, 123 304.25 M123 304.25 C122.31 324.94, 111.52 336.04, 92.25 335 M123 304.25 C121.96 326.58, 114.94 335.89, 92.25 335 M92.25 335 C77.79 335.05, 65.31 335.14, 30.75 335 M92.25 335 C68.5 335.72, 45.38 334.25, 30.75 335 M30.75 335 C9.63 333.62, 0.64 324.73, 0 304.25 M30.75 335 C11.71 335.33, 1.81 323.49, 0 304.25 M0 304.25 C2.13 247.21, 2.81 188.51, 0 30.75 M0 304.25 C-0.15 228.3, -0.61 151.86, 0 30.75 M0 30.75 C1.4 9.82, 11.1 -0.94, 30.75 0 M0 30.75 C1.81 11.46, 8.13 -0.35, 30.75 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(557.4900436401367 849.5) rotate(0 40.50995635986328 37.5)"><text x="40.50995635986328" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">WAF / </text><text x="40.50995635986328" y="25" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Load </text><text x="40.50995635986328" y="50" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">balancer</text></g><g stroke-linecap="round" transform="translate(242 698) rotate(0 98 79.25)"><path d="M32 0 C63.46 -0.48, 93.36 0.03, 164 0 M32 0 C73.21 -1.3, 116.05 -0.95, 164 0 M164 0 C183.94 -1.03, 195.41 10.35, 196 32 M164 0 C183.07 -0.79, 196.81 9.99, 196 32 M196 32 C195.11 66.35, 197.76 99.59, 196 126.5 M196 32 C194.79 65.37, 195.89 99.91, 196 126.5 M196 126.5 C196.55 148.71, 184.24 158.45, 164 158.5 M196 126.5 C197.85 148.33, 184.36 157.94, 164 158.5 M164 158.5 C120.87 156.31, 76.82 155.92, 32 158.5 M164 158.5 C120.13 160.61, 78.43 160.39, 32 158.5 M32 158.5 C9.69 156.72, 1.49 146.53, 0 126.5 M32 158.5 C12.67 160.17, 1.07 146.65, 0 126.5 M0 126.5 C-0.89 89.29, -2.72 51.19, 0 32 M0 126.5 C-1.14 90.94, -0.17 55.07, 0 32 M0 32 C-1.21 12.53, 9.38 0.41, 32 0 M0 32 C-1.25 11.1, 12.47 1.33, 32 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(301.60003662109375 764.75) rotate(0 38.39996337890625 12.5)"><text x="38.39996337890625" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Browser</text></g><g stroke-linecap="round" transform="translate(243.5 889.25) rotate(0 98 79.25)"><path d="M32 0 C78.23 -2.88, 122.06 -0.63, 164 0 M32 0 C66.05 0.14, 99.46 1.31, 164 0 M164 0 C183.69 -0.69, 196.91 11.17, 196 32 M164 0 C183.98 1.23, 193.73 12.18, 196 32 M196 32 C195.43 65.31, 196.88 94.38, 196 126.5 M196 32 C195.74 55.64, 195.81 82.13, 196 126.5 M196 126.5 C197.47 149.28, 184.37 157.98, 164 158.5 M196 126.5 C197.05 147.38, 187.57 158.81, 164 158.5 M164 158.5 C122.78 157.66, 83.43 159.07, 32 158.5 M164 158.5 C118.38 158.24, 74.33 158.7, 32 158.5 M32 158.5 C11.51 158.64, 0.29 146.63, 0 126.5 M32 158.5 C11.98 160.57, -1.43 147.97, 0 126.5 M0 126.5 C0.03 104.65, 1.07 82.82, 0 32 M0 126.5 C-0.16 102.14, -0.97 77.79, 0 32 M0 32 C1.63 10.72, 9.37 0.78, 32 0 M0 32 C-1.99 12.73, 10.5 1.1, 32 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(303.10003662109375 956) rotate(0 38.39996337890625 12.5)"><text x="38.39996337890625" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Browser</text></g><g stroke-linecap="round" transform="translate(249.5 1067.25) rotate(0 98 79.25)"><path d="M32 0 C78.76 -0.7, 120.66 1.77, 164 0 M32 0 C64.23 0.37, 95.18 0.04, 164 0 M164 0 C183.98 -1.63, 197.51 9.49, 196 32 M164 0 C187.14 0.61, 195.43 11.11, 196 32 M196 32 C196.42 61.77, 194.25 96.32, 196 126.5 M196 32 C194.92 55.61, 196.19 78.65, 196 126.5 M196 126.5 C195.76 149.12, 184.59 159.86, 164 158.5 M196 126.5 C197.28 148.35, 186.96 160.78, 164 158.5 M164 158.5 C122.6 156.77, 82.93 156.86, 32 158.5 M164 158.5 C112.67 158.11, 63.25 158.04, 32 158.5 M32 158.5 C11.31 158.94, 0.36 149.26, 0 126.5 M32 158.5 C11.71 159.89, 0.17 149.43, 0 126.5 M0 126.5 C0.95 104.54, -0.46 81.73, 0 32 M0 126.5 C0.1 102.37, -0.11 80.09, 0 32 M0 32 C0.22 9.61, 11.36 -0.35, 32 0 M0 32 C-0.13 11.62, 10.45 2.14, 32 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(309.10003662109375 1134) rotate(0 38.39996337890625 12.5)"><text x="38.39996337890625" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Browser</text></g><g stroke-linecap="round"><g transform="translate(439 773.3559770712789) rotate(0 49.5 52.32201146436054)"><path d="M0.2 -0.21 C16.64 17.12, 81.45 86.26, 98.03 103.64 M-1.15 -1.36 C15.71 16.12, 83.49 86.91, 100.23 104.65" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(439 773.3559770712789) rotate(0 49.5 52.32201146436054)"><path d="M73.36 91.3 C79.67 92.97, 85.04 99.06, 100.23 104.65 M73.36 91.3 C79.13 95.15, 87.79 97.5, 100.23 104.65" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(439 773.3559770712789) rotate(0 49.5 52.32201146436054)"><path d="M88.23 77.16 C90.79 82.37, 92.46 91.98, 100.23 104.65 M88.23 77.16 C90.12 84.55, 95.02 90.47, 100.23 104.65" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(443 970.9346389271576) rotate(0 48.25 -18.217319463578804)"><path d="M-0.19 0.74 C15.98 -5.17, 80.57 -30.02, 96.63 -36.19 M-1.75 0.08 C14.31 -6.15, 79.58 -32.35, 95.74 -38.19" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(443 970.9346389271576) rotate(0 48.25 -18.217319463578804)"><path d="M73.1 -18.5 C80.42 -23.44, 85.56 -29.41, 95.74 -38.19 M73.1 -18.5 C79.92 -25.39, 86.51 -30.22, 95.74 -38.19" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(443 970.9346389271576) rotate(0 48.25 -18.217319463578804)"><path d="M65.75 -37.66 C74.88 -37.54, 81.97 -38.46, 95.74 -38.19 M65.75 -37.66 C74.81 -38.51, 83.7 -37.38, 95.74 -38.19" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(445 1136) rotate(0 44.25 -85.56418196121226)"><path d="M-0.04 -0.7 C14.55 -29.09, 73.88 -141.88, 88.64 -170.15 M-1.52 1.54 C12.83 -27.18, 72.89 -142.79, 87.77 -171.76" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(445 1136) rotate(0 44.25 -85.56418196121226)"><path d="M83.94 -142.01 C84.22 -153.41, 88.52 -165.27, 87.77 -171.76 M83.94 -142.01 C86.05 -152.97, 87.25 -163.7, 87.77 -171.76" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(445 1136) rotate(0 44.25 -85.56418196121226)"><path d="M65.71 -151.43 C73.13 -159.14, 84.56 -167.31, 87.77 -171.76 M65.71 -151.43 C74.52 -159.07, 82.34 -166.37, 87.77 -171.76" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round" transform="translate(739.5 768) rotate(0 138 174)"><path d="M32 0 C100.08 -2.59, 169.6 -1.48, 244 0 M32 0 C93.75 1.49, 154.35 1.61, 244 0 M244 0 C266.48 -0.28, 276.6 12.54, 276 32 M244 0 C267.21 2.28, 273.95 9.56, 276 32 M276 32 C275.62 105.05, 273.58 175.67, 276 316 M276 32 C278.1 109.99, 276.84 187.75, 276 316 M276 316 C276.85 336.28, 264.12 346.41, 244 348 M276 316 C277.46 335.91, 263.81 349.92, 244 348 M244 348 C190.14 348.47, 136.4 347.05, 32 348 M244 348 C181.53 348.19, 120.49 346.83, 32 348 M32 348 C9.99 347.19, 1.28 339.14, 0 316 M32 348 C12.26 349.52, -2.24 337.78, 0 316 M0 316 C2.34 255.6, 2.14 197.87, 0 32 M0 316 C1.28 240.53, 1.01 164.25, 0 32 M0 32 C0.61 9.14, 11.17 0.29, 32 0 M0 32 C-1.55 8.55, 11.98 -2.12, 32 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(761 837) rotate(0 116.24986267089844 112.5)"><text x="0" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Application server</text><text x="0" y="25" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">(business logic;</text><text x="0" y="50" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">creates or updates</text><text x="0" y="75" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">document server-side.</text><text x="0" y="100" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Provides session tokens</text><text x="0" y="125" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">and encryption keys.</text><text x="0" y="150" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Aggregates JSON</text><text x="0" y="175" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">patches to construct</text><text x="0" y="200" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">full document.)</text></g><g stroke-linecap="round"><g transform="translate(660.5 897.323539483657) rotate(0 39 11.581593029208364)"><path d="M-0.84 -0.3 C12.28 3.26, 65.23 18.51, 78.46 22.54 M0.93 -1.5 C13.94 2.72, 64.9 19.85, 77.75 23.75" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(660.5 897.323539483657) rotate(0 39 11.581593029208364)"><path d="M47.77 24.87 C55.69 25.53, 63.57 25.34, 77.75 23.75 M47.77 24.87 C58.83 24.62, 68.31 23.63, 77.75 23.75" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(660.5 897.323539483657) rotate(0 39 11.581593029208364)"><path d="M54.06 5.34 C60.41 11.44, 66.51 16.74, 77.75 23.75 M54.06 5.34 C62.68 12.14, 69.91 18.15, 77.75 23.75" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(1016.5 948.222044132863) rotate(0 16.5 -10.98385588049635)"><path d="M-0.3 -0.75 C4.93 -4.48, 26.82 -18.92, 32.55 -22.54 M1.74 1.48 C6.67 -2.08, 26.02 -17.48, 31.36 -21.3" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1016.5 948.222044132863) rotate(0 16.5 -10.98385588049635)"><path d="M20.61 -4.65 C23.68 -11.99, 28.24 -16.15, 31.36 -21.3 M20.61 -4.65 C23.45 -7.9, 25.18 -13.79, 31.36 -21.3" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1016.5 948.222044132863) rotate(0 16.5 -10.98385588049635)"><path d="M12.42 -15.45 C18.73 -18.48, 26.55 -18.33, 31.36 -21.3 M12.42 -15.45 C17.37 -15.86, 21.21 -18.96, 31.36 -21.3" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g transform="translate(629 466) rotate(0 306.0596923828125 37.5)"><text x="0" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Document data format: JSON</text><text x="0" y="25" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Document data transfer: Encrypted JSON-diff within a CRDT</text><text x="0" y="50" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge"></text></g><g stroke-linecap="round"><g transform="translate(341.3787188353933 861) rotate(0 0.038075346528131604 9.75)"><path d="M-0.26 -0.52 C-0.26 2.66, 0.45 16.08, 0.56 19.38 M0.6 0.4 C0.54 3.64, 0.44 16.79, 0.38 20.02" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(341.3787188353933 861) rotate(0 0.038075346528131604 9.75)"><path d="M-2.84 10.82 C-2.02 14.87, -0.4 18.35, 0.38 20.02 M-2.84 10.82 C-1.82 13.33, -1.05 15.67, 0.38 20.02" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(341.3787188353933 861) rotate(0 0.038075346528131604 9.75)"><path d="M3.83 10.9 C2.03 14.9, 1.04 18.36, 0.38 20.02 M3.83 10.9 C3.13 13.4, 2.19 15.73, 0.38 20.02" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(341.5 1049) rotate(0 0.75 7.5)"><path d="M-0.44 -0.23 C-0.28 2.14, 1.01 12.12, 1.24 14.68 M0.34 -0.82 C0.37 1.85, 0.4 12.72, 0.68 15.22" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(341.5 1049) rotate(0 0.75 7.5)"><path d="M-2.23 8.26 C-1.31 10.6, -0.32 12.91, 0.68 15.22 M-2.23 8.26 C-1.4 10.45, -0.48 13.03, 0.68 15.22" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(341.5 1049) rotate(0 0.75 7.5)"><path d="M2.92 8.02 C1.99 10.43, 1.12 12.82, 0.68 15.22 M2.92 8.02 C2.05 10.27, 1.28 12.93, 0.68 15.22" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(373.5 1067.5) rotate(0 1 -7.25)"><path d="M0.49 -0.29 C0.94 -2.63, 2.12 -12.18, 2.37 -14.52 M0.08 0.76 C0.52 -1.45, 1.87 -11.16, 2.13 -13.82" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(373.5 1067.5) rotate(0 1 -7.25)"><path d="M3.79 -6.69 C3.23 -8.14, 3.02 -10.09, 2.13 -13.82 M3.79 -6.69 C3.29 -8.99, 2.54 -11.39, 2.13 -13.82" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(373.5 1067.5) rotate(0 1 -7.25)"><path d="M-1.18 -7.3 C-0.55 -8.62, 0.41 -10.43, 2.13 -13.82 M-1.18 -7.3 C0.01 -9.37, 0.94 -11.56, 2.13 -13.82" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(375.5 885.5) rotate(0 -1.75 -13.75)"><path d="M-0.49 -0.14 C-1.17 -4.76, -3.31 -22.72, -3.78 -27.26 M0.26 -0.69 C-0.27 -5.51, -2.05 -23.76, -2.68 -28.1" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(375.5 885.5) rotate(0 -1.75 -13.75)"><path d="M3.55 -15.72 C1.08 -20.53, -0.67 -24.37, -2.68 -28.1 M3.55 -15.72 C1.92 -19.87, -0.73 -23.64, -2.68 -28.1" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(375.5 885.5) rotate(0 -1.75 -13.75)"><path d="M-5.87 -14.61 C-4.97 -19.78, -3.34 -24.01, -2.68 -28.1 M-5.87 -14.61 C-4.52 -19.13, -4.19 -23.26, -2.68 -28.1" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g transform="translate(714 530.5) rotate(0 130.99984741210938 87.5)"><text x="0" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Patch structure:</text><text x="0" y="25" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge"></text><text x="0" y="50" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">JSON-diff based, contains:</text><text x="0" y="75" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge"></text><text x="0" y="100" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">- Diff of document change</text><text x="0" y="125" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">- Cursor position</text><text x="0" y="150" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">- User metadata</text></g><g stroke-linecap="round" transform="translate(525.5 1145) rotate(0 84.75 89.25)"><path d="M32 0 C55.15 -1.27, 78.86 -1.11, 137.5 0 M32 0 C62.96 0.61, 92.88 -0.65, 137.5 0 M137.5 0 C157.77 -0.26, 167.99 10.55, 169.5 32 M137.5 0 C159.18 0.8, 171.29 12.42, 169.5 32 M169.5 32 C168.65 64.67, 170.42 99.08, 169.5 146.5 M169.5 32 C170.8 64.73, 170.49 95.18, 169.5 146.5 M169.5 146.5 C168.42 167.72, 160.27 178.58, 137.5 178.5 M169.5 146.5 C168.83 166.48, 157.76 177.93, 137.5 178.5 M137.5 178.5 C114.35 179.4, 95.82 178.63, 32 178.5 M137.5 178.5 C115.64 177.5, 93.67 178.46, 32 178.5 M32 178.5 C11.48 179.08, -1.25 166.65, 0 146.5 M32 178.5 C9.35 180.42, -0.01 166.62, 0 146.5 M0 146.5 C0.74 117.01, -0.76 84.62, 0 32 M0 146.5 C-0.6 122.88, -0.15 99.07, 0 32 M0 32 C-1.21 12.06, 11.26 0.22, 32 0 M0 32 C0.75 10.73, 8.51 -0.63, 32 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(549.1500625610352 1209.25) rotate(0 61.099937438964844 25)"><text x="61.099937438964844" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">STUN/TURN</text><text x="61.099937438964844" y="25" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">server</text></g><g stroke-linecap="round"><g transform="translate(440 790) rotate(0 58.5 175)"><path d="M0.94 -0.95 C20.28 57.45, 97.17 291.19, 116.7 349.65 M-0.02 1.16 C19.07 59.8, 95.93 292.69, 115.59 351" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(440 790) rotate(0 58.5 175)"><path d="M96.95 327.5 C101.88 335.25, 109.55 346.07, 115.59 351 M96.95 327.5 C102.53 334.86, 107.5 341.42, 115.59 351" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(440 790) rotate(0 58.5 175)"><path d="M116.42 321.01 C114.35 331.24, 115.06 344.37, 115.59 351 M116.42 321.01 C116.46 330.38, 115.93 338.77, 115.59 351" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(441 988) rotate(0 48.75 81.75)"><path d="M-0.11 1.12 C16.17 28.3, 81.47 135.25, 97.9 162.41 M-1.63 0.66 C14.51 28.01, 80.52 136.48, 97.16 163.38" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(441 988) rotate(0 48.75 81.75)"><path d="M73.69 144.7 C82.85 151.28, 86.58 158.09, 97.16 163.38 M73.69 144.7 C80.91 150.48, 90.26 157.95, 97.16 163.38" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(441 988) rotate(0 48.75 81.75)"><path d="M91.19 133.98 C94.77 143.92, 92.98 154.12, 97.16 163.38 M91.19 133.98 C92.31 143.64, 95.56 154.85, 97.16 163.38" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(443.5 1152) rotate(0 42.75 17.75)"><path d="M1.19 -0.22 C15.43 5.48, 70.96 28.75, 85.11 34.86 M0.36 -1.37 C14.43 4.4, 69.75 30.06, 83.96 36.06" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(443.5 1152) rotate(0 42.75 17.75)"><path d="M54.04 33.98 C61.97 33.62, 69.55 35.86, 83.96 36.06 M54.04 33.98 C66.4 34.72, 76.46 36.47, 83.96 36.06" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(443.5 1152) rotate(0 42.75 17.75)"><path d="M62.38 15.23 C68.12 20.14, 73.39 27.57, 83.96 36.06 M62.38 15.23 C71.4 23.05, 78.28 31.95, 83.96 36.06" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g transform="translate(1278 474.5) rotate(0 321.90966796875 75)"><text x="0" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">When a user makes a change:</text><text x="0" y="25" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">1. Change is converted to an encrypted JSON diff within a CRDT</text><text x="0" y="50" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">2. Change is sent to application server</text><text x="0" y="75" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">3. Change is sent to peers</text><text x="0" y="100" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge"></text><text x="0" y="125" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Changes are debounced 500ms</text></g><g stroke-linecap="round" transform="translate(1083 770.5) rotate(0 174.75 153)"><path d="M32 0 C109.5 0.73, 184 1.76, 317.5 0 M32 0 C121.25 -1.57, 211.17 -0.61, 317.5 0 M317.5 0 C338.64 0.38, 349.11 12.41, 349.5 32 M317.5 0 C338.68 1.25, 350.65 8.88, 349.5 32 M349.5 32 C348.75 96.11, 349.57 156.29, 349.5 274 M349.5 32 C348.64 108.35, 348.51 185, 349.5 274 M349.5 274 C347.6 296.04, 339.48 305.43, 317.5 306 M349.5 274 C350.36 294.67, 336.83 306.42, 317.5 306 M317.5 306 C237.11 304.88, 155.56 304.21, 32 306 M317.5 306 C226.22 307.24, 135.41 307.49, 32 306 M32 306 C10.13 304.54, -1.01 294.59, 0 274 M32 306 C11.63 306.66, -0.13 295.57, 0 274 M0 274 C1.38 194.57, 1.98 115.67, 0 32 M0 274 C-1.46 218.49, -0.09 163.76, 0 32 M0 32 C-1.16 10.15, 11.65 -2, 32 0 M0 32 C1.97 9.11, 9.03 -0.57, 32 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1131.4001388549805 911) rotate(0 126.34986114501953 12.5)"><text x="126.34986114501953" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Cached document storage</text></g><g stroke-linecap="round" transform="translate(1472.5 769.5) rotate(0 170.25 149)"><path d="M32 0 C88.46 -0.07, 142.19 1.98, 308.5 0 M32 0 C128.18 0.85, 223.23 1.85, 308.5 0 M308.5 0 C329.21 1.67, 338.61 12.5, 340.5 32 M308.5 0 C328.94 0.81, 340.53 12.6, 340.5 32 M340.5 32 C341.06 82.68, 341.31 131.39, 340.5 266 M340.5 32 C337.87 89.46, 339.06 146.99, 340.5 266 M340.5 266 C338.53 287.12, 329.8 296.03, 308.5 298 M340.5 266 C338.95 289.55, 329.91 298.18, 308.5 298 M308.5 298 C201.52 294.64, 93.47 294.75, 32 298 M308.5 298 C240.02 298.81, 172.12 298.59, 32 298 M32 298 C12.25 297.18, 0.38 288.2, 0 266 M32 298 C12.24 297.33, 1.76 287.79, 0 266 M0 266 C-0.37 189.04, -0.41 113.53, 0 32 M0 266 C0.48 217.86, 1.59 170.53, 0 32 M0 32 C0 9.98, 12.17 0.07, 32 0 M0 32 C-0.22 11.83, 12.16 0.29, 32 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1494.5901794433594 906) rotate(0 148.15982055664062 12.5)"><text x="148.15982055664062" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Persisted storage (PostGres)</text></g><g stroke-linecap="round"><g transform="translate(1432 927.5) rotate(0 19.5 1.25)"><path d="M0.35 0.2 C6.94 0.66, 33.01 2.54, 39.46 2.92 M-0.13 -0.17 C6.42 0.12, 32.79 1.63, 39.27 2.17" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1432 927.5) rotate(0 19.5 1.25)"><path d="M20.49 7.59 C26.32 6.76, 32.21 4.43, 39.27 2.17 M20.49 7.59 C25.98 5.85, 32.25 4.67, 39.27 2.17" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1432 927.5) rotate(0 19.5 1.25)"><path d="M21.4 -5.75 C26.99 -2.67, 32.61 -1.11, 39.27 2.17 M21.4 -5.75 C26.57 -3.47, 32.57 -0.62, 39.27 2.17" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round" transform="translate(1051 701.5) rotate(0 549.25 201.5)"><path d="M32 0 C437.35 1.45, 843 0.61, 1066.5 0 M32 0 C337.4 1.53, 642.24 1.65, 1066.5 0 M1066.5 0 C1086.1 -1.36, 1100.04 9.66, 1098.5 32 M1066.5 0 C1090.12 0.14, 1099.28 8.62, 1098.5 32 M1098.5 32 C1099.71 115.43, 1099.8 201.2, 1098.5 371 M1098.5 32 C1099.13 120.45, 1099.52 209.55, 1098.5 371 M1098.5 371 C1097.33 391.23, 1089.74 402.1, 1066.5 403 M1098.5 371 C1097.3 393.24, 1085.9 403.94, 1066.5 403 M1066.5 403 C766.62 403.71, 466.4 402.81, 32 403 M1066.5 403 C703.37 407.25, 340.6 406.64, 32 403 M32 403 C11.72 401.05, 0.57 392.89, 0 371 M32 403 C9.27 401.44, 1.94 393.99, 0 371 M0 371 C1.12 238.89, 0.6 104.39, 0 32 M0 371 C-2.29 288.71, -1.77 207.39, 0 32 M0 32 C-0.28 12.09, 8.79 -0.69, 32 0 M0 32 C2.29 10.82, 12.22 1.07, 32 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1372 722) rotate(0 75.83992004394531 12.5)"><text x="0" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Document data</text></g><g stroke-linecap="round" transform="translate(1084 1196.5) rotate(0 174.75 153)"><path d="M32 0 C136.39 -0.88, 242.55 1.52, 317.5 0 M32 0 C127.19 0.49, 223.28 0.86, 317.5 0 M317.5 0 C338.15 -0.72, 350.93 9.19, 349.5 32 M317.5 0 C336.86 -0.01, 351.47 9.39, 349.5 32 M349.5 32 C348.4 93.5, 346.03 156.62, 349.5 274 M349.5 32 C347.38 94.26, 348.16 157.48, 349.5 274 M349.5 274 C347.62 295.22, 340.41 306.81, 317.5 306 M349.5 274 C348.56 294.35, 339.76 307.28, 317.5 306 M317.5 306 C249.09 307.54, 181 306.93, 32 306 M317.5 306 C208.52 304.41, 97.57 303.9, 32 306 M32 306 C10.6 306.62, 0.57 295.67, 0 274 M32 306 C9.85 308.07, -0.44 296.1, 0 274 M0 274 C1.33 221.77, 3.04 167, 0 32 M0 274 C2.53 203.4, 1.9 133.93, 0 32 M0 32 C1.36 8.76, 10.71 1.24, 32 0 M0 32 C1.3 12.74, 12.29 -0.93, 32 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1154.1701202392578 1337) rotate(0 104.57987976074219 12.5)"><text x="104.57987976074219" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Cached chat storage</text></g><g stroke-linecap="round" transform="translate(1473.5 1195.5) rotate(0 170.25 149)"><path d="M32 0 C88.76 -1.1, 144.15 -2.59, 308.5 0 M32 0 C118.48 -1.61, 206.05 -1.91, 308.5 0 M308.5 0 C328.12 -0.01, 342.21 9.55, 340.5 32 M308.5 0 C328.83 -2.29, 338.41 11.92, 340.5 32 M340.5 32 C338.07 93.65, 337.79 157.25, 340.5 266 M340.5 32 C340.54 85.34, 342 139.13, 340.5 266 M340.5 266 C339.68 286.48, 330.64 299.11, 308.5 298 M340.5 266 C339.1 286.94, 330.46 297.78, 308.5 298 M308.5 298 C209.49 297.42, 106.51 299.94, 32 298 M308.5 298 C214.17 297.69, 120.12 297.58, 32 298 M32 298 C9.96 299.8, -0.38 288, 0 266 M32 298 C8.84 296.15, -1.7 286.93, 0 266 M0 266 C-1.87 177.76, -1.32 93.98, 0 32 M0 266 C0.69 207.81, 0.13 151.75, 0 32 M0 32 C1.13 12.47, 12.08 -0.81, 32 0 M0 32 C2.2 12.7, 11.27 0.3, 32 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1495.5901794433594 1332) rotate(0 148.15982055664062 12.5)"><text x="148.15982055664062" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Persisted storage (PostGres)</text></g><g stroke-linecap="round"><g transform="translate(1433 1353.5) rotate(0 19.5 1.25)"><path d="M-0.45 0.08 C6 0.57, 32.22 2.47, 38.76 2.84 M0.32 -0.36 C6.67 -0.02, 31.86 1.53, 38.2 2.05" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1433 1353.5) rotate(0 19.5 1.25)"><path d="M19.42 7.43 C25.46 5.39, 31.83 3.8, 38.2 2.05 M19.42 7.43 C23.93 6.08, 29.73 4.39, 38.2 2.05" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1433 1353.5) rotate(0 19.5 1.25)"><path d="M20.36 -5.9 C26.09 -3.76, 32.17 -1.16, 38.2 2.05 M20.36 -5.9 C24.67 -3.74, 30.22 -1.91, 38.2 2.05" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round" transform="translate(1051 1128) rotate(0 408.5 201.5)"><path d="M32 0 C196.7 1.05, 360.11 1.89, 785 0 M32 0 C202.57 -0.21, 372.28 -0.38, 785 0 M785 0 C804.52 1.09, 816.39 8.89, 817 32 M785 0 C807.18 -0.93, 815.07 9.36, 817 32 M817 32 C815 114.86, 815.29 201.28, 817 371 M817 32 C816.34 147.86, 815.67 262.86, 817 371 M817 371 C817.54 392.15, 807.59 403.05, 785 403 M817 371 C817.52 394.27, 804.75 400.98, 785 403 M785 403 C487.58 400.86, 190.83 401.11, 32 403 M785 403 C546.42 405.85, 307.67 405.39, 32 403 M32 403 C9.19 402.65, 1.4 394.05, 0 371 M32 403 C10.36 402.77, -2.23 392.84, 0 371 M0 371 C1.59 246.4, -0.03 120, 0 32 M0 371 C-0.81 247.94, -0.64 126.01, 0 32 M0 32 C0.53 10.92, 11.28 1.06, 32 0 M0 32 C-0.42 10.28, 12.74 -2.26, 32 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1373 1148) rotate(0 53.37993621826172 12.5)"><text x="0" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Chat data</text></g><g stroke-linecap="round"><g transform="translate(989.5 1116) rotate(0 30.5 65.75)"><path d="M0.67 -0.54 C10.81 21.42, 49.71 109.57, 59.96 131.6 M-0.43 1.79 C10.15 23.98, 51.71 111.31, 62.12 133.2" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(989.5 1116) rotate(0 30.5 65.75)"><path d="M40.74 112.15 C44.65 115.06, 50.57 123.51, 62.12 133.2 M40.74 112.15 C47.66 119.14, 53.91 124.71, 62.12 133.2" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(989.5 1116) rotate(0 30.5 65.75)"><path d="M59.27 103.33 C58.97 108.34, 60.69 118.79, 62.12 133.2 M59.27 103.33 C60.29 112.96, 60.71 121.31, 62.12 133.2" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g transform="translate(629 164) rotate(0 352.2796325683594 112.5)"><text x="0" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Chat data format: JSON</text><text x="0" y="25" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Chat data transfer: Encrypted JSON payload</text><text x="0" y="50" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge"></text><text x="0" y="75" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Chat messsage data structure:</text><text x="0" y="100" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge"></text><text x="0" y="125" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">- Message content</text><text x="0" y="150" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">- User metadata</text><text x="0" y="175" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge"></text><text x="0" y="200" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Gets sent to server for reconciliation and then echoed back to clients</text></g><g transform="translate(23.5 448) rotate(0 269.0897216796875 37.5)"><text x="0" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Connections:</text><text x="0" y="25" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">- WebSocket for client/server</text><text x="0" y="50" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">- WebRTC for client P2P (enhancment for lower scale)</text></g><g transform="translate(1448.5 270.5) rotate(0 369.4395751953125 37.5)"><text x="0" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Versioning:</text><text x="0" y="25" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge"></text><text x="0" y="50" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">- Create a new document version at a debounced rate of every 5 minutes</text></g><g stroke-linecap="round" transform="translate(1907 743) rotate(0 92 77)"><path d="M134.34 7.51 C145.43 11.04, 154.98 21.19, 162.74 29.36 C170.51 37.54, 177.62 46.58, 180.93 56.55 C184.23 66.53, 184.58 78.87, 182.58 89.2 C180.57 99.53, 175.5 109.97, 168.9 118.53 C162.3 127.1, 153.52 134.72, 142.99 140.58 C132.47 146.45, 118.36 151.81, 105.76 153.73 C93.16 155.64, 79.25 154.94, 67.39 152.06 C55.54 149.18, 44.21 143.26, 34.64 136.43 C25.07 129.6, 15.6 120.17, 9.97 111.08 C4.33 101.99, 1.61 92.02, 0.84 81.89 C0.06 71.77, 1.11 60.11, 5.33 50.34 C9.54 40.56, 17.17 30.87, 26.12 23.23 C35.07 15.59, 47.4 8.19, 59.03 4.48 C70.66 0.77, 82.68 -0.07, 95.89 0.98 C109.11 2.03, 130.82 8.46, 138.32 10.78 C145.82 13.1, 141.66 13.76, 140.9 14.89 M135.41 9.05 C146.34 12.35, 154.72 19.14, 162.23 27.22 C169.75 35.31, 176.98 47.41, 180.51 57.58 C184.04 67.74, 185.5 77.76, 183.41 88.22 C181.32 98.68, 174.84 111.27, 167.96 120.35 C161.08 129.42, 152.22 137.09, 142.13 142.65 C132.04 148.22, 119.76 152.31, 107.42 153.72 C95.09 155.13, 80.32 154.19, 68.12 151.11 C55.93 148.03, 44.03 141.64, 34.26 135.25 C24.48 128.86, 15.17 121.71, 9.47 112.76 C3.77 103.82, 0.59 92.27, 0.05 81.57 C-0.49 70.88, 1.91 58.31, 6.23 48.59 C10.55 38.87, 17.15 30.51, 25.95 23.26 C34.74 16.01, 47.21 8.75, 59.02 5.09 C70.84 1.44, 84.46 0.7, 96.85 1.33 C109.24 1.96, 127.22 7.3, 133.36 8.89 C139.5 10.47, 134.47 9.93, 133.69 10.86" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1939.55624540574 807.5527778486359) rotate(0 59.389930725097656 12.5)"><text x="59.389930725097656" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Patch table</text></g><g stroke-linecap="round" transform="translate(1902 928) rotate(0 93.5 78)"><path d="M51.44 8.31 C61.61 2.8, 76.66 0.35, 89.47 -0.23 C102.28 -0.81, 116.66 0.97, 128.29 4.83 C139.91 8.69, 150.37 15.21, 159.2 22.93 C168.04 30.65, 176.71 41.06, 181.29 51.17 C185.87 61.27, 187.65 73, 186.68 83.56 C185.71 94.13, 181.21 105.38, 175.47 114.55 C169.73 123.72, 162.14 132.05, 152.24 138.61 C142.33 145.17, 128.41 151.06, 116.02 153.91 C103.64 156.76, 90.2 157.45, 77.92 155.74 C65.63 154.02, 52.95 149.56, 42.32 143.61 C31.68 137.65, 20.85 129.16, 14.1 120.01 C7.35 110.86, 3.63 99.25, 1.82 88.72 C0.01 78.19, 0.01 66.87, 3.25 56.83 C6.48 46.79, 12.64 36.7, 21.24 28.48 C29.84 20.27, 48.87 10.9, 54.87 7.53 C60.86 4.16, 56.76 7.17, 57.21 8.27 M100.8 0 C112.7 -0.1, 125.57 5.48, 136.78 10.36 C147.99 15.25, 159.99 21.14, 168.05 29.32 C176.12 37.5, 182.31 49.1, 185.2 59.44 C188.08 69.77, 187.75 80.74, 185.34 91.33 C182.94 101.93, 177.67 114.35, 170.77 123.02 C163.87 131.69, 154.88 138.12, 143.93 143.35 C132.98 148.58, 117.82 153.02, 105.06 154.38 C92.3 155.75, 79.38 154.53, 67.36 151.52 C55.34 148.5, 42.39 143.08, 32.95 136.29 C23.51 129.5, 15.98 120.06, 10.72 110.77 C5.45 101.49, 2.03 90.95, 1.35 80.59 C0.67 70.23, 1.83 58.64, 6.65 48.62 C11.46 38.61, 21.2 27.91, 30.24 20.51 C39.29 13.1, 49.08 7.51, 60.9 4.19 C72.72 0.86, 94.82 0.93, 101.14 0.56 C107.47 0.18, 99.2 0.75, 98.84 1.93" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1935.0255916426515 955.8456710674493) rotate(0 60.35992431640625 50)"><text x="60.35992431640625" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Tag table</text><text x="60.35992431640625" y="25" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">(presentad </text><text x="60.35992431640625" y="50" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">as versions </text><text x="60.35992431640625" y="75" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">to user)</text></g><g stroke-linecap="round"><g transform="translate(1814.5 916.5) rotate(0 47.5 -34.75)"><path d="M0.57 -0.62 C16.48 -12.2, 79.6 -57.09, 95.42 -68.49 M-0.59 1.67 C15.2 -10.31, 78.77 -57.95, 94.7 -70.08" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1814.5 916.5) rotate(0 47.5 -34.75)"><path d="M78.38 -44.91 C82 -51.78, 89.58 -59.17, 94.7 -70.08 M78.38 -44.91 C83.97 -54.37, 90.19 -60.93, 94.7 -70.08" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1814.5 916.5) rotate(0 47.5 -34.75)"><path d="M66.01 -61.29 C73.45 -63.34, 84.72 -65.85, 94.7 -70.08 M66.01 -61.29 C75.67 -65.17, 86.07 -66.18, 94.7 -70.08" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(1815.5 968) rotate(0 43.75 13)"><path d="M0.04 0.36 C14.6 4.4, 73.18 20.96, 87.91 25.34 M-1.4 -0.5 C12.99 4.2, 72.26 22.35, 87.18 26.54" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1815.5 968) rotate(0 43.75 13)"><path d="M57.23 28.38 C68.14 28.42, 76.77 28.61, 87.18 26.54 M57.23 28.38 C68.26 27.53, 77.89 26.78, 87.18 26.54" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1815.5 968) rotate(0 43.75 13)"><path d="M63.05 8.7 C72.14 15.52, 78.76 22.5, 87.18 26.54 M63.05 8.7 C71.92 14.81, 79.48 21.05, 87.18 26.54" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g transform="translate(176.5 204) rotate(0 197.259765625 50)"><text x="0" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">UX notes:</text><text x="0" y="25" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">- Web based</text><text x="0" y="50" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">- Responsive design</text><text x="0" y="75" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">- Consider limiting functionality on mobile</text></g><g transform="translate(1236.5 87.5) rotate(0 198.46975708007812 50)"><text x="0" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Offline support:</text><text x="0" y="25" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge"></text><text x="0" y="50" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">- Service worker for offline functionality</text><text x="0" y="75" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">- IndexedDB for offline storage</text></g><g transform="translate(760.5 26) rotate(0 199.70977783203125 37.5)"><text x="0" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Conflict resolution:</text><text x="0" y="25" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">- Mostly resolved with CRDT</text><text x="0" y="50" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">- Server-side business logic is tiebreaker</text></g><g transform="translate(10 10) rotate(0 330.2496337890625 50)"><text x="0" y="0" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">Scalability strategies:</text><text x="0" y="25" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge">- Degrade functionality for busy documents</text><text x="0" y="50" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge"> - New joiners read-only access (this defers resolution to server)</text><text x="0" y="75" font-family="Virgil, Segoe UI Emoji" font-size="20px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="text-before-edge"> - Don't establish WebRTC connections beyond 25 users </text></g></svg> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment