Why Jazz / Comparisons

See what sets Jazz apart, how it compares to the tools you might know, and what it changes for a team.

For developers

Jazz is your whole data layer: database, sync, streams and files, running inside the backend you already have.

Without it, that layer is usually assembled by hand: a traditional database for tables, a blob provider for files, a stream or pub/sub service for chat, presence and agent output, and a sync layer so screens update live and keep working on a flaky connection. Each piece has its own client, its own idea of who the user is and its own permission rules, and your team writes and maintains the glue that keeps them consistent.

With Jazz:

  • Your app and its data live together. Jazz runs inside your backend, so there's one less vendor and one less service to run. Tables, relations and a typed client work the same in backend and frontend. Jazz plugs into whatever auth your backend uses, and clients sync with your backend over a same-origin endpoint (/jazz by default) using your app's existing session.
  • Your API layer mostly disappears. Permissions are declarative, so browsers and API routes can run Jazz queries and transactions directly, and Jazz checks each one for the user making it. Backend code can act with full trusted access or as a specific user, so you only write endpoints for logic a policy can't express.
  • Sync built in. Subscribe to any query and your UI stays current on its own: a feed, a dashboard or a shared list updates the moment someone adds, edits or removes a row. When a screen needs instant writes or offline support, switch that client to local-first, with the same schema, queries and policies.
  • Streams and files in the same model. Files, streams and mergeable text live in Jazz too, so they sync and follow your permissions like every other value. Edit metadata ($createdBy, $updatedAt, …), history, drafts and branches come with every row.
  • One set of permissions. Policies live next to your schema in TypeScript and apply the same way to backend code, thin clients, local-first clients, files and streams. They're verbose, but agents are good at writing and checking them.

Compared to

Supabase

JazzSupabase
In common
Relational dataTables, typed columns, relations and indexes.
Database, auth hooks and permissions in oneOne system for data, access rules and a client SDK, with no API layer to hand-write.
RealtimeClients can subscribe to changes.
Differences
Where it runsInside your own backend, so your app and its data live togetherA separate hosted platform, or a self-hosted multi-service stack
Live updatesQuery results stay up to date without manual reconciliationA stream of row changes your client reconciles by hand
PermissionsDeclarative permissions in TypeScript, next to the schemaDeclarative policies in SQL, on Postgres tables
History, branches and mergeable text✓✗
Offline writes and instant local UI✓✗
Full Postgres and its extensions✗✓

When to use Jazz. You want live queries, typed policies and collaboration features without running a database platform, and you want the option of offline-capable local-first clients later.

When to use Supabase. You need full Postgres and its extension ecosystem, or you want a mature hosted dashboard with auth, storage and functions included.

Postgres

JazzPostgres
In common
Relational modelTables, joins, constraints and transactions.
Open sourceRun it yourself, wherever you like.
Differences
Live queries✓✗
Permissions for end usersBuilt in, as declarative permissionsYour API layer, or declarative policies in SQL
Sync to browsers and devices✓✗
MigrationsTyped and generated from the schemaSQL you write, or a separate tool
Arbitrary SQL and analytics✗✓
EcosystemYoungDecades of tools, extensions and hosting options

When to use Jazz. Your app needs users to see each other's changes live, with access rules enforced in one place, and you want less code to maintain: no API and sync layer of your own on top of a database.

When to use Postgres. You need arbitrary SQL, heavy analytics or a specific extension, or your data already lives there and many systems read it.

Plain SQLite

JazzSQLite
In common
StorageJazz builds on SQLite under the hood, using its speed, proven reliability and lightweight, portable storage.
Runs anywhereServer, browser and mobile.
Differences
Sync between clients and server✓✗
Permissions✓✗
Live queries✓✗
Concurrent edits from many devicesMerged by JazzYour app's responsibility
DependenciesThe Jazz libraryNone

