Dev Chat Agenda โ€“ April 29, 2026

The next WordPress Developers Chat will take place on Wednesday, April 29, 2026, at 15:00 UTC in theย coreย channel onย Make WordPress Slack.

The live meeting will focus on the discussion for upcoming releases, and have an open floor section.

The various curated agenda sections below refer to additional items. If you haveย ticketticket Created for both bug reports and feature development on the bug tracker.ย requests for help, please continue to post details in the comments section at the end of this agenda or bring them up during the dev chat.

Announcements ๐Ÿ“ข

WordPress 7.0

General

Discussions ๐Ÿ’ฌ

The discussion section of the agenda is for discussing important topics affecting the upcoming release or larger initiatives that impact the CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. Team. To nominate a topic for discussion, please leave a comment on this agenda with a summary of the topic, any relevant links that will help people get context for the discussion, and what kind of feedback you are looking for from others participating in the discussion.

  • WordPress 7.0 is currently on track for May 20th. Temperature check: How are folks feeling?

Open floor ย ๐ŸŽ™๏ธ

Any topic can be raised for discussion in the comments, as well as requests for assistance on tickets. Tickets in the milestone for the next major or maintenance release will be prioritized.

Please include details of tickets / PRs and the links in the comments, and indicate whether you intend to be available during the meeting for discussion or will be async.

Props to @kirasong for proofreading and review

#7-0, #agenda, #core, #core-privacy, #dev-chat

Roster of design tools per block (WordPress 7.0 edition)

Below you find a table that lists all coreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. blocks available in the inserter marks in the grid the feature they support in the blockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience. editor. Itโ€™s a basic lookup table that helps developers to find the information quickly.

While this post is released as part of 6.8, the content summarizes changes between 6.1 and 7.0. This is an updated of the 6.8 edition and provides a cumulative list of design supports added with the last ten WordPress releases. The icon โ˜‘๏ธ indicates new in 6.9 or 7.0.

The features covered are:

  • Align
  • Typography
  • Color
  • Dimension
  • Border
  • Layout
  • Gradient
  • Duotone
  • Shadow
  • Background image

Changes to Blocks

  • The Verse block was renamed to Poetry block in WordPress 7.0
  • New Blocks added
    • Accordion with Accordion Heading, Accordion Item, Accordion Panel
    • Breadcrumbs
    • Icon
    • Math
    • Post Time to Read
    • Term Query with Term Template, Term Count, Term Name

Table changes

In previous editions of this roster, the PO/BB column tracked a small, hardcoded set of core blocks where Pattern Overrides and Block Bindings were manually enabled โ€” Button, Image, Paragraph, and Heading. That model no longer reflects how the feature works. WordPress 6.9 moved Block Bindings to a server-communicated list of supported attributes via the block_bindings_supported_attributes filterFilter Filters are one of the two types of Hooks https://codex.wordpress.org/Plugin_API/Hooks. They provide a way for functions to modify data of other functions. They are the counterpart to Actions. Unlike Actions, filters are meant to work in an isolated manner, and should never have side effects such as affecting global variables and output., and WordPress 7.0 extended that same mechanism to Pattern Overrides, so any block attribute that opts into Block Bindings now also supports Pattern Overrides โ€” including custom blocks. Because support is opt-in per block, per attribute, and per site, a single check mark in a lookup table can no longer represent it accurately. The column has been removed in favor of a note pointing readers to the Pattern Overrides in WP 7.0 and Block Bindings improvements in 6.9 dev notesdev note Each important change in WordPress Core is documented in a developers note, (usually called dev note). Good dev notes generally include a description of the change, the decision that led to this change, and a description of how developers are supposed to work with that change. Dev notes are published on Make/Core blog during the beta phase of WordPress release cycle. Publishing dev notes is particularly important when plugin/theme authors and WordPress developers need to be aware of those changes.In general, all dev notes are compiled into a Field Guide at the beginning of the release candidate phase..

