Guides
Real-time multiplayer via centralized OT (rebase / makeBias)
and a Cloudflare Worker Durable Object room.
import { Editor } from 'markloom/view'
import 'markloom/view/theme.css'
new Editor(el, doc, {
collab: {
url: 'ws://127.0.0.1:8787', // or wss://your-worker.workers.dev
room: 'demo-room',
name: 'Alice',
},
})
Local edits upload as Steps; remote Steps apply through OT. Presence: avatar stack + colored remote carets with name labels (auto colors by siteId).
Optional: color, seed (empty-room init). Programmatic: ed.collab → CollabClient.
cd worker
bun install
bun run dev # wrangler dev → ws://127.0.0.1:8787
bun run deploy # Cloudflare account required
GET /room/:id + WebSocket upgrade → one Durable Object per room nameresync)| Direction | Types |
|---|---|
| C→S | join, op, presence, ping |
| S→C | welcome, op, presence, peer-join / peer-leave, resync, error |
| Path | API | Undo stack | Network |
|---|---|---|---|
| local | dispatch / stream / undo / redo | commit / amend / pop | push |
| foreign | applyRemote → applyForeign | OT-map only, never push | inbound op |
Cmd+Z undoes your last commit; the inverse broadcasts as a normal op.
resync; no auth (room id = capability).