In Moving to a server-aware approach for collaboration, @chriszarate explains why the server needs to be at the heart of real-time collaboration, and introduces the engines we’ve been investigating to power the future of RTC. In this post, we’ll explore each of the sync engines built for RTC and the different ways they achieve collaboration. […]
In Moving to a server-aware approach for collaboration, @chriszarate explains why the server needs to be at the heart of real-time collaboration, and introduces the engines we’ve been investigating to power the future of RTC. In this post, we’ll explore each of the sync engines built for RTC and the different ways they achieve collaboration.
All engines currently live in an experimental plugin A plugin is a piece of software containing a group of functions that can be added to a WordPress website. They can extend functionality or add new features to your WordPress websites. WordPress plugins are written in the PHP programming language and integrate seamlessly with WordPress. These can be free in the WordPress.org Plugin Directory https://wordpress.org/plugins/ or can be cost-based plugin from a third-party., gutenberg-sync-engines, which you can run right now to evaluate the engines below. Our goal is to assess engine choices with your help, and choose the next engine foundation for server-side RTC in WordPress.
This post is a guide for testers and an introduction to the concepts of each engine. We’d love for you to try each engine and help us evaluate which best matches an ideal future for RTC in WordPress.
TermsHere are some common technical terms used in this post worth explaining:
Sync engines and transports are chosen under Settings → Collaboration:

