Code (Implementations)

General-purpose CRDT libraries

There are several open source CRDT libraries that can be used to build collaborative applications and replicated storage systems:

  • Automerge (extended abstract) is a JavaScript CRDT implementation with a JSON data model. Network communication is handled by a separate layer, such as Hypermerge (which uses Dat) or plain TCP connections.

  • GUN (GitHub) is a graph CRDT implemented in JavaScript, using WebRTC networking. It includes public-key-based user authentication and encryption.

  • kappa-db is a JavaScript library for building your own CRDTs over append-only log architectures, with a reference implementation for Dat’s Hypercore data structure. Sort of a ‘build-your-own’ Automerge library.

  • Replicated Object Notation (RON) is a data format for encoding CRDT operations, implemented in several languages. It supports register, list, text, set, and counter datatypes. SwarmDB is a RON-based database, implemented in JavaScript.

  • Yjs (paper 1, paper 2) is a modular framework for building collaborative applications on the web. It includes several common CRDTs and modules that integrate them with different editors, communication protocols, and databases. More information in this series of blog posts about Yjs.

  • Legion (GitHub, paper) provides a JavaScript implementation of counter, set, map, and list CRDTs, and a WebRTC-based networking layer.

  • Yorkie (GitHub) is a synchronization solution for building collaborative applications, using MongoDB for data storage.

  • The Akka actor framework includes implementations of several CRDTs.

  • Schism is a Clojure implementation of several CRDTs.

  • Erlang implementation of CRDTs from the Lasp system

  • Carlos Baquero’s C++ implementation of state-based CRDTs with delta mutations.

  • Eventuate is a toolkit for building applications using causally ordered event streams and CRDTs.

  • Logux (GitHub) is a state sync system built primarily for React/Redux in a client/server architecture, but can be used p2p and/or on its own.

  • Braid-HTTP (GitHub, IETF draft) is an effort to augment the HTTP protocol itself to include state synchronization as a primitive.

  • Hyper Hyper Space (GitHub, Demo) Decouple data from the apps that handle it. A library for creating fully in-browser (webrtc & indexeddb based) interoperable p2p apps. Uses operational CRDTs for mutability.

  • m-ld synchronises decentralised replicas of JSON-LD graph data, with a query API and pluggable networking and persistence.

Benchmarks

  • crdt-benchmarks compares document size and performance of Yjs and Automerge.

Distributed databases

Several distributed databases also have built-in support for CRDTs:

Distributed file systems

  • Elmerfs: A distributed file system, with a FUSE interface, written in Rust. It uses CRDTs to avoid structural conflicts. Built above AntidoteDB.

Text editors

Several text editors use CRDTs:

  • crdt.el is a real-time collaborative editing environment for Emacs using Conflict-free Replicated Data Types.

  • The Teletype package for the Atom text editor uses a CRDT to enable real-time collaboration (talk). Tandem further extends this support to other text editors.

  • The Conclave text editor (a research project) supports peer-to-peer collaboration based on the LSEQ CRDT.

  • MUTE (the Multi-User Text Editor, a research project) also supports CRDT-based peer-to-peer collaboration.

  • The Xi text editor is currently only single-user, not collaborative, but it nevertheless uses CRDTs internally to allow plugins to run concurrently with the user thread, and hence improve performance.

  • Apple’s Notes app on iOS appears to be built upon CRDTs, as evidenced by header files in the operating system.

  • PeerPad (GitHub) is a collaborative text editor based on IPFS and CRDTs.

Other applications

Several other applications and systems also use CRDTs internally:

  • Actual, a budgeting app, uses CRDTs to allow sync across multiple user devices.

  • Figma, a collaborative graphic design app, uses CRDTs (and occasionally a central server to simplify things) as well.

  • Pixelboard, a collaborative whiteboarding app, uses CRDTs to allow several people to draw at the same time.

  • TomTom GPS navigation systems use CRDTs to synchronise user data, such as favourite locations, across multiple devices.

  • Facebook’s OpenR routing platform internally uses CRDTs to manage its state.

  • Bet365, League of Legends, and PayPal have all reported using CRDTs internally.

  • Mapeo, a toolset mapping and monitoring human and environmental rights abuses uses CRDTs for syncronizing edits to maps.

  • Cobox, a collaborative data hosting platform uses CRDTs to syncronize edits to files on disk.

  • RetroShare, a friend to friend communication platform uses GXS (General eXchange System) which have CRDT properties to implement decentralized forums, blogs, mailing system etc.

Automerge users

Several collaborative (multi-user, multi-device) applications have been built using the Automerge CRDT library:

Yjs users

Yjs is used by several apps that are run in production:

  • JupyterLab is a web interface for the computational environment Jupyter.

  • Serenity Notes is an end-to-end encrypted collaborative notes app.

  • Nimbus Note is a note-taking app by Nimbus Web.

  • http://coronavirustechhandbook.com/ is a collaborative document that is edited by thousands of different people to work on a rapid and sophisticated response to the coronavirus outbreak and subsequent impacts.

  • Relm is a collaborative gameworld for teamwork and community.

  • JoeDocs is an open collaborative wiki.

  • Room.sh is a meeting application with integrated collaborative drawing, editing, and coding tools.

  • Pluxbox RadioManager is a web-based app to collaboratively organize radio broadcasts.

  • Cattaz is a wiki that can run custom applications in the wiki pages.

Other approaches for automatic conflict resolution

Libraries and applications that implement alternative conflict resolution techniques that are not CRDTs.

  • Fluid Framework is a collection of client libraries for distributing and synchronizing shared state, based on a CRDT-inspired distributed data structure.