The foundation of good UX is that users should be able to predict what will happen to their data.
Before we set out to implement real-time collaborative text editing into our product, we would have expected this to be uncontroversial.
This post exists because, amazingly, after 80 years of literature, we found that nearly all systems and literature that claim to solve this problem do not pass even this simple test.
It is intended as a waypoint for people who want to implement or understand real-time, fault-tolerant, collaborative text editing in modern apps.
This blog post is intended as a waypoint for people who want to implement or understand real-time, fault-tolerant, collaborative text editing in modern apps. When we set out to work on this problem in our product, we found the literature frustratingly overcomplicated and impractical.
sdf
owfij
sdf
dsf

weoijf
sdf
lskdfjs
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vel magna porttitor, ullamcorper lacus id, tristique velit. Donec ullamcorper nisi lacus, sit amet lobortis eros placerat eget. Nunc suscipit lectus at dui vestibulum scelerisque. Suspendisse id condimentum magna, ac rhoncus nunc. Integer finibus malesuada dictum. Nulla leo risus, ornare ac ipsum ac, vehicula convallis velit. Nunc nec mi lectus. Phasellus vel est urna. Vivamus rutrum diam in sapien rutrum posuere. Donec luctus, erat lacinia sollicitudin aliquam, leo lorem varius metus, nec vulputate nisl nulla ut purus. Curabitur lobortis volutpat dui. Donec dictum ipsum in auctor blandit. Proin vel consectetur elit. Nulla consectetur massa a magna placerat viverra. Proin mauris leo, lacinia ut luctus non, convallis at justo.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed vel magna porttitor, ullamcorper lacus id, tristique velit. Donec ullamcorper nisi lacus, sit amet lobortis eros placerat eget. Nunc suscipit lectus at dui vestibulum scelerisque. Suspendisse id condimentum magna, ac rhoncus nunc. Integer finibus malesuada dictum. Nulla leo risus, ornare ac ipsum ac, vehicula convallis velit. Nunc nec mi lectus. Phasellus vel est urna. Vivamus rutrum diam in sapien rutrum posuere. Donec luctus, erat lacinia sollicitudin aliquam, leo lorem varius metus, nec vulputate nisl nulla ut purus. Curabitur lobortis volutpat dui. Donec dictum ipsum in auctor blandit. Proin vel consectetur elit. Nulla consectetur massa a magna placerat viverra. Proin mauris leo, lacinia ut luctus non, convallis at justo




megaphone



info
Feel the satisfaction of checking off boxes as you get things done.
Clear sample data
To-do list
Done
Task
Due date
Owner
1
Order donuts and popcorn for the after-party
Nov 9
Mary Jones
2
Invite people to the thumb wrestling tournament
Nov 13
Polly Rose
AC
Alexander Clemmer
3
Find a place that rents popcorn machines.
Nov 30
AC
Alexander Clemmer
There are no rows in this table

so-so
Have your team add and upvote discussion topics in the table, then discuss together.
Clear sample data
Add topic
Discussion topics
Search
Done
Idea
Author
Vote
Notes
1
Are there any blockers or dependencies to this launch?
Polly Rose
+3
Open
2
When are we expecting to launch?
James Booth
Open
3
Have we considered user testing?
Buck Dubois
Open
4
AC
Alexander Clemmer
Open
5
AC
Alexander Clemmer
Open
6
AC
Alexander Clemmer
Open
7
AC
Alexander Clemmer
Open
There are no rows in this table

Clear 0 reactions

Line Chart View of Table 3
Table 3
Category
Segment
Value
1
Category 1
Segment A
2,000
2
Category 1
Segment B
4,000
3
Category 2
Segment A
3,000
4
Category 2
Segment B
6,000
5
Category 3
Segment A
5,000
6
Category 3
Segment B
8,000
There are no rows in this table