Props to @awetz583, @westonruter, and @blackstar1991 for review.

#7-0, #dev-notes, #dev-notes-7-0, #editor

WordPress 7.0 Release Party Updated Schedule

Good news, everyone! WordPress 7.0 has a new release date: May 20th, 2026!

Thank you all for your flexibility in these recent weeks while WordPress contributors around the world worked tirelessly on necessary architectural improvements for the 7.0 release. The team aims to ensure that this software version is the most stable and most performant it can be, while still delivering the much anticipated cornerstone features mapped out for WordPress 7.0.

Below is the new release schedule, with expected dates and times for each release party, and the release squad contributors involved in each party for the 7.0 milestone. It also includes the pre-release versions that have already been released, and a (pending) call for testing from web hosts meant to help ensure compatibility across hosting systems.

Note: While the most recent pre-release version was RC2, the RC3 release will be treated like aย betaBeta A pre-release of software that is given out to a large group of users to trial under real conditions. Beta versions have gone through alpha testing in-house and are generally fairly close in look, feel and function to the final product; however, design changes often occur as part of the process.ย version in practice. That means that your continued testing and feedback, particularly on the part of web hosts, will be incredibly valuable in keeping the development process informed during the next phase of this release cycle. Thank you all for your continued testing!

Release Schedule

As always, last-minute adjustments to this schedule are possible, and there could be additional timeline iterations based on the impact of host feedback to ensure that feedback is properly addressed. The release squad will do its best to communicate any changes promptly by posting in the #core Slack channel, publishing a post on the change, and updating this post as the canonical reference.

Date (UTC)MilestoneEmcee / Release LeadRelease Lead The community member ultimately responsible for the Release.Committercommitter A developer with commit access. WordPress has five lead developers and four permanent core developers with commit access. Additionally, the project usually has a few guest or component committers - a developer receiving commit access, generally for a single release cycle (sometimes renewed) and/or for a specific component.SecurityMission Control (Coordination)
February 19, 2026 at 15:00 UTCBeta 1@amykamala@ellatrix@audrasjb@sergeybiryukov
February 26, 2026 at 15:00 UTCBeta 2@amykamala@ellatrix@audrasjb@sergeybiryukov
March 5, 2026 at 14:00 UTC Beta 3@amykamala@audrasjb
Committing from WordCampWordCamp WordCamps are casual, locally-organized conferences covering everything related to WordPress. They're one of the places where the WordPress community comes together to teach one another what theyโ€™ve learned throughout the year and share the joy. Learn more. Nice Contributor DayContributor Day Contributor Days are standalone days, frequently held before or after WordCamps but they can also happen at any time. They are events where people get together to work on various areas of https://make.wordpress.org/ There are many teams that people can participate in, each with a different focus. https://2017.us.wordcamp.org/contributor-day/ https://make.wordpress.org/support/handbook/getting-started/getting-started-at-a-contributor-day/!
@audrasjb@sergeybiryukov
March 10, 2026 at 23:30 UTC
Unplanned beta following the 6.9.2-6.9.3 security releases
Beta 4@desrosj@sergeybiryukov@sergeybiryukov@sergeybiryukov
March 12, 2026 at 15:00 UTCBeta 5@chaion07@ellatrix@audrasjb@sergeybiryukov
March 24, 2026 at 15:00 UTCRCrelease candidate One of the final stages in the version release cycle, this version signals the potential to be a final release to the public. Also see alpha (beta). 1@amykamala@ellatrix@audrasjb@sergeybiryukov
March 26, 2026 at 15:00 UTCRC 2@4thhubbard@ellatrix@audrasjb@sergeybiryukov
April 24, 2026Call for host testing@desrosjn/an/an/a
May 8, 2026 at 15:00 UTCRC 3 (in name, but test as a โ€œnew Beta 1โ€)@amykamala@ellatrix@audrasjb@sergeybiryukov
May 14, 2026 at 15:00 UTCRC 4 (in name, but acting as a โ€œnew RC1โ€)@4thhubbard@ellatrix@audrasjb@sergeybiryukov
Tuesday, May 19, 2026 at 15:00 UTC

