Local-first development toolkit
Ship top-tier apps at high tempo.
Jazz is a framework for building local-first apps — an architecture that lets companies like Figma and Linear play in a league of their own.
Open source. Self-host or use Jazz Cloud for zero-config magic.
Multiplayer
File uploads
Social features
Permissions
Real-time sync
E2E encryption
Instant updates
Authentication
Hard things are easy now.
The sad truth is...
Every stack reinvents how users and machines share state.
For each new app you tackle a mess of moving parts, tech choices & deployment woes. Your code? All over the place.
It’s holding you back from shipping what your app could be.
The good news is...
There’s a single new abstraction that does the whole job.
Jazz gives you mutable local state that’s instantly synced. Including binary blobs. With users & permissions built-in.
All that’s left is building the UX that makes your app special.
Collaborative Values
Build entire apps using only client-side code
Step1
Define your schema using Collaborative Values — your new building blocks.
export class Message extends CoMap { text = co.string; } export class Chat extends CoList.Of( co.ref(Message) ) {}
Step2
Connect to sync and storage infrastructure — Jazz Cloud or self-hosted.
const Jazz = createJazzReactApp(); <Jazz.Provider peer="wss://cloud.jazz.tools/?key=you@example.com" > {children} </Jazz.Provider>
Step3
Create a Collaborative Value, and it will be synced and persisted automatically.
const message = Message.create({ text: “Hello world!” }, { owner: ... }) chat.push(message)
Step4
Read your data like simple local state. Get instant sync and UI updates across all devices and users. 🎉
const ChatScreen = (id) => { const chat = useCoState(Chat, id) return chat.messages.map(msg => ( <p>{msg.text}</p> )) }
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.
Plug and play different kinds of auth.
- DemoAuth (for quick multi-user demos)
- WebAuthN (TouchID/FaceID)
- Clerk
- Auth0, Okta, NextAuth Coming soon
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.
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
More features
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
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.