skdjfslkdfjkdls
dsflkds
Copy to clipboard
sdfsdfds
Hello, world
Login
sdfds
Whereas disregard and contempt for human rights have resulted
We bleed a lot of serialization/API logic into the business logic layer. The ticket here is to audit our entire API usage in collab servers to tidy up the boundaries between business logic + API logic.
sdkljfds fsdl fsdlk fklj dfsd jfdjklsdkljfds fsdl fsdlk fklj dfsd jfdjklsdkljfds fsdl fsdlk fklj dfsd jfdjklsdkljf * Family fsdlk fklj dfsd jfdjklsdkljfds fsdl fsdlk fklj dfsd jfdjklsdkljfds fsdl fsdlk fklj dfsd jfdjklsdkljfds fsdl fsdlk fklj dfsd jfdjklsdkljfds fsdl fsdlk fklj dfsd jfdjklsdkljfds fsdl fsdlk fklj dfsd jfdjklsdkljfds fsdl fsdlk fklj dfsd jfdjklsdkljfds fsdl fsdlk fklj dfsd jfdjklsdkljfds fsdl fsdlk fklj dfsd jfdjklsdkljfds fsdl fsdlk fklj dfsd jfdjklsdkljfds fsdl fsdlk fklj dfsd jfdjklsdkljfds fsdl fsdlk fklj dfsd jfdjklsdkljfds fsdl fsdlk fklj dfsd jfdjkl
Many page operations are broken.
New page
Renaming page
Reordering page
Don’t support strikethrough yet.
Don’t support TODO lists yet.
Schema stuff
Should DISALLOW stuff like horizontal rules inside list items, block quotes, etc.
Escaping
We should consider escape leading # when we emit lines that are not valid headers, e.g., #5.
Code blocks
Language is not preserved on write-out.
Re-rendered on each keystroke
Scrolls into view when you edit (while normal text editing doesn’t)
AllSelection selects stuff like the “run” text.
We should probably not show the play button unless language is shell
Miscellaneous
Pressing <enter> for newline is animated when mouse is over it, lol
Table
Name
Column 2
Column 3
Notes
Text
Text days from today
Text 2
Text 3
Reactors of Text 3
Text 4
Text 5
Text 6
1
sdlkfjsdljksd
Not Started
Done
Blocked
In progress
sdkfjlsd flksd sdklfjdsl flskd flksd flsdj fkl sdlkf slkd flksj dfkj lsd lf sdlk flks jlsjd lfsd
Open
4/3/2024
266 days ago
sdfds
1
AC
Alexander Clemmer
000
54
2
sdlkjfsdlkj
Not Started
Open
000
3
Done
Open
000
4
sdfs
Open
000
5
Open
000
6
Open
000
7
Open
000
8
Open
000
9
Open
000
10
Open
000
11
Open
000
12
Open
000
13
Open
000
14
Open
000
15
Open
000
16
Open
000
17
Open
000
18
Open
000
19
Open
000
20
Open
000
21
Open
000
22
Open
000
23
Open
000
24
Open
000
25
Open
000
26
Open
000
27
Open
000
28
Open
000
29
Open
000
30
Open
000
31
Open
000
32
Open
000
33
Open
000
34
Open
000
There are no rows in this table

info
Keep track of each meeting topic in a new row, and add details in the notes column. Row order is based on the date, which can be changed in the table’s sort option.
Clear sample data
Agenda
Search
Done
Topic
Notes
Date
Added by
1
Create a workback plan for next year’s event
Tue, Jan 25
Buck Dubois
2
Share & discuss customer stories
Tue, Feb 22
Maria Marquis
3
Vote on top customer stories to amplify
Tue, Mar 1
Felix Marlin
There are no rows in this table

echo "hello world"

Table 2
Text
1
There are no rows in this table

sdlkj fjklsd



info
Organize tasks by status, due date, and owner. Insert new columns to track other relevant information, like teams, notes, or links.
Clear sample data
Tasks
Task
Owner
Status
Due date
1
Brainstorm mobile experience
James Booth
Done
Nov 9
2
Create launch plan
Joel Davis
In Progress
Nov 13
3
Squash bugs
Polly Rose
Not started
Nov 30
There are no rows in this table


info
Feel the satisfaction of checking off boxes as you get things done.
Clear sample data
To-do list 2
Done
Task
Due date
Owner
1
Order donuts and popcorn for the after-party
Nov 9
Mary Jones
2
Invite people to the thumb wrestling tournament
Nov 13
Polly Rose
3
Find a place that rents popcorn machines.
Nov 30
Polly Rose
There are no rows in this table


so-so
Have your team add and upvote discussion topics in the table, then discuss together.
Clear sample data
Add topic
Discussion topics 2
Search
Done
Idea
Author
Vote
Notes
1
Are there any blockers or dependencies to this launch?
Polly Rose
6
Open
2
When are we expecting to launch?
James Booth
2
Open
3
Have we considered user testing?
Buck Dubois
Open
There are no rows in this table




Want to print your doc?
This is not the way.
Try clicking the ⋯ next to your doc name or using a keyboard shortcut (
CtrlP
) instead.