Build your next app
with sync
Jazz is an open-source framework for building local-first apps, removing 90% of the backend and infrastructure complexity.
Local-first
Multiplayer
File uploads
Social features
Permissions
Sync
E2EE
Instant updates
export class Message extends CoMap { text = co.string; } export class Chat extends CoList.Of( co.ref(Message) ) {}
const message = Message.create({ text: “Hello world!” }, { owner: ... }) chat.push(message)
const ChatScreen = (id) => { const chat = useCoState(Chat, id) return chat.messages.map(msg => ( <p>{msg.text}</p> )) }
Instant sync & UI updates
across devices and users! 🎉
Hard things are easy now.
Ever notice how every stack just reinvents shared state between users and machines?
And far from the simple client-server model, you routinely tackle a mess of moving parts, tech choices and deployment questions.
And your app’s code is all over the place.
Jazz provides a single new abstraction to do the whole job.
It turns the data flow around and gives you mutable local state, solving sync, concurrent editing and permissions under the hood.
All that’s left? What makes your app your app.
Everything you need to ship top-tier apps quickly.
Features that used to take months to build now work out-of-the-box.
All data you load or create is persisted locally, so your users can work offline.
When you’re back online, your local changes are synced to the server.
Share state with other users and get automatic real-time multiplayer.
Use the same primitives to quickly build user presence UI, like cursors.
Create & handle structured data and binary streams/blobs the same way.
Jazz Cloud or your own server become both cloud database and blob storage.
Groups of accounts are first class entities that you can create anywhere.
Building multi-user apps becomes as easy as building the UI for them.
Control access to data with role-based permissions, easily defined locally.
Reference data across permission scopes for granular access control.
Build your app around mutable local state attached to an account.
Every device with the same account will always have everything in sync.
All data is end-to-end encrypted and cryptographically signed by default.
So it can't be tampered with and Jazz Cloud only sees encrypted data.
Get instant updates throughout your UI every time you locally mutate data.
Remote changes are synced and applied with minimal latency.
First impressions...
A chat app in 174 lines of code.
tsx
import {StrictMode } from "react";import {createRoot } from "react-dom/client";import {createJazzReactApp ,DemoAuthBasicUI ,useDemoAuth } from "jazz-react";import {App } from "./app.tsx";constJazz =createJazzReactApp ();export const {useAccount ,useCoState } =Jazz ;functionJazzAndAuth ({children }: {children :React .ReactNode }) {const [auth ,state ] =useDemoAuth ();return (<><Jazz .Provider auth ={auth }peer ="wss://cloud.jazz.tools/?key=chat-example-jazz@gcmp.io">{children }</Jazz .Provider >{state .state !== "signedIn"&& <DemoAuthBasicUI appName ="Jazz Chat"state ={state } />}</>);}createRoot (document .getElementById ("root")!).render (<StrictMode ><JazzAndAuth ><App /></JazzAndAuth ></StrictMode >);
result
Jazz Cloud
Serverless sync & storage for Jazz apps
To give you sync and secure collaborative data instantly on a global scale, we're running Jazz Cloud. It works with any Jazz-based app, requires no setup and has straightforward, scale-to-zero pricing.
Jazz Cloud is currently free — and it's set up as the default sync & storage peer in Jazz, letting you start building multi-user apps with persistence right away, no backend needed.
Collaborative Values
Your new building blocks.
Based on CRDTs and public-key cryptography, CoValues...
- Can be read & edited like simple local JSON state
- Can be created anywhere, are automatically synced & persisted
- Always keep full edit history & author metadata
- Automatically resolve most conflicts
Bread-and-butter datastructures
CoMap
- Collaborative key-value map
- Possible values:
- Immutable JSON & other CoValues
CoList
- Collaborative ordered list
- Possible items:
- Immutable JSON & other CoValues
CoPlainText
& CoRichText
Coming soon
- Collaborative plain-text & rich-text
- Gracefully prevents most editing conflicts
- Rendered as markdown, HTML, JSX, etc.
CoStream
- Collection of independent per-user items streams:
- Immutable JSON & other CoValues
- Great for presence, reactions, polls, replies etc.
First-class files & binary data
BinaryCoStream
- Represents a file or live binary stream
- Can be referenced and synced like any other CoValue
- Can easily be converted from/to browser
Blob
s <input type="file"/>
->BinaryCoStream
->Blob
->BlobURL
ImageDefinition
- Represents multiple resolutions of the same image
- Can be progressively loaded, including super fast blur preview & image size info
Secure permissions, authorship & teams
Group
- A scope where specified accounts have roles (
reader
/writer
/admin
). - A
Group
ownsCoValues
, with access right determined by group roles. - Accounts can be added to groups directly or using shareable invite secrets.
Account
- Represents a single user and their signing/encryption keys.
- Has a private account root and a public profile
- Can contain arbitrary app-specific data
Jazz works with your favorite stack
Coming soon
Auto-sub
Let your UI drive data-syncing.
- Load and auto-subscribe to deeply nested
CoValues
with a reactive hook (or callback). - Access properties & metadata as plain JSON.
- Make granular changes with simple mutators.
- No queries needed, everything loads on-demand:
profile?.tweets?.map(tweet => tweet?.text)
Cursors & carets
Ready-made spatial presence.
- 2D canvas cursors Coming soon
- Text carets Coming soon
- Element-based focus-presence Coming soon
- Scroll-based / out-of-bounds helpers Coming soon
Auth Providers
Plug and play different kinds of auth.
- DemoAuth (for quick multi-user demos)
- WebAuthN (TouchID/FaceID)
- Auth0, Clerk & Okta Coming soon
- NextAuth Coming soon
Two-way sync to your DB
Add Jazz to an existing app.
- Prisma Coming soon
- Drizzle Coming soon
- PostgreSQL introspection Coming soon
File upload & download
Just use <input type='file'/>
.
- Easily convert from and to Browser
Blob
s - Super simple progressive image loading
Video presence & calls
Stream and record audio & video.
- Automatic WebRTC connections between
Group
members Coming soon - Audio/video recording into
BinaryCoStreams
Coming soon
Become an early adopter
We'll help you build your next app with Jazz
It's early days, but we work hard every day to make Jazz a great tool for our users.
We want to hear about what you're building, so we can help you every step of the way. We'll prioritize features that you need to succeed.