Collaboration

Collaborative editing connects your browser editor to a backend. Start with Collaboration integration to run the example and connect your application's identity, permissions, and storage. See Collaboration Quick Start for the browser and server configuration.

Create the document through an authenticated application API, then load the returned Unit identifier with the method below. Reuse that identifier when opening the same document again.

Load the document

Set the current user before loading a document. The current user identifies the collaborator and owns the local offline cache. After setting it, load the document explicitly with the Facade:

TypeScript
import { UserManagerService } from '@univerjs/core'import '@univerjs-pro/collaboration-client/facade'univer.__getInjector().get(UserManagerService).setCurrentUser({ userID, name, avatar })const collaboration = univerAPI.getCollaboration()const unit = await collaboration.loadDocAsync('your-unit-id')

Use synchronization status, retries, and conflict recovery to build saving indicators and protect unacknowledged edits before reloading.

Removal of built-in URL loading for collaborative documents

Note

Starting with version 1.2.0, Univer has removed built-in URL loading for collaborative documents. It no longer automatically reads the unit and type URL parameters to load a collaborative document.

If your application relies on this behavior, you can restore it with a custom plugin.

Integrate the custom plugin

Copy the four files below into your project using this directory structure:

text
custom-url-load/├── plugin.ts├── controllers/│   └── data-loader.controller.ts└── services/    ├── url.service.ts    └── web-url.service.ts

After initializing the editor and collaboration plugins, set the current user before registering CustomUrlLoadPlugin. This integration works in both plugin and preset modes:

TypeScript
import { UserManagerService } from '@univerjs/core'import { CustomUrlLoadPlugin } from './custom-url-load/plugin'univer.__getInjector().get(UserManagerService).setCurrentUser({ userID, name, avatar })univer.registerPlugin(CustomUrlLoadPlugin)

Once registered, the plugin loads the document, so you do not need to call loadDocAsync() for the same document. If your application already loads documents through the Facade, you can keep the approach in the previous section and handle URLs according to your application’s needs.

Complete plugin code

TypeScript
import { UniverCollaborationClientPlugin } from '@univerjs-pro/collaboration-client'import { DependentOn, Inject, Injector, Plugin } from '@univerjs/core'import { CollaborationDataLoaderController } from './controllers/data-loader.controller'import { IURLService } from './services/url.service'import { WebURLService } from './services/web-url.service'@DependentOn(UniverCollaborationClientPlugin)export class CustomUrlLoadPlugin extends Plugin {  static override pluginName = 'CUSTOM_URL_LOAD_PLUGIN'  constructor(    _config: undefined,    @Inject(Injector) protected override readonly _injector: Injector  ) {    super()  }  override onStarting(): void {    this._injector.add([IURLService, { useClass: WebURLService }])    this._injector.add([CollaborationDataLoaderController])    this.disposeWithMe(this._injector.get(IURLService))    this.disposeWithMe(this._injector.get(CollaborationDataLoaderController))  }}

Node.js / AI SDK · OT

How is this guide?

© 2026 DreamNum Co., Ltd.