The requirements for running the plugin are WordPress 7.0+ and the Presence API plugin, which is used to keep track of which users are on which post. The plugin ships an internal (lightly modified) copy of Gutenberg The Gutenberg project is the new Editor Interface for WordPress. The editor improves the process and experience of creating new content, making writing rich content much simpler. It uses ‘blocks’ to add richness rather than shortcodes, custom HTML etc. https://wordpress.org/gutenberg/ in order to make the sync engine swappable, so it will not work with another active Gutenberg plugin.
To try out the engines, follow the setup steps in the README. Select a sync engine and transport, and start editing a post in multiple browsers.
Engines: What do they have in common?In all engines, every change is processed through WordPress. When an edit arrives, the server confirms who sent it, checks they are allowed to make it, validates it for unsafe code, determines how to merge it with everyone else’s changes, and stores the result. The differences between engines are the implementations of these steps. Every engine allows multiple users to edit at the same time, works with every transport, and shows who is editing a post in varying levels of detail.
Engine 1: yjs-serverSummary: Built on the conflict A conflict occurs when a patch changes code that was modified after the patch was created. These patches are considered stale, and will require a refresh of the changes before it can be applied, or the conflicts will need to be resolved.-free replicated data type (CRDT) library Yjs, the same technology used for client-side RTC in the current Gutenberg experiment. Every browser uses the Yjs library to merge changes into a document, sending the result to the server. The server verifies changes before they are shared with other users.
Yjs is an open-source and widely used CRDT implementation. In Yjs, two copies of a document edited separately can always be combined, in any order, and both end up identical. There are no merge conflicts. The server implementation runs a PHP version of Yjs to verify changes before passing them on to other users.
Engine: yjs-serverHow your change travels to peers: You type a word. Your browser applies it locally to a copy of the editor document and sends a binary update to the server. The server opens the shared copy of the post, verifies the update, and saves it. Everyone else receives the update over the engine transport and applies it to their local copy of the document.
Strengths{ "type": "update", "data": "AAAG+/m3og8CA4IERAE0A6gAx…" }. This is efficient for update size, but can make debugging and understanding history more difficult.Summary: Most similar to single-user WordPress. People share and merge changes only when they save. The server combines incoming saves with everyone else’s, and produces merge conflicts when there is an overlap. This engine is not designed for Google Docs-style real-time editing, preferring a slower update cadence. Because changes are made via save, external plugins, scripts, or WP-CLI WP-CLI is the Command Line Interface for WordPress, used to do administrative and development tasks in a programmatic way. The project page is http://wp-cli.org/ https://make.wordpress.org/cli/ commands that change post content can take part almost as easily as human edits.
The “DE” in DE-RTC stands for Distributed Editing. @dmsnell proposed the design in WordPress/wordpress-develop#12334 and WordPress/gutenberg#79602, and we’ve ported it into the sync engines plugin. It follows a more traditional WordPress model: if saving is how people share work, then anything that can save a post can take part, including tools that are not browsers. Although DE-RTC can send advisory data over every transport, post data updates are sent via regular saves on the configured save cadence.
Engine: DE-RTC with 10 second save cadenceHow your change travels to peers: You make some changes. Every ten seconds (default), your browser sends the whole post to the server through WordPress’s normal autosave. The server merges based on three copies of the post: the version you started from, your updated version, and the current shared version on the server. Changes that do not overlap are combined automatically. When two people change a block in a way that conflicts, that block is set aside for review.
Engine: DE-RTC with 10 second save cadence. Merge dialog improvements are in progress. StrengthsBase-version: 123). This is simpler than the other engines, but requires tools to be RTC-aware.Summary: The browser sends messages describing what a person did in Gutenberg terms, and the server is in charge of keeping a log. For example “Split block 1 at index 20”, then “Add text ‘Lorem Ipsum’ to block 2”. Messages explain changes in human terms. Simultaneous changes are combined via operational transform. Incompatible changes cause conflicts like DE-RTC.
Engine: intent-logHow your change travels to peers: You type some text. Your browser describes it: “insert ‘Lorem ipsum’ at position 0 in block 1”, and sends the message to the server. The server adjusts your change to fit anything that arrived since (if a peer added three letters before yours, your insert moves three places over), adds it to the log, and sends back an answer. Conflicts are set aside for human merge review. Everyone else receives the official server-side log of actions after your changes are processed.
Example intent-log messages for the demo above:
// User B adds content to block 02f5e6c3
{
"intentId": "...",
"baseSeq": 585,
"type": "insert_text",
"payload":{
"syncId": "02f5e6c3-2876-43a6-b041-6f3d0a217095",
"field": "content",
"offset": 42,
"text": " in the editor."
}
}
// At the same time, User A merges block 02f5e6c3 into block 8d979605
{
"intentId": "...",
"baseSeq": 585,
"type": "merge_blocks",
"payload":{
"survivorId": "8d979605-e1d7-4cec-bc6e-4a3eaa6f30bc",
"absorbedId": "02f5e6c3-2876-43a6-b041-6f3d0a217095",
"field": "content",
"joinOffset": 48
}
}Strengths| yjs-server | DE-RTC | intent-log | |
|---|---|---|---|
| Updates arrive quickly? | Yes | No | Yes |
| Live cursors in the text | Yes, Google Docs-style | No | Yes (not implemented yet) |
| What the browser sends | Binary updates | The whole post | Short descriptions of edits |
| Where does the merge logic live? | Server and browser | Server | Server (with browser preview) |
| Two people make a conflicting change | Combined silently, one person wins | Set aside for review | Set aside for review |
| Outside tools | Not merged with live session | Join by naming a version | Join by naming a version |
| Server work per change | Most, grows with post size | Middle, upload grows with post size | Least |
We’re mostly concerned with engine selection in this post, but we have several transports available that all engines can support. We expect transport options to depend on hosting availability. Here’s a quick rundown of those transports:
| Transport | How it works | What it needs |
|---|---|---|
| Polling | The browser sends local updates and asks the server for updates on a timer, every N seconds. Can be adjusted anywhere from one to 25 seconds (default 5). | No special infrastructure. Works on every host, and can be scaled at the cost of PHP workers. |
| Polling with WebRTC advisory channel | The browser sends local updates and asks the server for updates on a relaxed polling timer. However, when any peer makes a change, other peers are notified via WebRTC to immediately request an update from the server instead of waiting until the next poll cycle. | Browsers that can reach each other over WebRTC. When not possible, falls back to regular polling. |
| Server-sent events | The browser keeps one connection open to WordPress and receives updates through it continuously. Local updates are sent to the polling endpoint. | Hosting that allows long-open connections. One server process per open window, can consume PHP workers. |
| Server-sent events (daemon) | The same one-way connection as server-sent events, but run on a stable, separate process instead of a general PHP worker. Local updates are sent to the polling endpoint. | A server that can run a separate process, and hosting that allows long-open connections. |
| WebSocket | A connection open in both directions, run on a separate process. Changes arrive almost instantly. | A server that can run a separate WebSocket process. |
Higher-fidelity transports are designed to be downgradable and fall back to polling. That means that if you choose a transport that relies on a separate service (such as the WebSocket daemon) and it stops responding, polling will always be available as a backup.
Call to actionTry it out and tell us what you think! When you test, please keep in mind that all three engines need polish and may have bugs. We want to hear about bugs, but care most about the major design differences between the engines and how they might affect your workflow. Are fast updates and live cursors a must for you? Do you prefer the simpler model of DE-RTC? How do you feel about the merge conflicts you encountered?
Report what you find on GitHub issues or in #feature-realtime-collaboration on WordPress Slack. For more in-depth information, see documentation in the repository:
Please let us know if there’s anything we can do to improve your testing.
| # | Наименование новости | Тональность | Информативность | Дата публикации |
|---|---|---|---|---|
| 1 | Presence API meeting summary: October 12, 2026 | 0 | 16.38 | 12-10-2026 |
| 2 | Fix Agent Failures With Context Engineering for LLMs | 0 | 6.6 | 07-07-2026 |
| 3 | Distributed and Private Textual Data Synthesis from Embeddings | 0 | 5.6 | 01-07-2027 |
| 4 | Journal Entries in FinTech: The Engine Behind Clean, Scalable Financial Data #business #miscellaneous | 0 | 13.74 | 08-04-2025 |
| 5 | Wavelo and Appledore on making AI work in real time | 0 | 10 | 07-10-2026 |
| 6 | The Role of Precision Timing in Enabling Higher Bandwidth Per Rack Without Compromising Signal Integrity or Efficiency | 0 | 10 | 13-04-2026 |
| 7 | A Non-Developer’s Guide to Understanding CORS in React | 0 | 15.57 | 03-01-2024 |
| 8 | Relatable By Design | 0 | 10 | 13-07-2026 |
| 9 | MoQ in the Fast Lane | 0 | 15.57 | 14-07-2026 |
| 10 | Building The Future Of Software In The AI-Native Era | 0 | 17.78 | 19-11-2025 |