Dry Run / 24-Hour Code FreezeTBDTBDTBDTBD
Wednesday, May 20, 2026

Time TBA
General ReleaseTBDTBDTBDTBD

How to Join the Party

  • All parties happen in the #core channel on Slack.
  • Everyone is welcome! First-timers, veteran contributors, and all those curious about the process are invited.

Here are detailed instructions on how to contribute to a release party.

Thank you to every contributor and community member that helps make 7.0 a success. See you at the parties!

Props to @desrosj, @4thhubbard, @annezazu, @griffbrad,@peterwilsoncc, and @jeffpaul for helping devise the new schedule, and @desrosj, @jeffpaul, and @sumitsingh for reviewing this post.

#7-0, #release

Dev Chat Agenda โ€“ April 22, 2026

The next WordPress Developers Chat will take place on Wednesday, April 22, 2026, at 15:00 UTC in theย coreย channel onย Make WordPress Slack.

The live meeting will focus on the discussion for upcoming releases, and have an open floor section.

The various curated agenda sections below refer to additional items. If you haveย ticketticket Created for both bug reports and feature development on the bug tracker.ย requests for help, please continue to post details in the comments section at the end of this agenda or bring them up during the dev chat.

Announcements ๐Ÿ“ข

WordPress 7.0 Updates

  • The Path Forward for WordPress 7.0. A new release schedule should be shared this week.
  • New Dev Notesdev note Each important change in WordPress Core is documented in a developers note, (usually called dev note). Good dev notes generally include a description of the change, the decision that led to this change, and a description of how developers are supposed to work with that change. Dev notes are published on Make/Core blog during the beta phase of WordPress release cycle. Publishing dev notes is particularly important when plugin/theme authors and WordPress developers need to be aware of those changes.In general, all dev notes are compiled into a Field Guide at the beginning of the release candidate phase.:

General announcements

Editor

Discussions ๐Ÿ’ฌ

The discussion section of the agenda is for discussing important topics affecting the upcoming release or larger initiatives that impact the CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. Team. To nominate a topic for discussion, please leave a comment on this agenda with a summary of the topic, any relevant links that will help people get context for the discussion, and what kind of feedback you are looking for from others participating in the discussion.

Open floor ย ๐ŸŽ™๏ธ

Any topic can be raised for discussion in the comments, as well as requests for assistance on tickets. Tickets in the milestone for the next major or maintenance release will be prioritized.

Please include details of tickets / PRs and the links in the comments, and indicate whether you intend to be available during the meeting for discussion or will be async.

#7-0, #agenda, #core, #dev-chat

Dev Chat summary: April 15, 2026

Startย of the meeting inย SlackSlack Slack is a Collaborative Group Chat Platform https://slack.com/. The WordPress community has its own Slack Channel at https://make.wordpress.org/chat/, facilitated by @amykamala ๐Ÿ”— Agenda post.

Announcements ๐Ÿ“ข

WordPress 7.0 Updates

  • The Path Forward for WordPress 7.0. The 7.0 release is still on pause for the time being. A new schedule is being worked out and will be announced by the 22nd. There will be another Release Candidaterelease candidate One of the final stages in the version release cycle, this version signals the potential to be a final release to the public. Also see alpha (beta). in name, but in practice the next release will be treated as a betaBeta A pre-release of software that is given out to a large group of users to trial under real conditions. Beta versions have gone through alpha testing in-house and are generally fairly close in look, feel and function to the final product; however, design changes often occur as part of the process., specifically to test architectural improvements to Real Time Collaboration. Thank you in advance to everyone who helps test!

General

