I Shipped...

5 May 2026 (1PR)

auto-reloading of Next.js apps when the schema is pushed

During Jazz development, whenever you pushed a new schema, you had to manually refresh the browser to pick up the changes. I added a mechanism where the Jazz Webpack/Turbopack plugin writes a small “schema hash” file to a cache directory on every schema push, and the React provider imports this file during development — so the bundler notices the change and automatically reloads the page for you.

4 May 2026 (1PR)

a fix for a stale repository reference in the create-jazz scaffolding tool

The create-jazz tool, which scaffolds new Jazz projects, had a hardcoded reference to the old repo name garden-co/jazz2. After the repo was renamed back to garden-co/jazz, I updated that one-line constant so the scaffolding tool points to the right place.

1 May 2026 (1PR)

a testing infrastructure cleanup for the chat-react example app

The chat-react example app had two separate test setups running in parallel — one using Playwright and one using vitest browser mode. I consolidated them by moving the Playwright end-to-end test into the main vitest browser test suite and deleting the now-redundant Playwright config. I also cleaned up some leftover React act() wrapper calls that were printing noisy warnings without actually doing anything useful.

30 April 2026 (2PRs)

a fix for sign-up failing on React Native after a local-first session

Jazz lets users start as anonymous “local-first” users and later upgrade to a full account. On React Native, this upgrade was broken with the error “Sign up requires an active Jazz session” because the identity proof method was trying to use a WebAssembly module — which React Native doesn’t support. I overrode the method in the React Native implementation to use the native mintLocalFirstToken function from jazz-rn instead, making the upgrade flow work on iOS and Android.

async example fixes and browser storage eviction guidance in the docs

The docs for setting up a Jazz client had Vue and Svelte code examples missing await before createJazzClient, which returns a Promise — so copying the example would store a pending Promise instead of the actual client. I fixed those snippets and added a new section explaining how browsers can silently delete locally-stored data (called “storage eviction”) and how to call navigator.storage.persist() to ask the browser to keep your data safe.

29 April 2026 (4PRs)

a fix for rows vanishing after schema migrations

When you change your database schema (a “migration”), existing data should stay visible under the new schema. There was a bug where rows that existed before a migration would silently disappear — the resolved table name wasn’t being carried through to the query engine, causing a “table not found” error that just dropped the rows silently. I fixed this by making sure the resolved table name is passed all the way through the schema-aware query path.

a fix for the Expo fetch polyfill rejecting URL and Request objects

On Expo (React Native), Jazz uses a custom fetch wrapper that bridges web-style network calls to the native layer. The web fetch standard allows passing a URL or Request object as input, but the native bridge only accepts plain strings — so libraries like better-auth that use this pattern were crashing. I fixed it by normalising those inputs to a plain string URL plus options before passing them to the native bridge.

automatic browser reloads when schema changes are pushed in development

When developing with Jazz in watch mode, editing schema.ts now automatically reloads the browser to pick up your changes. Previously you had to manually refresh the page after pushing a schema update to see it take effect. I added a callback that fires after a successful schema push and tells the Vite or SvelteKit dev server to send a full-reload signal to the browser.

improved spinner UX and dotenv support for the jazz-tools CLI

The create-jazz setup tool got two improvements. The spinner now advances to “Provisioning Jazz Cloud app” before making the network request, so it no longer looks frozen on the previous step. I also added support for loading .env files so CLI commands like deploy can pick up secrets like JAZZ_ADMIN_SECRET from a .env file instead of requiring them to be set as shell environment variables.

28 April 2026 (1PR)

deduplication of identical permissions bundle publishes

I added content-based deduplication to the permissions bundle publishing step. When you deploy without changing your schema’s access rules, the system now detects that the new bundle is identical to the current one and skips creating a new version — preventing unnecessary version bumps.

27 April 2026 (7PRs)

a fix for startup and auth issues in several example apps

I fixed broken configuration and authentication in several of Jazz’s example applications. The affected apps — including WorkOS auth, Better Auth, Next.js CSR/SSR, Cloudflare Workers, and managed runtime — had issues that stopped developers from using them as working references.

a fix for the SvelteKit dev plugin failing to apply config on cold start

I fixed a bug where Jazz’s SvelteKit plugin didn’t apply its configuration correctly the very first time you started the dev server. The plugin now restarts Vite once after allocating the app ID, so SvelteKit’s server hooks pick up the config properly.

a fix to wait for membership confirmation before enabling the chat composer

I fixed a race condition in the React chat example where the message input would become usable before the server had confirmed the user was a member of the chat room. I added a readiness check to prevent this, and wrote a Playwright end-to-end test to guard against it happening again.

a reorganisation of recipe docs and a new group permissions recipe

I reorganised Jazz’s “recipes” (short how-to guides) into clearer sub-folders — access control, auth, and data patterns — so they’re easier to find. I also added a new recipe showing how to configure group-level permissions for shared data.

expanded scaffold test coverage to all self-hosted starters

I extended our automated tests to cover three starter templates that previously had no test coverage. The tests check that the scaffolding tool creates the right files and structure, so we can catch regressions before they reach developers.

fallback support for framework-prefixed environment variables in the Jazz CLI

I updated the Jazz command-line tool to recognise environment variables with framework-specific prefixes — like VITE_, NEXT_PUBLIC_, PUBLIC_, and EXPO_PUBLIC_. Previously, if you set your app ID using your framework’s conventional prefix, the CLI wouldn’t find it; now it checks all common prefixes automatically.

support for getter functions in Svelte QuerySubscription

I updated Jazz’s Svelte query API to accept getter functions — functions that return a query — in addition to plain query objects. This means reactive query updates now flow through automatically, matching what was already possible in the Vue integration.

24 April 2026 (2PRs)

an expanded local-first auth docs section with internals reference

I restructured the auth documentation to be organized around mental models with framework-specific tabs. I also moved the more technical theory into a new internals reference page covering things like Ed25519 key derivation, JWT structure, and how provider upgrades are verified.

removal of stale JWT claims from starter templates

I removed leftover jazz_principal_id JWT claims from the starter templates. Jazz only reads the sub claim to identify users, so this extra claim wasn’t doing anything — it was just confusing people who were reading the starter code and thinking it was important.

23 April 2026 (1PR)

a fix for a JazzProvider cleanup cycle caused by config object references

I fixed a bug where JazzProvider in React would tear down and recreate the Jazz client unnecessarily. The issue was that a config object in the useEffect dependency array was triggering cleanup on every render. I switched it to use a stable string key instead, which prevents the cycle.