Technical Post-Mortem: Why Real-Time Collaboration Was Pulled from WordPress 7.0

Here is a technical breakdown of the five reasons why RTC was pulled, and what it means for the engineering side of WordPress.


The WordPress community recently received a major update regarding the roadmap for version 7.0. In a pivotal announcement, Matt Mullenweg confirmed that **Real-Time Collaboration (RTC)**—the crown jewel of Gutenberg Phase 3—will not ship with the 7.0 release.

As developers, we know that “Real-Time” is often a synonym for “Complex.” Moving from a single-user state to a synchronized multi-user state is a fundamental paradigm shift.

Here is a technical breakdown of the five reasons why RTC was pulled, and what it means for the engineering side of WordPress.


1. The “Surface Area” Problem

WordPress isn’t just a post editor; it’s a Full Site Editor (FSE). RTC needs to work across paragraph blocks, global styles, template parts, and navigation menus.

When you increase the surface area, you increase the potential for **state desynchronization**. If a user is editing a Global Header while another is adjusting a Template, the dependency graph becomes a nightmare to manage in real-time.

2. Race Conditions in Collaborative Editing

In a standard WordPress setup, the last person to click “Update” wins. In RTC, we use algorithms like **CRDTs (Conflict-free Replicated Data Types)** or **Operational Transformation (OT)** to merge changes.

If two users edit the same block attribute simultaneously, a “race condition” occurs. If the logic isn’t perfect, you end up with “zombie” data.

**Conceptual example of a failing sync state:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// User A and User B both send an update to the same block simultaneously
// Without a robust RTC engine, the state becomes unpredictable

{
  "blockId": "uuid-1234",
  "attributes": {
    "content": "User A's edit", // Sent at 12:00:00.001
    "fontSize": "22px"        // User B sent this at 12:00:00.002
  }
}
// Race condition: Does the UI render the content update OR the font change first?
// In 7.0 testing, these conflicts were causing React to throw fatal 'Minified State' errors.

3. Server Load and Scaling Bottlenecks

Most WordPress sites run on stateless PHP environments (Nginx/Apache). RTC, however, is inherently stateful.

To make RTC work, the server needs to keep track of who is doing what, right now. While SaaS tools use WebSockets (Node.js/Go), many WordPress hosts don’t support persistent socket connections. This forces a fallback to Long Polling, which can crush a shared hosting server.

The Polling Nightmare:

JavaScript

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// A simplified version of what "Heartbeat" polling looks like under heavy RTC
async function syncCollaborativeChanges() {
    const response = await fetch('/wp-json/wp/v2/sync/123');
    const data = await response.json();
    
    // Imagine 10 authors polling this every 500ms...
    // That is 1,200 requests per minute just to check for changes.
    updateEditorState(data);
    
    setTimeout(syncCollaborativeChanges, 500); 
}

The Core team realized that shipping this would likely crash thousands of sites hosted on entry-level servers that aren’t optimized for high-concurrency REST API traffic.

4. Memory Efficiency & Client-Side Bloat

Collaborative engines (like Yjs or Automerge) maintain a “history” of every change to resolve conflicts. On long-form posts with thousands of edits, this history grows in the browser’s memory.

During fuzz testing, it was discovered that the RTC implementation was consuming massive amounts of RAM. For users on lower-end hardware, the browser tab would simply hang. As a “Democratizer of Publishing,” WordPress cannot ship a feature that excludes users with older computers.

5. Fuzz Testing & Edge Case Bugs

The team used Fuzzing—an automated testing technique that injects random, chaotic data into the editor. This revealed recurring bugs where the block tree would “break” (invalid HTML) when multiple users performed complex actions like “Nested Inner Block Drag-and-Drop” simultaneously.

Bash

1
2
3
4
5
# Example of a conceptual Fuzz Test command that likely failed
npm run test:fuzz --target=collaboration-engine --intensity=high

# Result: 
# [FAIL] Block Validation Error: Expected but found corrupted buffer.

The Silver Lining for Developers

While the delay is disappointing, it’s a win for stability. If you are a plugin developer, this gives you more time to ensure your custom blocks are “Collaboration Ready.”

What you should do now:

  1. Audit your save() and edit() functions: Ensure they are pure and don’t rely on side effects that could break in a synchronized environment.
  2. Follow the Gutenberg Plugin: The feature isn’t dead; it’s moving back to the Gutenberg feature plugin for more “incubation.”
  3. Monitor Ticket #65205: This is where the code “unwinding” from 7.0 is happening.

Final Thought: I’d rather have a stable, single-user WordPress 7.0 than a broken, multi-user one. In the world of Open Source, “Ready when it’s ready” is always better than “Shipped because of a deadline.”

Follow me for more deep dives into the WordPress Core. Have thoughts on RTC? Let’s discuss in the comments below.

Built with Hugo
Theme Stack designed by Jimmy