Discussion ๐Ÿ’ฌ

@annezazu has published Defining expectations for Iteration issues announcing some adjustments to iteration issue handling in the GutenbergGutenberg 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/ repo.

From @amykamala: โ€œFinding the most current PRs and discussions can be a bit of a wild goose chase because while PRs mention tickets in their content, the fields/relationships on the right that would link PRs to a ticketticket Created for both bug reports and feature development on the bug tracker., project, status, etc are not actively being used. For 7.0 theres a kan ban board but nothing in it because tickets and PRs are not being tagged. So the only way to find this info is to scroll endlessly on tickets and click on all the links in the notifications. Some of you may remember a while back I asked devs in here to please start tagging their PRs in the fields on the right.โ€

  • @jeffpaul noted that the #core-program channel may be a good place to iterate on this topic.

Matt is requesting community reps and organizers increase emphasis on Elevating Individuals in the contributor space to to celebrate volunteers and folks who contribute in their own spare time.

From @miroku: โ€œI can only report problems; can that be considered a contribution? Iโ€™m always struggling to figure out how to volunteer effectivelyโ€. @jorbin answered that testing and finding bugs is absolutely a contribution!

@westonruter wanted to draw attention to this issue with @wordpress/core-abilities which makes it difficult to use outside of a React context. A PR is available to fix the issue.

#7-0, #core, #core-editor, #dev-chat

Dev Chat Agenda โ€“ April 15, 2026

The next WordPress Developers Chat will take place on Wednesday, April 15, 2026, at 15:00 UTC in theย coreย channel onย Make WordPress Slack.

The live meeting will focus on the discussion for upcoming releases, and have an open floor section.

The various curated agenda sections below refer to additional items. If you haveย ticketticket Created for both bug reports and feature development on the bug tracker.ย requests for help, please continue to post details in the comments section at the end of this agenda or bring them up during the dev chat.

Announcements ๐Ÿ“ข

WordPress 7.0 Updates

The release schedule is currently still on hold, pending further validation of a new release candidaterelease candidate One of the final stages in the version release cycle, this version signals the potential to be a final release to the public. Also see alpha (beta)..

General announcements

Discussions ๐Ÿ’ฌ

The discussion section of the agenda is for discussing important topics affecting the upcoming release or larger initiatives that impact the CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. Team. To nominate a topic for discussion, please leave a comment on this agenda with a summary of the topic, any relevant links that will help people get context for the discussion, and what kind of feedback you are looking for from others participating in the discussion.

Open floor ย ๐ŸŽ™๏ธ

Any topic can be raised for discussion in the comments, as well as requests for assistance on tickets. Tickets in the milestone for the next major or maintenance release will be prioritized.

Please include details of tickets / PRs and the links in the comments, and indicate whether you intend to be available during the meeting for discussion or will be async.

#7-0, #agenda, #core, #dev-chat

Dev Chat summary: April 8, 2026

Startย of the meeting inย SlackSlack Slack is a Collaborative Group Chat Platform https://slack.com/. The WordPress community has its own Slack Channel at https://make.wordpress.org/chat/, facilitated by @audrasjb ๐Ÿ”— Agenda post.

Announcements ๐Ÿ“ข

WordPress 7.0 Updates

  • The Path Forward for WordPress 7.0. Quick summary:
    • trunk is closed to commits for the 7.1 release until further notice
    • Backporting to 7.0 still requires double committercommitter A developer with commit access. WordPress has five lead developers and four permanent core developers with commit access. Additionally, the project usually has a few guest or component committers - a developer receiving commit access, generally for a single release cycle (sometimes renewed) and/or for a specific component. sign off
    • Pre-releases are paused
    • The next release will be a RCrelease candidate One of the final stages in the version release cycle, this version signals the potential to be a final release to the public. Also see alpha (beta).
    • Weโ€™re currently in string freeze
  • Newย Dev Notesdev note Each important change in WordPress Core is documented in a developers note, (usually called dev note). Good dev notes generally include a description of the change, the decision that led to this change, and a description of how developers are supposed to work with that change. Dev notes are published on Make/Core blog during the beta phase of WordPress release cycle. Publishing dev notes is particularly important when plugin/theme authors and WordPress developers need to be aware of those changes.In general, all dev notes are compiled into a Field Guide at the beginning of the release candidate phase.:

