3.2 KiB
3.2 KiB
Y.js vs Automerge: Decision for rStack + Fileverse Integration
Current State
rSpace uses both frameworks in a layered architecture:
┌─────────────────────────────────────────┐
│ TipTap Editor │
│ ↕ y-prosemirror binding │
│ ↕ Y.js (editor collaboration) │ ← Fileverse integrates HERE
├─────────────────────────────────────────┤
│ Automerge (document state + sync) │ ← State management stays HERE
│ ↕ WebSocket binary sync protocol │
│ ↕ IndexedDB encrypted persistence │
└─────────────────────────────────────────┘
Why This Dual Approach Works
Y.js Layer (Editor)
y-prosemirror: Official TipTap/ProseMirror binding for real-time editingy-indexeddb: Client-side persistence for editor state- Awareness protocol: Cursor positions, user presence
- This is what Fileverse's ddoc and collaboration-server use
Automerge Layer (State)
- Document metadata, permissions, notebook structure
- Binary sync protocol over WebSocket
- Encrypted storage with DocCrypto
- Migration path from PostgreSQL
Integration Surface
Fileverse components connect at the Y.js layer:
collaboration-serverspeaks Y.js sync protocol over WebSocket@fileverse-dev/ddocusesy-prosemirrorinternally@fileverse-dev/dsheetuses Y.js for cell sync
The Automerge layer is invisible to Fileverse — it handles higher-level state that Fileverse doesn't need to know about.
Decision
Keep the dual architecture. No migration needed.
Rationale
- No conflict — Y.js and Automerge operate at different levels
- Fileverse compatibility — Their components plug into the Y.js layer directly
- Automerge strengths preserved — Better merge semantics for structured data, Rust/WASM performance for large documents
- Migration cost: zero — No existing code needs to change
What This Means for Each Integration
| Integration | CRDT Layer | Notes |
|---|---|---|
| E2E encryption | Neither (operates on raw bytes) | Encrypts before CRDT, decrypts after |
| IPFS storage | Neither (file blobs) | CIDs stored in Automerge metadata |
| Collab server | Y.js | Handles editor sync + awareness |
| dSheet | Y.js | Self-contained Y.js-based component |
| UCAN auth | Neither (auth layer) | Wraps transport, not CRDTs |
Alternative Considered: Full Y.js Migration
If we were starting fresh, using Y.js for everything would be simpler. But the migration cost outweighs the benefit:
- Automerge schemas, storage, and sync code in rSpace would all need rewriting
- The PostgreSQL → Automerge migration tool would be wasted
- Automerge's typed document schemas are more ergonomic than Y.js's untyped maps/arrays
Conclusion
The existing architecture is already well-positioned for Fileverse integration. No CRDT migration needed. Focus integration efforts on the Y.js/TipTap layer where Fileverse components naturally connect.