Skip to main content


Automerge.Text provides support for collaborative text editing. Under the hood, text is represented as a list of characters, which is edited by inserting or deleting individual characters. Compared to using a regular JavaScript array, Automerge.Text offers better performance.

You can create a Text object inside a change callback. Then you can use insertAt() and deleteAt() to insert and delete characters (same API as for list modifications, shown above):

newDoc = Automerge.change(currentDoc, (doc) => {
doc.text = new Automerge.Text();
doc.text.insertAt(0, "h", "e", "l", "l", "o");
doc.text.insertAt(0, "H");

To inspect a text object and render it, you can use the following methods (outside of a change callback):

newDoc.text.length; // returns 5, the number of characters
newDoc.text.get(0); // returns 'H', the 0th character in the text
newDoc.text.toString(); // returns 'Hello', the concatenation of all characters
for (let char of newDoc.text) console.log(char); // iterates over all characters

To figure out which regions were inserted by which users, you can use the elementId. The ElementID gives is a string of the form ${actorId}@${counter}. Here, actorId is the ID of the actor who inserted that character.

let elementId = newDoc.text.getElemId(index);
// '2@369125d35a934292b6acb580e31f3613'

Note that the actorId changes with each call to Automerge.init().