I Shipped...

2 December 2025 (1PR)

improvements to our React Native and Expo documentation, added a 'polyfills' module to Jazz

In our React Native and Expo documentation, we had some references to outdated practices and unnecessary modules. I refactored the docs to remove these, and I also consolidated the polyfills into a single module which can be imported directly from Jazz.

1 December 2025 (2PRs)

an 'Advent of Jazz' banner for our homepage to promote the initiative

I proposed and launched an ‘Advent of Jazz’ initiative on our Discord. This PR adds a prominent link through a banner for December.

increase Z-index of AoJ banner

The Jazz website had a promotional banner for “Advent of Jazz” that was supposed to stay visible on top of all other content as you scroll. But some elements further down the page were appearing over the banner, hiding it. I increased the banner’s stacking priority so it always stays on top.

25 November 2025 (3PRs)

a bugfix for an issue where `ensureLoaded` was throwing despite `$onError: 'catch'` being set

Normally, Jazz will throw if it cannot complete a resolve query as requested by the user (for example because the user doesn’t have access to the data or it doesn’t actually exist). Users can override this by specifying $onError: 'catch', which will instead return the rest of the query completed correctly with only the CoValue in question missing.

There was a bug in how this was implemented which I fixed.

an improvement to our homepage which lets us know when someone abandons a search

Previously, our analytics only captured successful search. This improvement allows us to track unsuccessful searches.

24 November 2025 (5PRs)

a docs update regarding credential persistence on iOS

When a Jazz app is uninstalled, all data is deleted except the login credentials on iOS which are persisted to the keychain. This can cause issues if the account is not synced and the user reinstalls the app.

a refactoring of our useFramework hook

In our docs, we have a hook which fetches the current framework, however, there were other bits of code around the codebase which do similar things, and the hook was becoming unwieldy and difficult to follow.

I refactored the useFramework hook to make it easier to use, and improve the separation of concerns on the homepage docs.

an update to the docs clarifying how to use React Native Fast Encoder

Expo and React Native do not ship a TextDecoder implementation. This docs update explains how to polyfill for (huge) performance improvements in native apps.

fix issue when code sample is formatted

The Jazz docs have code examples that hide certain lines to keep things simple. In the Svelte permissions guide, a “hide this line” marker was only hiding the first line of a multi-line block of code, leaving extra lines visible that shouldn’t have been shown. I fixed the formatting so the right lines are hidden.

improved type-checking for vanilla snippets

We had some small issues with the new vanilla docs because the snippets were created before the big refactoring of code snippets was merged. This PR brought them in line with the framework specific snippets.

18 November 2025 (1PR)

fix #3186

Jazz’s documentation had a missing asterisk in a role permissions table, which meant a footnote reference wasn’t displaying correctly. I added the missing character to fix the formatting.

13 November 2025 (4PRs)

add .svelte-kit to ignored paths

Vercel’s Workflow SDK helps you build long-running background tasks. SvelteKit (a web framework) generates a build folder called .svelte-kit that should be ignored by tools watching for file changes. I added it to the ignore list so the workflow SDK doesn’t unnecessarily process those generated files.

an update to our React Native and Expo example apps, demonstrating how to use images

We have an example chat app for all our supported frameworks. For our browser-based frameworks, this chat allows also uploading images to the chat, but our mobile apps did not.

I added the image upload functionality to the mobile framework examples.

documentation for a pattern on how to create set-like collections

Users can create lists using Jazz, but there’s no protection to stop users from inserting the same item multiple times into a CoList. For users wanting lists of unique items, I proposed and wrote up a pattern for using a CoRecord keyed on the CoValue ID.

fix homepage build issues

The Jazz homepage stopped building after a recent change added a new dependency that made a previously-needed TypeScript workaround invalid. I removed the outdated workaround and added a proper type check, which got the homepage building and deploying again.

12 November 2025 (1PR)

a Jazz demo where users can create a collaborative piece of music on a step sequencer

This was a huge piece of work ahead of SyncConf 2025. I built a Jazz-based step sequencer in SvelteKit. Users can collaborate on an 8 beat grid to trigger various one-shot samples in a musical sequence.

The demo is aimed at iPad screen size, and includes primitive sync logic to make sure that devices sound in sync when played simultaneously. This was particularly challenging, and I eventually did it based on calculating clock skew roughly based on a heartbeat from the Jazz mesh. I would like to explore using Jazz as a WebRTC signalling channel.

The source for this is currently closed, but the demo can be accessed at https://jazz-groove.vercel.app/

11 November 2025 (1PR)

add Jazz Workflow World documentation

Jazz is a framework for building collaborative apps. “Workflow World” is a Jazz feature that lets you run backend tasks and workflows. I wrote the documentation for it, covering how to get started, how to set up webhooks, and how to self-host it.

10 November 2025 (1PR)

a PR to fix an infinite navigation loop on our docs

At some point, I introduced a regression that was causing our homepage docs to enter into a recursive navigation loop calling useEffect multiple times. This quick PR fixed it.

I was quite pleased with the PR title on this one: “…infinite recursion: a fix to prevent…”

7 November 2025 (1PR)

a huge docs update, removing twoslash in favour of extracted code snippets

Twoslash is a code-highlighting and type-checking plugin which helps to make sure all our code samples are kept up to date. Unfortunately though, it causes our build times to be very slow.

I extracted all of our code samples into separate files, and developed a new way of integrating them into our docs. This led to huge speed wins, bringing our build times down by around 5 minutes per build (on Vercel), roughly 14 hours of compute per month.

It also brought even more significant savings in terms of development. Where previously, it took me (M4 Macbook Pro) 110s to compile the docs in dev mode, now it takes 7s, a speed increase of 15×, making it much easier to develop our homepage and our docs overall.