Discussion ๐Ÿ’ฌ

From @desrosj: contributors who have a list of notes for tickets to create are encouraged to create them before the WordCampWordCamp WordCamps are casual, locally-organized conferences covering everything related to WordPress. They're one of the places where the WordPress community comes together to teach one another what theyโ€™ve learned throughout the year and share the joy. Learn more. Asia Contributor DayContributor Day Contributor Days are standalone days, frequently held before or after WordCamps but they can also happen at any time. They are events where people get together to work on various areas of https://make.wordpress.org/ There are many teams that people can participate in, each with a different focus. https://2017.us.wordcamp.org/contributor-day/ https://make.wordpress.org/support/handbook/getting-started/getting-started-at-a-contributor-day/. Especially if they are good-first-bugs!ย 

@desrosj added: โ€œIf someone has some time, triaging the good-first-bugbug A bug is an error or unexpected result. Performance improvements, code optimization, and are considered enhancements, not defects. After feature freeze, only bugs are dealt with, with regressions (adverse changes from the previous version) being the highest priority. list could also be helpful. Sometimes that list is intimidating because it seems like everything is attended to. But often times the patches need to be refreshed or the approaches so far are not fully solving the issue at hand. If we could note that on the tickets, it may make them more easily actionable.โ€

@audrasjb noted that the 8 tickets in the i18n component for 7.0 are easy tickets that would be nice to address during the contributor day. They are also Polyglots, CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress., and Core Editor cross-team tickets.

@desrosj will encourage our Polyglots contributors to open tickets for strings that need refinement and additional context as it is a great way to contribute to the upcoming release.

#7-0, #core, #core-editor, #dev-chat

Dev Chat Agenda โ€“ April 8, 2026

The next WordPress Developers Chat will take place on Wednesday, April 8, 2026, at 15:00 UTC in theย coreย channel onย Make WordPress Slack.

The live meeting will focus on the discussion for upcoming releases, and have an open floor section.

The various curated agenda sections below refer to additional items. If you haveย ticketticket Created for both bug reports and feature development on the bug tracker.ย requests for help, please continue to post details in the comments section at the end of this agenda or bring them up during the dev chat.

Announcements ๐Ÿ“ข

WordPress 7.0 Updates

  • The Path Forward for WordPress 7.0
  • New Dev Notesdev note Each important change in WordPress Core is documented in a developers note, (usually called dev note). Good dev notes generally include a description of the change, the decision that led to this change, and a description of how developers are supposed to work with that change. Dev notes are published on Make/Core blog during the beta phase of WordPress release cycle. Publishing dev notes is particularly important when plugin/theme authors and WordPress developers need to be aware of those changes.In general, all dev notes are compiled into a Field Guide at the beginning of the release candidate phase.:

Discussions ๐Ÿ’ฌ

The discussion section of the agenda is for discussing important topics affecting the upcoming release or larger initiatives that impact the CoreCore Core is the set of software required to run WordPress. The Core Development Team builds WordPress. Team. To nominate a topic for discussion, please leave a comment on this agenda with a summary of the topic, any relevant links that will help people get context for the discussion, and what kind of feedback you are looking for from others participating in the discussion.

Open floor ย ๐ŸŽ™๏ธ

Any topic can be raised for discussion in the comments, as well as requests for assistance on tickets. Tickets in the milestone for the next major or maintenance release will be prioritized.

Please include details of tickets / PRs and the links in the comments, and indicate whether you intend to be available during the meeting for discussion or will be async.

