I Shipped...

18 September 2025 (2PRs)

quickstart guides for React, Svelte and Server Workers for Jazz

Previously, users who wanted to get started with Jazz could either use the command line tool to scaffold a project, or they could work through an installation tutorial which covers the practical side of getting Jazz added to an app, but doesn’t guide folks to an ‘ah ha!’ moment.

I wrote a quickstart guide which works for both React and Svelte, and added a follow up which shows how to use Jazz on the server with a worker. These guides will help users understand the core concepts of Jazz.

update `useFramework` to respond to TAB_CHANGE_EVENTs emitted on the window

Jazz’s documentation site lets you switch between different frameworks (like React and Svelte) to see relevant code examples. I fixed a bug where some parts of the page wouldn’t update when you switched frameworks — they’d stay stuck showing the one you first loaded. Now the whole page updates consistently when you pick a different framework.

16 September 2025 (1PR)

a small docs update to clarify how to use recursive references.

Our existing docs explained how to use getters to recursively reference schemas, but weren’t very clear about how to avoid ReferenceErrors caused by schemas creating circular references which resulted in references being evaluated while they were still in the temporal dead zone.

I added some additional keywords and explanation to help folks find these docs more easily when they’re searching, as well as explaining the use cases in a bit more detail.

12 September 2025 (3PRs)

an update to the Svelte InviteListener so that it listens to hash change events.

Web pages often have ‘links’ that can change part of the page without reloading the whole thing. These changes sometimes show different content depending on the link. In Jazz, we can invite people to collaborate on data using links, and we need to notice when someone follows a link.

Previously, the code that checks the URL for invitations only checked once — when the component first appeared on the page. That worked if the person opened the page fresh, but it wouldn’t notice if the URL changed later (for example, if someone clicked a link that added extra info to the URL, called a ‘hash’).

What I did was adjust the code so it also watches for changes to that part of the URL — the hash — so it reacts immediately whenever someone follows a link, not just on page load. That way, no invitation is missed, no matter how the user navigates.

update examples to use environment variable for API key

Jazz is a framework for building real-time collaborative apps. I updated all the example projects so they load the API key from a configuration file instead of having it hard-coded in the source code. This makes it easier for the Jazz team to track how their examples are being used and is a better practice for managing secrets.

update Svelte starter

Jazz is a framework for building real-time collaborative apps. After a previous change required all example apps to use an API key from a configuration file, the Svelte starter template would crash if that file was missing. I fixed it so the app loads the key dynamically instead, meaning new developers can get started without hitting an error on their first run.

10 September 2025 (1PR)

replace delete local data modal with a reusable component

Jazz’s docs site has a confirmation dialog that pops up when you want to delete your local data. The code for this dialog was written inline and couldn’t be reused elsewhere. I extracted it into its own standalone component so it can be shared across different parts of the site.

9 September 2025 (2PRs)

add a 'delete local storage' option to the inspector

Jazz is a framework for building collaborative apps that store data locally on your device. I added a button to Jazz’s built-in developer tools that lets you clear all your local data, which is useful for testing and debugging. It comes with a clear warning so you don’t accidentally delete things, and I also built a reusable confirmation dialog to go with it.

make latency bar red if there's an ongoing outage

Jazz has a status page that shows whether its services are running. During an outage, the “status” indicator correctly showed things were down, but the latency chart right next to it was still bright green, which was confusing and misleading. I made the latency bar turn red whenever there’s an active outage, so the visual indicators are consistent.

8 September 2025 (1PR)

update chat example to use $jazz for message and image handling

Jazz is a framework for building real-time collaborative apps. I fixed the Vue.js chat example app so it properly uses Jazz’s built-in helpers for sending messages and handling image uploads, instead of the outdated approach that had stopped working.

5 September 2025 (1PR)

docs/quick fixes

Jazz is a framework for building collaborative apps. I made a batch of small fixes across the docs — updating React Native setup instructions, standardising how user profiles are defined in examples, adding missing options to the React setup guide, and cleaning up a few other rough edges.

25 August 2025 (1PR)

update Svelte testing path in package.json

Jazz is a framework for building real-time collaborative apps. There was a typo in the package configuration that meant Svelte developers couldn’t import Jazz’s testing utilities. I corrected the file path so that the testing tools can be found and imported properly.

20 August 2025 (1PR)

add pagination and fix table layout issues

My drinks tracking app was showing all entries in one big list, which got unwieldy. I added pagination with Previous/Next buttons so you can browse through entries page by page. I also fixed a layout bug where long drink names would stretch the table and break the page, and corrected how alcohol percentages are displayed so they don’t show excessive decimal places.

1 August 2025 (2PRs)

docs/optional references

Jazz is a framework for building collaborative apps. I expanded the documentation on optional references — explaining when to use Jazz’s own “optional” versus the standard one from the validation library. This helps developers avoid a confusing gotcha when defining their data models, and I also fixed a couple of broken code examples along the way.

fix HTTP API link in inbox.mdx. Fixes #2687

A link in the Jazz documentation was broken because it had an extra .mdx file extension on the end of the URL. I removed the stray extension so the link goes to the right page again.

24 June 2025 (1PR)

post 0.15 docs fixes

After Jazz released version 0.15, I cleaned up a few things in the documentation. I removed outdated references to the old version, added a clearer warning about a common setup mistake that was tripping people up (including me), and made sure all the installation guides mention the required Node.js version.

12 June 2025 (1PR)

update README and .gitignore files

Jazz is a framework for building real-time collaborative apps. I cleaned up how environment files (which store secret settings like API keys) are handled across all the example projects. Previously some examples accidentally included real configuration files in the public repository. I made sure only template files are shared, with clear instructions for developers to create their own private copies.

9 June 2025 (1PR)

add w-full to the pagefind container div

Jazz’s documentation site had a bug where the search bar was causing horizontal scrolling on the page, especially on small screens. I fixed it by making the search container take the full width of its parent, which stops it from overflowing.

5 June 2025 (1PR)

update README files to reflect changes in local sync server setup

Jazz is a framework for building real-time collaborative apps that sync data between users. I updated the setup instructions across all the example projects to reflect a new way of connecting to a local sync server, so developers following along wouldn’t get tripped up by outdated documentation.

2 June 2025 (1PR)

remove unnecessary console.log

I removed a leftover debugging statement from the Jazz codebase. Developers sometimes add temporary log messages while building features and forget to clean them up — this was one of those.