a fix for policy evaluation with ephemeral claims
I fixed an issue where per-subscription claims sent by the client weren’t being merged into the server session. This meant policies that depended on ephemeral claims couldn’t evaluate correctly.
I fixed an issue where per-subscription claims sent by the client weren’t being merged into the server session. This meant policies that depended on ephemeral claims couldn’t evaluate correctly.
I added a reconcileArray utility that diffs keyed arrays in place and wired it into the Svelte and Vue onDelta callbacks. This means only the items that actually changed get re-rendered, instead of the whole list.
I replaced the mock-based Svelte tests with .svelte.test.ts files that run through the Svelte compiler. This means the tests exercise real Svelte 5 runes instead of mocking them, so they catch actual bugs in reactive behaviour.
I built a complete React chat example app for Jazz featuring messaging, reactions, a canvas, file uploads, and row-level permissions with an invite flow. It shows how to build a real collaborative app with proper access control.
I added JWKS (JSON Web Key Set) rotation support for self-hosted Jazz servers with a TTL-based cache, on-demand refresh, and a stale-if-error fallback. This means the server can automatically pick up new signing keys without needing a restart.
Jazz stores some authentication secrets behind the scenes, and our set function was telling everyone “the new value is ready!” before it had actually finished writing to storage. That tiny window was enough to cause spurious logouts when another part of the app asked for the session at the wrong moment. I added a missing await so the write finishes before anyone else is notified.
I brought the Vue and Svelte bindings up to feature parity with React. Vue’s useAll now accepts QueryOptions, and the Svelte bindings got a proper SubscriptionsOrchestrator, so all three frameworks have a consistent API.
I fixed a bug where the TypeScript schema build step was being skipped after the first run. The CLI was checking if the output file already existed and bailing out, which meant schema changes weren’t being picked up on subsequent builds.
I implemented batching for the sync protocol’s wire format. Instead of sending one payload per HTTP request, the client now accumulates payloads and flushes them as a single batched POST. This reduces the number of network round-trips and improves sync performance.
The Svelte quickstart example was importing SyncConfig as a regular value import, but it’s only ever used as a TypeScript type annotation. I changed it to import type, which is the correct approach for type-only imports and avoids any unnecessary runtime overhead.
When you create a new Jazz app with create-jazz-app, it now includes an AGENTS.md file and a .skills/ directory out of the box. These files give AI coding assistants like Claude a head start by pointing them to Jazz’s documentation and APIs, so they can help you build without hallucinating outdated patterns.
I built a Model Context Protocol (MCP) server for Jazz that exposes the documentation as searchable tools. AI assistants like Claude can now call search_docs, get_doc, and list_pages to look up accurate, up-to-date Jazz documentation rather than relying on their training data. It uses SQLite full-text search when available, with a keyword search fallback for older environments.
The Jazz server-side documentation was mixing two different concerns: how to set up your server code, and how to deploy it to different environments. I split these into separate pages — the setup guide now focuses on the runtime basics, and a new deployment page covers topics like WASM edge runtimes and multi-region patterns.
Small but satisfying: I spotted a one-character typo in the Svelte installation instructions on the Tiptap docs site and sent in a fix.
The better-auth library released v1.5.3, which moved where certain functions live inside the package. Jazz was importing createAuthMiddleware from better-auth/plugins, but that location was removed in the newer version. I updated the import to use better-auth/api instead, which works across versions and keeps the integration working.
I added a new guides section to the Jazz docs with quickstart guides for Vue and TypeScript, framework patterns with React/Vue/Svelte tabs, binary data handling, and a WHERE operator reference.
I updated the Svelte QuerySubscription to accept an options object as its second argument instead of just a bare string. This brings it in line with the React API and makes it easier to pass configuration like the durability tier setting.
I built an MCP server into jazz-tools that exposes Jazz documentation as searchable tools for AI assistants. You can run it with npx jazz-tools mcp and it gives AI coding assistants direct access to the Jazz docs.
I fixed a race condition where the subscription callback could fire before the internal tracking map was ready. The synchronous immediate_tick() call was triggering the callback before the sender could be inserted into the shared subscription map.
I fixed a bug where demo and anonymous clients always got empty query results. They were sending no session in their subscription payloads, and a previous change had made the server require a session for policy evaluation. Now the server falls back to the session it established during the connection handshake.