#7-0, #agenda, #core, #dev-chat

Dev Chat summary: April 1, 2026

Startย of the meeting inย SlackSlack Slack is a Collaborative Group Chat Platform https://slack.com/. The WordPress community has its own Slack Channel at https://make.wordpress.org/chat/, facilitated by @audrasjb ๐Ÿ”— Agenda post.

Announcements ๐Ÿ“ข

Editor

General

WordPress 7.0 Updates

Discussion ๐Ÿ’ฌ

From Matt: Rethinking Left Navigation

  • @audrasjb: โ€œOrdering plugins in a menu is a pretty sensible [but] it would be great if users could order them themselvesโ€
  • @jorbin recommended to make it a Feature PluginFeature Plugin A plugin that was created with the intention of eventually being proposed for inclusion in WordPress Core. See Features as Plugins project
  • @joedolson wanted to note that maintaining consistent navigation order is an explicit accessibility requirement

From @joefusco: โ€œFollowing the awareness/presence discussion in #64696, I built a feature plugin to test the workload independently from RTC feature.โ€

  • @desrosj proposed to make it a Feature Plugin hosted on the WordPress GitHubGitHub GitHub is a website that offers online implementation of git repositories that can easily be shared, copied and modified by other developers. Public repositories are free to host, private repositories require a paid subscription. GitHub introduced the concept of the โ€˜pull requestโ€™ where code changes done in branches by contributors can be reviewed and discussed before being merged by the repository owner. https://github.com/ repository andโ€ฆ tada! Itโ€™s live.

