I Shipped...

4 August 2026 (9PRs)

a benchmark for known-state payload scaling

I added a benchmark for a sync case where the server already knows some of the client’s data. It keeps the amount of data being rebuilt constant, varies how much is already known, and checks that the client still receives the exact right versions; this lets us measure how much network data can be avoided.

attributed receipts for persisted R3 reads

I added a way for the persisted-read benchmark to say where its time went: opening the storage, opening Jazz, preparing the query, and building the first result. The existing benchmark result is still recorded, so the new numbers explain the old measurement rather than replacing it.

a fix for indexing split exclusive transactions

Some transactions arrive in several messages. If the final message arrived after earlier pieces had been cached, the code could rebuild the current view from just that last piece, so old rows disappeared; I now reload all pieces before rebuilding the indexes.

a fix for duplicate authorisation proofs consuming result slots

An access-control query can prove that a row is allowed through more than one policy route. Those repeated proofs were being counted as separate result rows before sorting and limiting the answer, so I changed the query to keep one proof per row and policy route before applying the limit; normal joins still keep their duplicate rows when duplicates are meaningful.

refreshed the performance benchmark roadmap

I refreshed the performance roadmap to match the investigations and benchmark receipts that now exist. It separates completed work from open questions and records the places where measurements showed no improvement.

recorded how selective data loading scales

I added a repeatable benchmark that measures how a selective lookup behaves as the underlying table grows. It records the exact result, the number of rows read during each phase, and the current implementation's known limit, so future improvements can be checked against a clear baseline.

lowered work for filtered relation lookups

I changed lookups that follow linked records so safe filters are applied earlier, reducing the rows carried through the rest of the query. When limits or offsets make reordering unsafe, the lookup keeps its original order.

kept indexed single reads from scanning whole tables

I fixed a query path that found the right index but then lost that choice and scanned the whole table. The lookup now keeps the specific index binding, so it reads the small candidate set while returning the same ordered results.

aligned native runtime error types

I made the browser and native versions of Jazz agree on the shape of a couple of error values. This keeps optional remote stack traces intact and gives WebSocket callbacks the types the code actually uses.

24 July 2026 (1PR)

removed stale permission examples from the docs

I removed old permission examples from the Jazz docs that no longer matched how the system works. This keeps the documentation from teaching people an outdated way of checking permissions.

23 July 2026 (7PRs)

patched Next.js versions across Classic Jazz

I updated the Next.js versions used by the examples, tests, and homepage to the patched 15.5.21 release. I also tidied the surrounding dependency pins and formatting issues so the change could be checked consistently.

compatible Better Auth 1.6 client types

I stopped Jazz's client type definitions from exposing details that change between Better Auth releases. This keeps normal Better Auth type checking working while preserving Jazz's own account and action types, with checks for the 1.6 setup.

validate integer values before native writes

I made Jazz check integer values before passing them to native code. It now gives clear errors for fractions, non-finite values, and numbers outside the signed 32-bit range, with documentation and boundary tests.

update Classic Jazz to patched Next.js 15.5.21

I updated the repository's Next.js users to the patched 15.5.21 release and centralised the version pins. I also fixed the formatting and lint issues needed to validate the update.

support Better Auth 1.6 client types in jazz-tools

I fixed Jazz's Better Auth client types so they no longer expose version-specific internals from Better Auth. That keeps normal Better Auth inference working while retaining Jazz-specific account and action types, and adds a compatibility check.

restore migrated row history when deletes are replayed

I fixed a problem where deletes in migrated data could lose the row's earlier history. I made Jazz resolve that history from the row's origin records and rebuild the right branch state, with tests for deletes, renames, permissions, and recovery.

preserve TypeScript types through column modifiers

I fixed a TypeScript inference issue where chaining column modifiers could throw away specialised types. The stored, displayed, and inserted value types now stay distinct and accurate, with regression tests.

22 July 2026 (3PRs)

the patched Next.js release across Jazz workspaces

I updated the shared Next.js version used by Jazz's workspaces to 16.2.11, which includes security fixes. I also adjusted the docs image route so the static site could build all of its images again.

active browser sessions during concurrent test runs

I fixed a timing problem where a live browser session could be mistaken for an abandoned one while it was still saving. The cleanup now waits for evidence that a session is really abandoned, so concurrent tests do not lose stored sessions.

update Jazz's Next.js dependencies for security fixes

I updated the shared Next.js version to 16.2.11 across the affected workspaces. I also fixed the docs image route so the new version can build all static images.