I Shipped...

1 April 2026 (4PRs)

a unified signature for createInviteLink across core and browser

Our createInviteLink function had two different shapes depending on whether you imported it from the core library or from the browser/React Native wrappers. That was confusing for users and, in particular, was causing AI coding assistants to generate broken code because they’d mix up the two forms. I added an options-object overload to the core version so it matches the browser version, and cleaned up some duplicate implementations along the way. The old positional form still works, but it’s now deprecated.

a Vue 3 example app showcasing Jazz

I built a complete Vue 3 example app demonstrating Jazz as a local-first relational database. It covers schema definitions, permissions, and file handling — everything you need to see how Jazz works with Vue.

file and blob storage for the Wequencer example

I migrated the Wequencer example app from storing sound data as inline bytes to using Jazz’s proper file/blob storage pattern with createFileFromBlob. This is the recommended way to handle binary data in Jazz.

updated dev docs reflecting the build-less workflow

I updated the developer documentation to reflect the current build-less status quo, adding sections on the project layout (schema.ts, permissions.ts, migrations), the defineApp pattern, and type helpers.

31 March 2026 (3PRs)

a change to install wasm-pack via cargo in jazz2

I removed the npm wasm-pack package and switched to installing it via cargo instead. This eliminates the axios transitive dependency, reducing the risk of supply chain vulnerabilities.

a change to install wasm-pack via cargo instead of npm

We had been pulling in wasm-pack as an npm package, which dragged in axios and another helper library as transitive dependencies — more things to trust from the npm ecosystem. Since anyone building our Rust/WASM crate already has a full Rust toolchain installed anyway, I switched us to installing wasm-pack directly via cargo install. One less set of supply-chain risks to worry about.

a fix for InvalidSignature errors when concurrent writes happen

When two writers were updating the same piece of data at the same time, Jazz would sometimes throw an InvalidSignature error on load. The cause was a classic off-by-one: our code was using a count where it needed an index, so it was fetching one more transaction than the stored signature actually covered. I changed that one number and the storage layer now copes with concurrent writes properly.

27 March 2026 (2PRs)

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.

granular reactivity for Svelte and Vue

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.

26 March 2026 (1PR)

rune-based test infrastructure for Svelte

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.

20 March 2026 (2PRs)

a full chat example with permissions and invite flow

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.

JWKS rotation support for self-hosted servers

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.

19 March 2026 (1PR)

a fix for a race condition in our auth storage code

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.

18 March 2026 (1PR)

aligned Vue and Svelte bindings to match the React API

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.

12 March 2026 (2PRs)

a fix to always run the schema build on every build

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.

ordered transport batching for sync

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.

11 March 2026 (4PRs)

a type import fix in the Svelte quickstart example

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.

AGENTS.md and skill files into newly scaffolded Jazz projects

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.

an MCP server that lets AI assistants search the Jazz docs

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.

reorganised docs to split deployment configuration from server setup

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.