From @wildworks: โ€œI am proposing to remove the ability to embed YouTube videos in the cover blockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience.. I would appreciate your thoughts on this. In my opinion, this violates the terms of service and also presents accessibilityAccessibility Accessibility (commonly shortened to a11y) refers to the design of products, devices, services, or environments for people with disabilities. The concept of accessible design ensures both โ€œdirect accessโ€ (i.e. unassisted) and โ€œindirect accessโ€ meaning compatibility with a personโ€™s assistive technology (for example, computer screen readers). (https://en.wikipedia.org/wiki/Accessibility) issues.โ€ See this PR comment.

  • @jorbin pointed out that WordPress has shipped with header video support for almost a decade with no complaints, so removing this from the cover block should not be rushed.
  • @joedolson added that the accessibility issue is technically a content control issue; it doesnโ€™t directly create an issue, but opens a door for significant issues that were previously easily prevented.
  • @wildworks shared this Slack thread, where comments are welcome about this topic.

#7-0, #core, #core-editor, #dev-chat

Building a custom sync provider for real-time collaboration

WordPress 7.0 will introduce real-time collaboration in the blockBlock Block is the abstract term used to describe units of markup that, composed together, form the content or layout of a webpage using the WordPress editor. The idea combines concepts of what in the past may have achieved with shortcodes, custom HTML, and embed discovery into a single consistent API and user experience. editor. Out of the box, the editor syncs changes between peers using an HTTPHTTP HTTP is an acronym for Hyper Text Transfer Protocol. HTTP is the underlying protocol used by the World Wide Web and this protocol defines how messages are formatted and transmitted, and what actions Web servers and browsers should take in response to various commands. polling provider. However, an HTTP polling transport isnโ€™t the only option and it may not be the best fit for your infrastructure, especially if you are a WordPress hosting provider.

The sync.providers client-side filterFilter Filters are one of the two types of Hooks https://codex.wordpress.org/Plugin_API/Hooks. They provide a way for functions to modify data of other functions. They are the counterpart to Actions. Unlike Actions, filters are meant to work in an isolated manner, and should never have side effects such as affecting global variables and output. proposed for WordPress 7.0 lets you replace the default transport with your own. This post walks through why youโ€™d want to use one, what a provider does, and how to build one.

Why build a custom provider?

The default HTTP polling provider is designed to work on any WordPress installation. It batches document and awareness updates into periodic HTTP requests: every four seconds when editing alone, every second when collaborators are present. (These values are filterable.)

It works reliably, but there can be good reasons to swap it out:

  • Lower latency. Transports such as WebSockets deliver updates as they happen, not on a polling interval. For sites doing heavy collaborative editing, the difference can be noticeable.
  • Reduced server load. Polling generates requests even when nothing has changed. A push-based transport only sends data when needed.
  • Infrastructure alignment. If you already run WebSocket servers or other real-time transport, you can benefit from using familiar infrastructure with WordPress.

These benefits come with a substantial overhead. Building a custom provider is not trivial. It will require custom code. Most likely, it will also involve deployingDeploy Launching code from a local development environment to the production web server, so that it's available to visitors. and maintaining server resources.

What a sync provider does

Real-time collaboration in WordPress is powered by Yjs, a Conflictconflict 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. WordPress content is represented by Yjs documents; syncing happens by exchanging updates to those documents.

The sync provider is the transport layer. It facilitates the exchange of Yjs document updates between peers.

Concretely, a provider needs to:

  1. Receive local Yjs document updates and send them to remote peers.
  2. Receive remote updates and apply them to the local Yjs document.
  3. Report connection status so the editor UIUI User interface can show whether the user is connected.

GutenbergGutenberg 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/โ€™s sync manager orchestrates the syncing process. It creates a sync provider for each Yjs document that will be synced. Therefore, supplying a custom sync provider means supplying a provider creator function. A provider creator is an async function following this example:

async function myProviderCreator( options ) {
ย ย ย ย const objectType = options.objectType; // e.g., "postType/post"
ย ย ย ย const objectId ย  = options.objectId; ย  // e.g., "123"
ย ย ย ย const ydoc ย  ย  ย  = options.ydoc; ย  ย  ย  // Yjs document
ย ย ย ย const awarenessย  = options.awareness;ย  // Yjs awareness

ย ย ย ย // Create provider.
ย ย ย ย const room ย  ย  = `${ objectType }:${ objectId }`;
ย ย ย ย const provider = new MyYjsProvider( ydoc, awareness, room );

ย ย ย ย // Connect.
ย ย ย ย provider.connect();

ย ย ย ย return {
ย ย ย ย ย ย ย ย destroy: () => provider.destroy(),
ย ย ย ย ย ย ย ย on: ( event, callback ) => provider.on( event, callback ),
ย ย ย ย ย };
}

Note that the returned object has two function properties that the provider must implement:

  • destroy(): The sync manager will call this function when it is time to close connections, remove listeners, and free resources.
  • on(): This function allows the sync manager to subscribe to connection state changes. Emit { status: 'connecting' }, { status: 'connected' }, or { status: 'disconnected', error?: ConnectionError } as appropriate.
    • A disconnected event can be accompanied by an error. Using specific error codes allows the editor to give specific feedback to the user. See the list of error codes and resulting messaging.

Existing Yjs providers

You donโ€™t have to build a sync provider from scratch. Yjs has a provider ecosystem and several existing libraries can handle the heavy lifting.ย 

y-websocket is the most widely used Yjs provider and has been deployedDeploy Launching code from a local development environment to the production web server, so that it's available to visitors. by WordPress VIP and other WordPress hosts. It includes both a client and a simple Node.js server.

Note: y-webrtc is nominally a peer-to-peer provider that syncs via WebRTC, but in practice it requires centralized servers to reliably connect peers with each other. It is not recommended unless you are willing to invest in those servers.ย 

Minimal client example with y-websocket

Wrapping a Yjs provider in a ProviderCreator function is straightforward, as seen in the following example. However, note that this example is missing essential authorization checks (discussed in the next section):

import { addFilter } from '@wordpress/hooks';
import { WebsocketProvider } from 'y-websocket';

addFilter( 'sync.providers', 'my-plugin/websocket', () => {
    return [
        async ( { objectType, objectId, ydoc, awareness } ) => {
            const roomName = `${ objectType }-${ objectId ?? 'collection' }`;
            const provider = new WebsocketProvider(
                'wss://my-sync-server.example.com',
                roomName,
                ydoc,
                { awareness }
            );

            return {
                destroy: () => provider.destroy(),
                on: ( event, callback ) => provider.on( event, callback ),
            };
        },
    ];
} );

This code replaces the default HTTP polling provider entirely. The filter callback ignores the incoming providerCreators array and returns a new array containing a single WebSocket-based provider creator.

The WebSocket server (wss://my-sync-server.example.com in the example above) must be configured and deployed separately. The y-websocket-server library is the server companion to y-websocket.

Authorization and security

A custom sync provider connects to infrastructure that you own and operate, e.g., a WebSocket server. Because that infrastructure lives outside of WordPress, WordPress canโ€™t authorize requests to it on your behalf.

Securing the connection between the editor and your sync server is your responsibilityโ€”a critical one. Without authorization checks, any user could connect to your WebSocket server and participate in a collaborative session with your WordPress users.ย 

Token-based auth

A common pattern is to issue short-lived tokens via a WordPress REST APIREST API The REST API is an acronym for the RESTful Application Program Interface (API) that uses HTTP requests to GET, PUT, POST and DELETE data. It is how the front end of an application (think โ€œphone appโ€ or โ€œwebsiteโ€) can communicate with the data store (think โ€œdatabaseโ€ or โ€œfile systemโ€) https://developer.wordpress.org/rest-api/ endpoint, then pass the token when opening the WebSocket connection. The tokens assert that the user has permission to collaborate on a specific entity.

Hereโ€™s a simplified example of how the WPVIP Real-Time Collaboration plugin handles it:

// Fetch a short-lived token from a WordPress REST endpoint.
// This endpoint is provided by your plugin. Tokens encode the
// type and ID of the entity being edited, as well as the current
// WordPress user ID.
const data = await apiFetch( {
ย ย ย ย path: '/my-plugin/v1/sync/auth',
ย ย ย ย method: 'GET',
ย ย ย ย data: { objectType, objectId },
} );

// Pass the token as a query parameter when connecting.
provider.params = { auth: data.token };
provider.connect();

Key considerations

  • Validate on the server. Never trust the client. The sync server should verify the token on every connection request. The token should encode information about the user, the entity being edited, and which actions are authorized. The sync server should validate each assertion and reject unauthorized connections before applying any document updates.
  • Authorize per-document. Itโ€™s worth restating: Donโ€™t just authenticate the user, additionally verify they have permission to edit the specific post or entity being synced. Your WebSocket server should validate this on every connection.
  • Rotate tokens. WebSocket connections are long-lived. Use short-lived tokens and re-authenticate on reconnect so that revoked permissions take effect promptly.
  • Handle disconnects gracefully. When authorization fails or a token is invalidinvalid A resolution on the bug tracker (and generally common in software development, sometimes also notabug) that indicates the ticket is not a bug, is a support request, or is generally invalid., emit a { status: 'disconnected', error } event so the editor can inform the user. The WPVIP pluginPlugin 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. maps WebSocket close codes to specific error types to give users actionable feedback.

The WPVIP Real-Time Collaboration plugin is a functional and secure example using WebSockets. Itโ€™s open sourceOpen Source Open Source denotes software for which the original source code is made freely available and may be redistributed and modified. Open Source **must be** delivered via a licensing model, see GPL. and contributions are welcome.

Feedback

If you have questions or feedback about building a custom sync provider, please share them in a comment on this post or in the #hosting channel of Make WordPress Slack.

Props to @jorbin and @westonruter for feedback and contributions.

#7-0, #dev-notes, #dev-notes-7-0, #feature-real-time-collaboration