Building a collaborative pixel art editor with CRDTs
jakelazaroff.com
jakelazaroff.com
In the example, we have a canvas. Turn up the latency. User A draws an outline of a heart on their canvas, and User B draws a smiley face on theirs.
After the "network" catches up, the CRDT does it's thing, and our states have been synchronised. But we're left with an overlapping heart/smiley combo that neither collaborator really intended.
A really smart system might say "user A started drawing their heart a moment before User B started drawing a smiley. Even though most of the drawing happened concurrently, we will give user A's drawing the priority" (perhaps also making a backup of B's work so that it isn't lost).
Resolving conflicts in this way requires an understanding of semantics and intent - that a NN could perhaps provide a heuristic for.
Both users would have to share an intent that has more details that what a particular conflict and the current canvases have to offer. From there though, you could synthesize a compromise, like let's say choosing a color that isn't either user's first choice but is close enough to both, and also happens to be a good choice given the rest of the image. Or it decides that a compromise isn't a good idea and that choosing one of the user's edits is best.
If you didn't want to share that intent though, you are giving up your intent to the machine's intent (however it was trained), so you may as well generate two separate things and use some other tools to mix them.
If every potentially-conflicting action was followed up with a "which version do you want to keep?", it would get rather tedious.
And I don't imagine an "AI" would answer that question 100% accurately either, but it would make it a less frequent issue.
This actually isn't a great example because documentss isn't a word, but think of a case with "desert" and "desserts" or something like that.
Point is, CRDTs guarantee convergence of the text, but they don't guarantee semantic intent is maintained.
We have two other pieces of information available to add some heuristics with - position of the edit relative to start of the word, and word fit within a dictionary.
If both added an 's' to 'document', the position information and identical change value tell us they are the same update. No duplication of 's' necessary.
If instead one added an 's' while the other added 'a', the conflict could be resolved by choosing the one that fits closests to a dictionary word.
For instance:
* how and when should we merge changes?
* what if we change our minds later?
* how do we know if our data is “in sync” with another user
* what does it mean to depend on another change?
And so on. Pixelpusher is awfully naive by the standards of today but I have very fond memories of working on it with Jeff Peterson, Jim Pick, and Orion Henry.Our World of Pixels - https://news.ycombinator.com/item?id=36861302 - July 2023 (39 comments)