Y-Sweet is an open-source document store and realtime sync backend, built on top of the Yjs CRDT library.
- Persists document data to S3-compatible storage, like Figma.
- Scales horizontally with a session backend model.
- Deploys as a native Linux process.
- Provides document-level access control via client tokens.
- Written in Rust with a focus on stability and performance.
The Y-Sweet server can be used by any Yjs app, or you can use our opinionated stack to integrate Yjs and Y-Sweet into a Next.js app.
create-y-sweet-app
, a command line tool to quickly create a Y-Sweet app.@y-sweet/sdk
, a TypeScript library for interacting withy-sweet-server
from your application backend.@y-sweet/client
, a TypeScript library for syncing documents from a client to a Y-Sweet server.@y-sweet/react
, a library of React hooks for connecting to a Y-Sweet server and manipulating Yjs docs.- A debugger for exploring Yjs document and presence state.
Y-Sweet is MIT-licensed, and was created by Jamsocket.
The easiest way to start a Y-Sweet project is with the create-y-sweet-app
command line tool:
npx create-y-sweet-app@latest
For more information, check out our documentation.
Explore our collaborative examples to help you get started.
All examples are open source and live in this repository, within /examples.
Check the vanilla js example for more details.
import { DocumentManager } from '@y-sweet/sdk';
// Pass in a CONNECTION_STRING, which you can get from a Y-Sweet service in the Jamsocket dashboard or from running npx y-sweet@latest serve locally
const manager = new DocumentManager(CONNECTION_STRING);
// create an endpoint that auths your user and returns a Y-Sweet client token
export async function POST(request) {
// in a production app, you'd want to authenticate the user
// and make sure they have access to the given doc
const body = await request.json();
const docId = body.docId;
const clientToken = await manager.getOrCreateDocAndToken(docId);
return Response.json(clientToken);
}
import * as Y from 'yjs';
import { createYjsProvider } from '@y-sweet/client';
// Create the Yjs doc and link it to the Y-Sweet server:
const doc = new Y.Doc();
const docId = 'my-doc-id';
createYjsProvider(doc, docId, '/api/my-auth-endpoint');
// Now use the doc like a normal Yjs doc!
let mySharedMap = doc.getMap('thing');
mySharedMap.set("foo", 123);
// Update your UI based on `mySharedMap` changes like this, for example:
mySharedMap.observe((event) => {
event.keysChanged.forEach((key) => {
// do whatever you want based on the detected change:
yourUpdateFunction(key, mySharedMap.get(key));
});
});
Package Manager | Name | Version | Path |
---|---|---|---|
npm | y-sweet |
js-pkg/server |
|
crates.io | y-sweet |
crates/y-sweet |
|
crates.io | y-sweet-core |
crates/y-sweet-core |
Package Manager | Name | Version | Path |
---|---|---|---|
npm | @y-sweet/sdk |
js-pkg/sdk |
|
npm | @y-sweet/client |
js-pkg/client |
|
npm | @y-sweet/react |
js-pkg/react |
|
pypi | y-sweet-sdk |
python/y_sweet_sdk |
You can run Y-Sweet on your own server, or you can run it on Jamsocket. Jamsocket is purpose-built to scale up sync backends like Y-Sweet, and allows you to bring your own storage.
You can try it out for free today by following our quickstart guide.