openpencil/packages/collab/wrangler.jsonc
Danila Poyarkov 2add3ac4c0 Real-time collaboration with Yjs CRDT over Cloudflare Durable Objects
- Cloudflare Worker + Durable Object server (packages/collab/)
  - One DO per room with WebSocket Hibernation for near-zero idle cost
  - Yjs sync protocol for document state (CRDT merge)
  - Yjs awareness protocol for cursors, selection, presence
  - Persists doc state to DO storage
  - CORS headers for cross-origin WebSocket upgrade

- Client composable (src/composables/use-collab.ts)
  - Y.Doc ↔ SceneGraph bidirectional binding
  - Awareness: broadcasts cursor position, selection, name, color
  - Auto-join from /share/:roomId URL
  - Suppresses echo loops between Yjs and graph updates

- CollabPanel component (src/components/CollabPanel.vue)
  - Share button generates room link, copies to clipboard
  - Join flow: paste link or room ID
  - Avatar stack with colored initials and tooltips
  - Name input persisted to localStorage

- Remote cursor rendering in CanvasKit
  - Colored arrow cursor + name label pill per remote peer
  - Remote selection outlines in peer's color
  - Only shows cursors on the same page

- SPA redirect for /share/* routes (Cloudflare Pages _redirects)
2026-03-01 16:44:37 +03:00

27 lines
482 B
Plaintext

{
"$schema": "node_modules/wrangler/config-schema.json",
"name": "open-pencil-collab",
"main": "src/index.ts",
"compatibility_date": "2025-02-26",
"durable_objects": {
"bindings": [
{
"name": "ROOMS",
"class_name": "CollabRoom"
}
]
},
"migrations": [
{
"tag": "v1",
"new_sqlite_classes": ["CollabRoom"]
}
],
"routes": [
{
"pattern": "collab.openpencil.dev",
"custom_domain": true
}
]
}