GNU ELPA - crdt


Collaborative editing using Conflict-free Replicated Data Types
crdt-0.3.5.tar (.sig), 2024-Mar-31, 230 KiB
Qiantan Hong <>
Atom feed
Browse ELPA's repository
CGit or Gitweb

To install this package from Emacs, use package-install or list-packages.

Full description

1. Introduction

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


  • CRDT, darling child of collaborative editing researches…
  • Share multiple buffer in one session
  • See other users' cursor and region
  • Synchronize Org mode folding status
  • Org mode integration
  • Comint derivatives integration (experimental)

2. Usage

2.1. Installation

crdt.el is now on GNU ELPA! Just M-x package-install crdt.

Caution!!! Please make sure that you and your peers are on the same crdt.el version! It turns out to be one of the most common causes of crdt.el not working. Because currently the network protocol is not stablized, behavior when using mismatched versions is unexpectable.

  • Strictly speaking, it should work when crdt-protocol-version are defined (added after version 0.2.5) and the same on all peers. But why not save some hassle and keep everyone on the latest version.
  • To upgrade, just M-x package-reinstall crdt, then preferably restart Emacs. To check your crdt.el version, M-x crdt-version.

2.2. Start a shared session

A shared session is a place that can contains multiple buffers (or files), and multiple users can join to collaboratively edit those buffers (or files). Think about a meeting room with some people working together on some papers.

In some buffer, M-x crdt-share-buffer. Then enter session name. This add the current buffer to the existing session with that name. If no such exists, it creates a new session with the provided session name, and initially contains the current buffer as a shared buffer.

If a new session is to be created, you need to enter port (default to 6530), optional password and your display name (default to your current (user-full-name)).

Experimental settings: "Secure Port" specifies TLS port, and "Command Functions" specifies user permissions. It's ok to just use the default values.

2.3. Join a session

M-x crdt-connect, then enter address, port, and your display name.

If the server has provided the permission (this is the default case), connected user may also add their buffers to the session via M-x crdt-share-buffer.

2.4. Navigate through sessions

M-x crdt-list-sessions lists all sessions.

M-x crdt-list-buffers lists all buffers in current session. In the displayed buffer list, press RET in the session list to see buffers in the selected session.

You can also use M-x crdt-switch-to-buffer to interactively switch to another buffer in the current session.


In a CRDT shared buffer (either server or client), M-x crdt-list-users to list active users. In the displayed user list, press RET on an entry to goto that user's cursor position. Press f to follow that user, and press f again or M-x crdt-stop-follow to stop following.

You can also use M-x crdt-goto-next-user and M-x crdt-goto-prev-user to cycle through users' cursor positions from any CRDT shared buffer (don't need to be in the user list buffer).

2.5. Stop sharing

M-x crdt-stop-session stops a session you've started and disconnect all other users from it. This will ask for your confirmation, customize crdt-confirm-stop-session if you want to disable it.

You can also press k or d in the session list (show it by M-x crdt-list-sessions).

M-x crdt-stop-share-buffer removes current buffer from its CRDT session (this operation is only allowed at server side). You can also press k or d in the buffer list.

2.6. Disconnect from a session

M-x crdt-disconnect, then choose a session to disconnect from.

You can also press k or d in the session list (show it by M-x crdt-list-sessions).

The server Emacs has the privilege to disconnect a user from a session. To do so, press k or d on an entry in the user list (show it by M-x crdt-list-users).

2.7. Fancy stuff

Visualizing author of parts of the document
Turn on crdt-visualize-author-mode to color text based on which user authored it.
Synchronizing Org folding status
Turn on crdt-org-sync-overlay-mode. All peers that have this enabled have their folding status synchronized. Peers without enabling this minor mode are unaffected.
Comint integration
Just go ahead and share you comint REPL buffer! Tested: shell and cmuscheme. By default, when sharing a comint buffer, crdt.el temporarily reset input history (as in M-n M-p) so others don't spy into your .bash_history and alike. You can customize this behavior using variable crdt-comint-share-input-history.

2.8. What if we don't have a public IP?

There're various workaround.

  • You can use tuntox to proxy your connection over the Tox protocol. crdt.el has experimental built-in integration for tuntox. To enable it, you need to install tuntox, set up the custom variable crdt-tuntox-executable accordingly (the path to your tuntox binary), and set the custom variable crdt-use-tuntox. Setting it to t make crdt.el always create tuntox proxy for new server sessions, and setting it to 'confirm make crdt.el ask you every time when creating new sessions. After starting a session with tuntox proxy, you can M-x crdt-copy-url to copy a URL recognizable by M-x crdt-connect and share it to your friends. Be aware that according to my experience, tuntox takes significant time to establish a connection (sometimes up to half a minute), however it gets much faster after the connection is established.
  • You can use Teredo to get a public routable IPv6 address. One free software implementation is Miredo. Get it from your favorite package manager or from their website. A typical usage is (run as root)

    # /usr/local/sbin/miredo
    # ifconfig teredo

    The ifconfig command should print the information of your IPv6 address. Now your traffic go through IPv6, and once you start a crdt.el session, your friends should be able to join using the IPv6 address. For more information, see the user guide on the Miredo website.

  • You can use SSH port forwarding if you have a VPS with public IP. Example usage:

    $ ssh -R EXAMPLE.COM:6530: EXAMPLE.COM

    This make your crdt.el session on local port 6530 accessible from EXAMPLE.COM:6530.

    Note that you need to set the following /etc/ssh/sshd_config option on your VPS

    GatewayPorts yes

Old versions

crdt-0.3.4.tar.lz2022-Nov-0447.5 KiB
crdt-0.3.3.tar.lz2022-Aug-2847.5 KiB
crdt-0.3.2.tar.lz2022-Aug-1847.3 KiB
crdt-0.3.1.tar.lz2022-Aug-1647.2 KiB
crdt-0.3.0.tar.lz2022-Jul-0340.7 KiB
crdt-0.2.7.tar.lz2021-Oct-0240.4 KiB
crdt-0.2.6.tar.lz2021-Sep-3040.3 KiB
crdt-0.2.5.tar.lz2021-Sep-2640.3 KiB
crdt-0.2.4.tar.lz2021-Sep-1740.2 KiB
crdt-0.2.3.tar.lz2021-Sep-1540.2 KiB
crdt-0.2.2.tar.lz2021-Sep-1239.7 KiB
crdt-0.2.1.tar.lz2021-Sep-1239.4 KiB
crdt-0.2.0.tar.lz2021-Sep-0932.1 KiB
crdt-0.1.4.tar.lz2021-Sep-0232.6 KiB
crdt-0.1.3.tar.lz2021-Aug-3132.3 KiB
crdt-0.1.2.tar.lz2021-Aug-3032.1 KiB
crdt-0.1.1.tar.lz2021-Aug-2832.1 KiB