Real-time updates are opt-in and deliberately lightweight. Each time an editor saves, publishes, moves, deletes, or restores a page, element, or file, the CMS sends one small event over the WebSocket connection. The event carries only metadata: the item type, its ID, the editor's name, and a few status flags. It never includes the page content.
Every admin panel listens on one channel per content type (cms.page, cms.element, cms.file). List and tree views update in place: a save, publish, restore, or trash action patches the affected row directly. Additions, tree moves, and permanent deletions change the list structure, so instead of reloading they mark the view as outdated and show a Refresh button labelled Updated by another user. The list reloads only when you click it, which keeps your scroll position, filters, and selection intact. A detail view behaves differently: when its own item changes, it reloads itself and refetches the content through the GraphQL API, so you always edit the latest version.
The tab that made a change is excluded from its own event, so your actions never trigger a redundant update in your own panel. Changes from outside the admin panel still reach every connected editor, whether they come from the MCP server, the API, or a scheduled job. After a dropped connection reconnects, detail views reload and list and tree views show the Refresh notice, so nothing that changed while you were offline is missed.