- 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)
27 lines
482 B
Plaintext
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
|
|
}
|
|
]
|
|
}
|