I Shipped...

19 August 2026 (18PRs)

quieted misleading React test warnings

React Todo tests were doing asynchronous work outside the wrapper React expects, so they printed warnings even when the tests passed. I put the waits inside the right wrapper and ran the browser files one at a time because they share temporary server state, leaving the tests green without the noisy output.

brought Moon Lander's write tests up to date

Moon Lander had moved to a newer way of saving data, but its test helper still pretended the old methods existed. I updated that helper to follow the current insert-and-update flow, so the four tests can reach their real assertions again.

Better Auth support for non-UUID users

I made Better Auth work when user IDs are ordinary strings instead of UUIDs. Browser and server code now turn the same ID into the same internal identity, including for WebSocket connections, while keeping the original ID available and protecting built-in session fields.

transaction overlays scoped per table and row

I fixed pending transaction overlays that were keyed only by row ID. They now also include the table name, so two tables can safely have the same row ID without one table's pending value hiding the other's.

transaction IDs in the public Rust API

I renamed the public Rust API's batch terminology to transaction terminology. Internal query-engine and wire-format names stay unchanged where they are implementation details, while the public API, bindings, examples, and tests now use the clearer vocabulary.

safer authentication and insert configuration types

I tightened the configuration types for inserts and authentication so incompatible options cannot be combined accidentally. I also made local-first authentication return its new token through configuration inspection without exposing the original secret.

removal of deprecated authentication and permissions options

I removed two old configuration options that had newer replacements: the authentication secret storage key and the combined permissions setting. The affected example now uses the current, separate options.

regression coverage for rejected ancestry and global reads

I added focused tests for two synchronisation guarantees in the new core. They prove that a rejected update does not block a later fresh commit, and that global reads eventually use the authoritative remote value while a local write remains pending.

recovery from transient storage commit failures

I made the database recover cleanly when a storage commit fails before anything is durably written. The in-memory state and sequence clock are restored, so an exact retry can succeed instead of leaving the database permanently poisoned.

point reads for single-row policy checks

I changed single-row update and delete policy checks to read only the requested row. They no longer load every row in the table just to find one matching identifier.

pending writes that survive subscription hydration

I fixed subscriptions losing local inserts, updates, or deletes while they were applying a server snapshot. Pending changes now remain visible until they are accepted or rejected, while genuine server changes still reconcile normally.

local-first authentication support in React JazzProvider

I added a local-first authentication mode to React's JazzProvider. It loads the saved secret before creating the client, shows the configured fallback while that happens, and keeps the existing authentication modes unchanged.

declared id columns that win over physical row IDs

I fixed query paths that treated every column named id as Jazz's internal row identifier. When an application declares its own id, filters and joins now use that application value, while tables without one keep the existing behaviour.

clearer loading state names for Vue queries

I renamed Vue query subscriptions' reactive loading property to isLoading. The behaviour stays the same, but the name now makes it clearer that the value is a boolean state.

clearer loading state names for Svelte queries

I renamed Svelte query subscriptions' reactive loading property to isLoading. Existing loading, success, and error transitions continue to work while the public name better matches the value.

a simpler query propagation option

I removed the old propagate query option so propagation is the single public way to control forwarding. Applications that need a query to stay local can now use propagation: "local-only" consistently.

a reactive one-row query helper for every framework binding

I added reactive one-row helpers for React, Vue, Solid, and Svelte. They keep the query live while making loading, empty, and populated results clear without making developers pull the first item out of an array themselves.

a clearer upsert argument order

I changed upsert to take the table, row ID, data, and optional settings in that order. This keeps the row ID separate from mutation settings and matches the shape used by the other row mutation methods.

13 August 2026 (1PR)

safe handling for exhausted global sequences

I made global sequence allocation fail safely when the counter reaches its maximum value. The final value can be used once, but any later allocation now returns a clear error instead of wrapping around and reusing an old sequence number, and every current allocation path uses the same guard.

12 August 2026 (1PR)

typed subscription events with safer decoding

I replaced loosely shaped subscription messages with typed events that the native and TypeScript layers can agree on. The subscription manager now prepares the exact row layout once, so each update can decode fixed positions instead of guessing from field names, while unknown or redefined layouts fail clearly.