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.

schema.ts
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.

main.tsx
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.

sendMessage.ts
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. 🎉

ChatScreen.tsx
const ChatScreen = (id) => { const chat = useCoState(Chat, id) return chat.messages.map(msg => ( <p>{msg.text}</p> )) }

You don't have to think about deploying a database, SQL schemas, relations, and writing queries… Basically, if you know TypeScript, you know Jazz, and you can ship an app. It's just so nice!

Serious Adopter #4
Technical Founder

Everything you need to ship top-tier apps quickly.

Features that used to take months to build now work out-of-the-box.

Local-first

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.

Multiplayer

Share state with other users and get automatic real-time multiplayer.

Use the same primitives to quickly build user presence UI, like cursors.

File uploads

Create & handle structured data and binary streams/blobs the same way.

Jazz Cloud or your own server become both cloud database and blob storage.

Social features

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.

Permissions

Control access to data with role-based permissions, easily defined locally.

Reference data across permission scopes for granular access control.

Real-time sync

Build your app around mutable local state attached to an account.

Every device with the same account will always have everything in sync.

E2E encryption

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.

Instant updates

Get instant updates throughout your UI every time you locally mutate data.

Remote changes are synced and applied with minimal latency.

Authentication

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";
 
const Jazz = createJazzReactApp();
export const { useAccount, useCoState } = Jazz;
 
function JazzAndAuth({ 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 Blobs
  • <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 owns CoValues, 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

Browser (vanilla JS)
React
React Native
Node.js

Coming soon

Vue
Svelte
Swift
Rust
Kotlin

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 Blobs
  • 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.