Y-S2 is a Cloudflare Worker that provides real-time collaborative document editing using Yjs with S2.dev as the distribution channel and an R2 bucket as the storage provider. It provides scalable WebSocket-based document synchronization where document updates are made durable on an S2 stream and distributed to connected clients and reactively persisted to the R2 bucket.
- Cloudflare account with Workers enabled.
- S2.dev account, a basin with
Create stream on append/readenabled, and a scoped access token to the basin you want to use. - R2 bucket for snapshot storage.
S2_ACCESS_TOKEN=your_s2_access_token
S2_BASIN=your_s2_basin_name
R2_BUCKET=your_r2_bucket_name
LOG_MODE=CONSOLE|S2_SINGLE|S2_SHARED # Optional
SNAPSHOT_BACKLOG_SIZE=100 # Optional# Install dependencies
npm install
# Deploy to Cloudflare Workers
npm run deploy
# Or run locally for development
npm run devConnect to the deployed worker using the Yjs WebSocket provider:
import * as Y from 'yjs'
import { WebsocketProvider } from 'y-websocket'
const doc = new Y.Doc()
const provider = new WebsocketProvider('wss://your-worker.your-subdomain.workers.dev', 'room-name', doc, {
params: { authToken: 'your-auth-token' }
})Portions of this project are derived from y-redis, licensed under the GNU Affero General Public License v3.0.