When to use Jazz. You want sync, permissions, live queries or offline support for your data, whether one user writes it or many.

When to use SQLite. You want an embedded SQL database without sync, collaboration, auth or permissions built in.

Plain Durable Objects

JazzDurable Objects
In common
Unit of scaleSmall stateful units close to users.
SQLite underneathEach unit keeps its state in SQLite.
Differences
Data modelTables and queries across all your dataPer-object state and storage you design
Transactions across units✓✗
Permissions and live queriesBuilt inCustom code in each object

When to use Jazz. You want to work with shared data through tables and queries, with permissions and live updates built in. Durable Objects work best when your app splits into isolated islands of state; Jazz gives you one database across many of them, with transactions across shards.

When to use plain Durable Objects. Your app is made of isolated pieces of shared state, such as game rooms or rate limiters, and you want to build that behaviour yourself.

Convex

JazzConvex
In common
Reactive queriesClients see query results update as data changes.
Typed schemaSchema and types in TypeScript.
Differences
Where it runsInside your own backendConvex's hosted service, or self-hosted
QueriesDeclarative relational queriesServer functions you write and deploy
PermissionsDeclarative policies, plus ordinary code in your own backend routes for rules too complex for a policyChecks written inside each function
Offline writes with local-first clients✓✗
Server functions next to the dataUse trusted backend API endpoints in your main backend✓

When to use Jazz. You want to query shared data directly from your app, define permissions once, and add offline support where you need it.

When to use Convex. You want to build your app around server functions, with a hosted backend that clients connect to for updated data.

Zero

JazzZero
In common
Synced query resultsClients get query results synced from the server and kept up to date.
Client-side cacheFast reads from data already on the device.
Differences
Source of truthJazz itselfYour existing Postgres
Thin client with no local cache✓✗
Offline writes✓✗
History, branches and mergeable text✓✗
PermissionsOne set of policies for backend, thin-client and local-first accessDefined in your Zero app code

When to use Jazz. You're starting fresh, or you want a database with collaboration features, permissions built in and offline writes.

When to use Zero. Postgres is already your source of truth and you want to add synced queries in front of it.

Neon

JazzNeon
In common
ServerlessNo database server to size or keep warm.
RelationalTables and queries.
Live queriesSubscribe to a query and see its results update.
Differences
Setting up live queriesSubscribe to any query from the clientEnable Realtime per branch, then write each query on your server, seal it per user and serve it from an endpoint
WritesClients write directly, checked by your policiesThrough API routes you write, with optimistic updates wired up in the client
PermissionsPolicies next to the schema, for reads and writesWhatever your sealed queries and API routes enforce
Offline writes✓✗
Real Postgres✗✓
Branching dev databasesDrafts and branches on rowsBranch the whole database

When to use Jazz. You want the database, sync, permissions and live queries as one system, without the server code that wires them together.

When to use Neon. You want managed serverless Postgres, with database branching for development.

TanStack DB

JazzTanStack DB
In common
Live queries on the clientReactive queries that update the UI as data changes.
Optimistic writesThe UI updates before the server confirms.
Differences
Server and storageIncludedYour own backend and APIs
Permissions✓✗
Same queries on the backend✓✗
Works with an existing backend unchanged✗✓

When to use Jazz. You want a database with sync and permissions built in, using the same queries and access rules across both frontend and backend.

When to use TanStack DB. You have a backend and APIs you're keeping, and want reactive client collections on top of them.

For engineering leaders

  • Less code to maintain: no glue code for data access, sync or permissions.
  • Fewer moving parts: live and collaborative features natively in Jazz, without a separate stack.
  • Keep your existing auth: your backend passes each user's identity to Jazz, including roles and claims from your identity provider, and policies check them directly.
  • Choose where it runs: run Jazz on your own infrastructure, bring your own cloud, or use Jazz Cloud.
  • Licensing: MIT for unsharded Jazz; unlock sharding with an enterprise license.