I Shipped...

19 February 2026

a sync-before-navigate guard for SvelteKit SSR

When you changed data in a Jazz app and then navigated to a server-rendered page, the server could show stale information because the changes hadn’t finished syncing yet. I added an optional navigation prop to the Svelte provider that automatically waits for pending syncs to complete before letting the page transition happen, so the server always has the latest data.

a fix to clear the stored session ID when clearing user credentials in React Native

When a user logged out of a Jazz React Native app, their session ID was accidentally left behind in secure storage even though the rest of their credentials were removed. I fixed the logout function to also clean up the session ID, so there’s no leftover authentication data after signing out.

17 February 2026

contextual error hints when a CoValue can't load due to sync config

When a Jazz CoValue failed to load, you’d just get a vague “unavailable” error with no clue why. I added smarter error messages that tell you the actual reason — for example, if your sync setting is set to “never” or “signedUp”, the error now says so instead of leaving you guessing.

a guard that makes `.create()` fail when the user has no write access to the owner group

If you tried to create content in a Jazz group where you only had read access, it would silently succeed locally but then all the data would quietly fail to sync. I made it throw a clear error right away instead, so you know immediately that you don’t have permission rather than scratching your head over why your data isn’t showing up.

13 February 2026

autogenerate BETTER_AUTH_SECRET

Jazz is a framework for building collaborative apps. One of the example projects in the Jazz repo needed a secret key stored in a config file, but that file isn’t checked into source control for security reasons. This meant the project would fail to build for anyone cloning the repo fresh. I added a script that automatically generates the missing config file so builds just work out of the box.

remove `await` from `create` calls in code examples

I fixed some code examples in the Jazz documentation that incorrectly used await when creating data objects. Creating these objects is actually instant (not asynchronous), so the examples were misleading developers about how the API works.

remove `@manuscripts/prosemirror-recreate-steps` and replace with local implementation

Jazz uses a rich text editor library called ProseMirror for collaborative editing. One of the packages it depended on had known security vulnerabilities and was no longer maintained. I replaced it with a much simpler, locally-written version that does just what Jazz actually needs, removing the security risk and the unnecessary bloat.

11 February 2026

add a docs index to AGENTS.md

AGENTS.md is a file that helps AI coding assistants understand a project. I added a comprehensive index of Jazz’s documentation to this file, so that AI tools like Claude and Cursor can more easily find and reference the right docs when helping developers. I also wrote a script that automatically regenerates this index whenever the docs are built, so it stays up to date.

7 February 2026

fix `toJSON()` serialisation for `co.record`

Jazz uses special data structures called CoRecords to store collaborative data. When you tried to convert a nested CoRecord to JSON (a common data format), the result was wrong because an internal mechanism was intercepting the conversion. I fixed the serialization logic so nested data structures convert to JSON correctly, and added tests to prevent this from breaking again.

30 January 2026

add some skills and reference material

Jazz is a framework for building collaborative apps. I added a set of “skills” — reference documents that AI coding assistants like Claude and Cursor can use to write better Jazz code. These cover topics like performance optimization, permissions, UI integration, and testing, so that when you ask an AI to help you build a Jazz app, it has detailed, accurate guidance to draw on.

27 January 2026

enable dark mode support for minimal to-do list example

Jazz is a framework for building collaborative apps. The docs site has a minimal to-do list example on its landing page, but the icon was an external image that couldn’t adapt to dark mode. I inlined the SVG so it can be styled with CSS, meaning it now automatically adjusts its colours when someone has dark mode enabled on their device.

23 January 2026

an example for Clerk integration with Svelte

An example app which shows how to use Svelte with Clerk as an auth provider.

a guide on how to model data in a Jazz application

It’s challenging sometimes to approach Jazz when coming from a background of other, more traditional DBMSs. I wrote a guide for folks to be able to more effectively plan their apps’ data requirements.

20 January 2026

a link validation script for our docs pages

Our docs had some outdated links. I added a script to validate the links in our docs whenever the homepage is built, and fixed all the broken links.

19 January 2026

a quick fix to upgrade our Svelte versions

A vulnerability was discovered in Svelte. I upgraded our versions to ensure we were not exposed to risks.

17 January 2026

claude improvements

Spicy Golf is an online golf game built with Jazz. I updated the AI assistant instructions (used by Claude for code generation) to match Jazz’s latest patterns and best practices, so that AI-generated code suggestions for the project stay accurate and up to date.

16 January 2026

add a 512px progressive image variant

Jazz is a framework for building collaborative apps. When you upload an image, Jazz automatically creates smaller versions of it so they load faster. The existing sizes jumped from 256px straight to 1024px, which meant medium-sized images (like in a sidebar or card) had to either load a tiny version or wait for a much larger one. I added a 512px in-between size so images load more smoothly in those situations.

fix expo placeholders

Jazz apps can show low-quality placeholder images while the full-resolution version loads. On Expo (a React Native framework for mobile apps), uploaded images had broken placeholders because the image data was missing a required prefix. I added the missing data: prefix so placeholder images display correctly on mobile.

15 January 2026

aPI Reference

Jazz is a framework for building collaborative apps. I wrote a new API reference page for the docs site that gives developers a clear, concise overview of the most important functions they need to work with Jazz’s core data structures, without overwhelming them with every possible option.

13 January 2026

add improved docs for Suspense/Error Boundaries

Jazz is a framework for building collaborative apps. When something goes wrong while loading data, apps need a way to gracefully show an error message instead of crashing. I added documentation explaining how to use React’s Suspense and Error Boundary features with Jazz, so developers know how to handle loading states and errors properly.

document dealing with complex getters

Jazz is a framework for building collaborative apps. When your data models reference each other in circles (like a project that has a manager who has projects), things can get confusing. I added documentation explaining how to handle these circular references cleanly, so developers don’t get stuck in an infinite loop of loading nested data.

12 January 2026

serialize secretSeed as array in auth header

Jazz uses secret keys for user authentication, but these keys were being incorrectly converted when sent between the server and browser — they were being turned into an object format instead of a simple list of numbers. I fixed the conversion so the keys are sent in the right format and can be properly used on the client side for login features like passphrases and passkeys.

8 January 2026

first class Svelte support for Better Auth

I built a Better Auth provider for Svelte, with example project and documentation.

7 January 2026

add vanilla code snippets everywhere

As well as the main frameworks (React, Svelte, React Native, React Native with Expo), we now have code snippets and guides for using Jazz with vanilla JavaScript.

6 January 2026

documentation on how to use suspense hooks

We have the hooks useSuspenseCoState and useSuspenseAccount which integrate with React’s Suspense API to suspend component rendering until all data is successfully loaded.

This PR documents how to use them.

30 December 2025

a `createdBy` getter allowing users to quickly work out who created a particular CoValue

17 December 2025

documentation regarding subscription error handling using onUnauthorized and onUnavailable.

We allow users to do stuff when a subscription throws an error, but this wasn’t documented. I added documentation.

a documented new pattern for credential storage on iOS

We were previously warning users to avoid using never and signedUp on iOS, as this could result in credentials being cached to the keychain, which would not be deleted when deleting the app. In this case, if the user re-installed the app, their client could crash, as the account for which the credentials were created no longer existed. We now recommend that users who want to keep completely local data without syncing use a randomised prefix for their credentials, and store this in the Settings (which is deleted on app uninstallation).

15 December 2025

add a hash

The Jazz homepage has a QR code and a link for quickly getting started, but they were broken because the URL was missing a hash fragment. I added the missing hash so both the QR code and the link work correctly.

fix chat demo

The Jazz docs site has an interactive chat demo embedded in an iframe. It wasn’t working because the page was listening for the wrong event from the iframe. I fixed it to listen to the correct event so the demo works properly again.

14 December 2025

a fix for a quirk of the Web Locks API in Safari

Safari’s Web Locks API doesn’t release immediately on navigation, which was causing the browser to effectively hang when viewing our docs landing page. This PR moved the co-ordination of the routes to a parent component.

12 December 2025

a quick fix to address a security issue in Next

There was a security issue in Next due to an issue in React. I bumped our Next versions.

an update to our docs showing how to use version control effectively in different frameworks

Our docs previously had a page showing how to use Jazz’s version control functionality with React. I updated our docs to show how it can be done across all our supported frameworks.

an update to our docs landing page with a minimal example of how to use Jazz

I’m quite proud of this one: I build a minimal Jazz example (a working to-do list with sync in less than 100 lines of code), and published it on our docs landing page.

use hash fragment in invite URL example

Jazz is a framework for building real-time collaborative apps. I fixed a small documentation issue where the example invite URL wasn’t formatted correctly — it now uses a hash fragment, which is the proper way to structure these links so that sensitive information isn’t sent to the server.

10 December 2025

a minor fix for a regression introduced in our navigation

Our nav was behaving strangely following an update designed to ensure the correct segments were always open. I fixed it.

9 December 2025

improve showcase display on smaller screens

The Jazz website has a showcase page that highlights apps built with the framework. On mobile phones, the images and text were spilling out of their containers and looking messy. I fixed the layout so everything stays neatly within bounds on smaller screens.

4 December 2025

clarify polyfill installation instructions in React Native setup

Jazz is a framework for building collaborative apps. The React Native setup guide said to “install” some compatibility patches, but you don’t actually install them as separate packages — you apply them in your code. I updated the wording to be more accurate and less confusing for developers following the guide.

2 December 2025

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.

a performance tip for using selectors

In Jazz, you can use ‘selectors’ to avoid React re-rendering on every state update. However, the selector function itself still runs. Added tips on avoiding heavy computation inside selector functions, and how to extract that into a useMemo call outside the selector to take advantage of batching.

1 December 2025

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

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.

feedback options for folks using our docs to vote on whether they found our content helpful or not

24 November 2025

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.

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.

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.

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.

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.

18 November 2025

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

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.

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.

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

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

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

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

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.

4 November 2025

a note in our docs warning of the risk of XSS attacks

Currently, Jazz stores secrets in localStorage. This is accessible by client-side JavaScript, and so any untrusted code running in a developers’ app could allow the secret to be extracted. Although this is a required trade-off in order to avoid re-authenticating every single session, users are now warned about the risk of cross-site scripting, and advised to take steps to prevent it.

move codecs under schema and republish link

The Jazz documentation had a page about codecs (tools for converting data between formats) that had become unlinked and unreachable from the navigation menu. I moved it under the “Schemas” section where it logically belongs and re-added the link so people can find it again.

3 November 2025

an update to our docs clarifying that Jazz deduplicates loads under the hood

Jazz intelligently de-duplicates loads, meaning that each part of an application can load exactly what data it needs without worrying about what is loaded elsewhere in the app. The user will not pay a performance hit because only the extra data which is not already loaded will be fetched, and the existing loaded data will not be reloaded.

export SingleCoFeedEntry

Jazz is a framework for building collaborative apps. It has various data types that developers use to build features, but one of them — SingleCoFeedEntry — wasn’t being made available for outside use even though similar types were. I exported it so developers can actually use it in their own code.

1 November 2025

an enhancement to the 'commit' button

I was getting annoyed with Zed not showing any feedback when I tried to commit changes using Cmd+Enter. I made the button appear greyed out when there’s a commit operation pending.

git_ui: Give visual feedback when an operation is pending

Zed is a high-performance code editor. When you made a Git commit from within Zed’s built-in Git panel, there was no visual indication that anything was happening if it took a moment. Users would sometimes click the button repeatedly, thinking it hadn’t worked. I changed the button text to appear dimmed while a commit is in progress, so you can tell it’s working.

30 October 2025

a new section for vanilla users

I added some detail to our existing docs showing how users who are not using a framework (‘vanilla’ users) can get started with Jazz.

an additional section to our performance docs documenting batching as a strategy to improve performance

In our Performance Tips section, I added a section telling users that if they’re adding a lot of values, they can improve performance by inserting them simultaneously in a single call, rather than iterating and inserting each one separately.

an extension to our Cryptography docs and FAQ clarifying our understanding of the legal status of Jazz's encryption algorithms

In Jazz, we use three main cryptographic algorithms: XSalsa20 for encrypting data, BLAKE3, for calculating a rolling hash of appended operations, and Ed25519 for signing the hashes. These are all published and available for anyone to use.

When uploading an app to the Apple App Store, users have to make declarations about whether their app uses standard encryption or not as part of legal requirements around ‘exporting’ cryptography in the US. This section is intended to provide information for Jazz’s users to make informed decisions when responding to these questions.

29 October 2025

a fix for a bug in our types for loading options on CoFeeds

I identified a bug where TypeScript incorrectly required specific options to load a CoFeed. However, the underlying code functionality did not depend on these options. I modified the system to remove this unnecessary requirement, improving its usability.

24 October 2025

a new 'Testing' section for our docs

I wrote a new section for our docs explaining how to test Jazz apps using a variety of different helpers.

22 October 2025

a fix to eliminate critical security vulnerabilities

A number of the packages we depend on have become outdated and have security vulnerabilities. I took care of updating these packages to their latest versions and fixed the issues caused by API changes (particularly for Better Auth).

add custom placeholders for Image components

Jazz is a framework for building collaborative apps. After a recent update, images in Jazz apps would briefly flash their alt text while loading instead of showing a placeholder, which looked jarring. I added the ability for developers to specify their own custom placeholder image (like a company logo or branded loading graphic) so their apps look polished while images load in.

grey out quickstarts for RN

Jazz is a framework for building collaborative apps, and its docs site lets you switch between different platforms. I greyed out the quickstart guides in the navigation menu when viewing React Native or Expo, since those quickstarts haven’t been written yet. This way, users aren’t misled into clicking links that lead nowhere.

21 October 2025

an update to our ImageDefinition docs which makes it more maintainable

Our previous ImageDefinition docs were spread over four files, representing a nightmare for maintainability. I consolidated them into a single file, merging all the content and code samples together to make it easier to avoid mistakes and reduce repetition.

20 October 2025

restructure the docs following the nav menu updates

After the Jazz docs site got a new navigation menu, the actual documentation pages were no longer in the right places. I reorganized all the docs to match the new menu structure, updated all the internal links, and set up redirects so that anyone with an old bookmarked URL gets sent to the right page automatically.

17 October 2025

a new Not Found page

Our previous ‘not found’ page was not particularly useful or professional. The new ‘not found’ page includes a search widget to allow users to find whatever content it was they were looking for when they landed on the ‘not found’ page.

an update to our create-jazz-app utility to ensure that only the appropriate llms-full.txt is fetched

Currently, the create-jazz-app CLI tool fetches an llms-full.txt file which contains a summary of all the content contained in the docs, regardless of framework.

However, since my previous PR got merged, we’re generating framework-specific llms-full.txt files, which will be a) smaller and b) less confusing for LLMs, so now, only the appropriate llms-full.txt gets pulled.

an update to our CLI tool to make sure that the correct llms-full.txt is fetched based on the user's framework

Currently, the create-jazz-app CLI tool fetches an llms-full.txt file which contains a summary of all the content contained in the docs, regardless of framework.

However, since my previous PR got merged, we’re generating framework-specific llms-full.txt files, which will be a) smaller and b) less confusing for LLMs, so now, only the appropriate llms-full.txt gets pulled.

16 October 2025

enhancements to our llms.txt files

I continued developing our llms.txt files. There are three main components to this PR:\

  1. Now, if a user wants to access a markdown version of a particular docs page, they can simply append `.md` to the URL, and it will be served as markdown (this is in line with https://llmstxt.org/#proposal)
  2. Further, the content is now accessible on a framework-by-framework basis. This means that each page does not include irrelevant information relating to other frameworks.
  3. Finally, there are now framework specific llms-full.txt

15 October 2025

fix missing link to the BetterAuth Database Adapter doc

Jazz’s documentation site had a navigation link to the BetterAuth Database Adapter page that had accidentally been removed at some point. I added the link back so people can find that page from the sidebar again.

14 October 2025

a new section for our docs offering performance tips for advanced users

I created a new section in our docs which covers advanced performance tips for the 20% of users who need to push harder on performance than the majority.

filter all the code snippets to show only the framework relevant snippets

Jazz supports multiple web frameworks like React, Svelte, and Vue. The docs used to show code examples for all frameworks at once, which was confusing. I updated the documentation build system so that when you select a framework, you only see code snippets relevant to that framework, keeping things clean and focused.

13 October 2025

an update to our CLI tool which adds more options

Our CLI tool allows you to get started quickly building with Jazz by running npx create-jazz-app. This update gives some more starter options to users running the CLI tool.

a new way to create invites to groups

So far, our users have been able to create invite links which target specific CoValues. But there’s no way to easily get the inviteSecret_ for processing however the user likes.

I created a couple of methods (Group.createInvite(groupId, role) and group.$jazz.createInvite(role) which allow you to manually get the secret, and process it how you like using Account.acceptInvite(). I also improved the API for acceptInvite so that if the invite is not specified, it’s assumed to be a group invitation.

12 October 2025

updates to the way we generate our docs export for LLMs to consume

Previously, our LLMs text file was done simply by searching and replacing naively.

I introduced a step where our docs are rendered out as pure markdown before they are exported. This allows us to mock specific components so we can do things like render the tabbed code group component sensibly.

9 October 2025

a fix to our homepage after an update caused overflow on basically every element, resulting in scrollbars appearing everywhere.

There was a PR which introduced a bug where buttons all had additional absolutely positioned content after them, which resulted in every section containing a button to horizontally overflow its container, resulting in unsightly scrollbars popping up all over the website. I fixed it.

an update to our CLI which makes sure that the latest docs are always fetched when a new project is initialised

We have a tool which allows you to run create-jazz-app with some options to get a new Jazz app set up. This tool was cloning a specific part of our monorepo where a static build of our docs had been copied. However, this had fallen out of date, and so we were wasting our users’ time, bandwidth, and worse, seeding their AI agents with incorrect, outdated data.

I introduced functionality to fetch the latest docs from our website to save for AIs to refer to.

hotfix for homepage

I fixed a CSS bug on the Jazz homepage where unwanted scrollbars were appearing all over the page. A recently added style on buttons was causing content to overflow its containers, so I removed the problematic rule.

8 October 2025

a fix for ugly scrollbar display when using macOS trackpads

macOS defaults to using a weird overlay scroll bar when you’re using a trackpad, which meant that the scrollbars were rendering over content, which looked ugly and unprofessional. I fixed it.

7 October 2025

some extensive changes to our navigation menu

We were starting to outgrow our existing nav structure for docs, with tens of articles and only two hierarchical levels. I extended the hierarchy to allow a third level of nesting, as well as collapsible subheadings in the nav menu.

fix build issues

The Jazz docs site had a build issue where two pages were trying to use the same URL path, causing conflicts. I resolved the conflicting routes so the site could build and deploy successfully again.

6 October 2025

updates to the quickstart guide for authentication which illustrates how to add a recovery key using passphrase authentication

Jazz allows you to authenticate in many different ways. One way is using passkeys, and this was covered in the authentication quickstart guide I published last week. This adds an additional authentication method, passphrases, and shows how to use the two different authentication methods in conjunction to create an effective ‘recovery key’ option.

fixes for our end-to-end tests which were failing in CI due to incorrect imports caused by our test runners upgrading slowly to Node 22.19

We have some automated tests that run when we add new code to our repositories. For a while now, the end-to-end tests have been failing. I spent some time digging into the reasons for this, and fixed the tests so that they no longer fail when newer versions of Node are used to run the tests.

extend auth quickstart to demonstrate passkey auth

Jazz is a framework for building collaborative apps, and its docs site had a quickstart guide for authentication. I extended this guide to show how to add passkey login (the kind where you use your fingerprint or face to sign in) alongside other auth methods, so developers can see how to offer multiple ways for users to log in.

2 October 2025

an enhancement to our existing server-side rendering agent which allows it to be used outside of React

Our existing SSR agent was recommended for use to allow Server-Side Rendering in Next.js apps. However, I realised that the module itself is written in pure TypeScript, and there’s no good reason for it to be React-only. I modified the Svelte provider, changed the export, and updated the docs, as well as creating a small example app demonstrating how the SSR agent can be used to perform Server-Side Rendering in SvelteKit too.

30 September 2025

two quickstart guides, one for authentication and one for groups & permissions

Most of our users need basic features like authentication and collaboration in their apps, but the guides we have are currently very reference-y and not so much practical implementation guides.

I wrote one guide that covers permissions in Jazz using groups, and how to share data and collaborate on it, and a second which shows how to add passkey authentication into your app using the basic passkey UI.

This should make it easier for users to build an app with the kind of features a real-world app needs.

an improvement to our docs, consolidating our various bits of copy for 'getting an API key' into a reusable component

I created a GetAPIKey snippet which can be re-used all over the docs to have a single, consistent message regarding API keys, and allow us to simplify updating and maintaining all these references.

The snippet can also optionally display how the API key can be used.

an improvement for our existing CodeGroup component's copy function

We have a CodeGroup component which allows us to display some code with a copy button. This CodeGroup allows us to write special comments like // [!code --:1] to mark a line as ‘removed’. However, these were still being copied, resulting in inaccurate code snippets being copied when users clicked the button.

This PR removes those lines from the copied text.

29 September 2025

a fix to our passkey implementation which increases the challenge length to 20 bytes

In principle, according to the WebAuthn spec, cryptographic challenges should be at least 16 bytes long, however in our existing implementation, we had 3 bytes. Although this is technically within spec, it was causing issues for some users using third party passkey managers such as KeePassXC.

This PR builds on previous work and extends the challenge length to 20 bytes.

a fix to the discriminated union docs to make it clearer what operations we do and don't support

Due to various challenges with TypeScript generics, we can’t make the $jazz.ensureLoaded, $jazz.set and $jazz.subscribe methods typesafe on discriminated unions. This was causing warnings for one of our adopters in their project.

Although this was previously covered in the docs, it was hidden towards the bottom of the page.

This PR makes it clearer and more prominent.

an option for the Svelte provider which allows users to pass a configuration option identifying their credentials

By default, all credentials are stored under jazz but this makes it impossible to avoid namespace clashes (for example, if you have multiple apps running on the same domain, or in case you want to do local development of more than one Jazz app at a time.

This PR extends on work that was already done to add an option to the Svelte provider, allowing users to specify the prefix under which their credentials will be stored.

clarify use case for ensureLoaded

Jazz is a framework for building collaborative apps. Based on feedback from the community on Discord, I updated the docs to better explain when and why you’d use a particular data-loading function called ensureLoaded, making it clearer for developers who were confused about its purpose.

25 September 2025

documentation of a couple of TypeScript options that Jazz doesn't work well with.

When users try to build their applications, TypeScript will compile Jazz as part of their dependencies. However, there are a couple of options that Jazz doesn’t currently work well with. This PR makes it clear to users what options need to be set for compilation to work properly.

an enhanced and completely reworked version of the Subscriptions & Deep Loading article

Our documentation on how to subscribe to CoValues and load them deeply was complex and difficult to reason about. I simplified, consolidated the examples, and created new illustrative content to make it clearer and easier to understand for users of varying knowledge levels.

23 September 2025

an update to the docs encouraging users to sign up for API keys rather than using their email address

We launched our cloud dashboard recently, allowing users to sign up for API keys rather than using their email address. However, across all of our docs, we had verbiage that users should use their email as a temporary API key.

This PR addresses that by changing the wording to drive traffic to our dashboard instead of recommending email addresses.

22 September 2025

a fix for the responsive image component to avoid an ugly flash of alt text

We have a component in React, React Native and Svelte which can be used to display images with progressive sizes. Although we have an option to show a placeholder, and loading this is normally fast, in case there is a slower load (e.g. network issue, etc.), then there is a flash where the browser’s default placeholder will be displayed (normally just the alt text of the image).

This PR fixes that by instead setting the image to a transparent single pixel (which gets stretched as needed to fit the image based on the size needed by the user). Instead of getting a flash of alt text, nothing will display instead, until the Image Definition is loaded, at which point the default behaviour (show the placeholder or the alt text) will kick in.

18 September 2025

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.

adjust prominence of Node 20 alert

Jazz is a framework for building collaborative apps. The docs site had a big, attention-grabbing warning box telling people they needed Node.js version 20 or higher. I toned it down to a simple note underneath the setup instructions, since it was more prominent than it needed to be.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

19 May 2025

add Svelte provider documentation and metadata

Jazz is a framework for building collaborative apps, and it supports several UI frameworks including Svelte. The docs page for Svelte’s “provider” setup (how you connect your Svelte app to Jazz) was incomplete. I filled in the missing documentation so Svelte developers can properly set up Jazz in their apps.

16 May 2025

fix missing $ in template literal

The Jazz docs had a code example for Svelte passkey authentication where a template literal was missing a $ sign. Without it, the variable inside the string wouldn’t actually get replaced with its value. I added the missing $ so the code example works correctly.

9 May 2025

fix issue with reactivity and add Jazz Inspector

Someone built a minimal example app to demonstrate a bug with Jazz and Svelte, but the example itself had issues. I fixed the reactivity (making the UI update properly when data changes) by using Svelte’s built-in $derived feature, and also added graceful handling for missing images instead of crashing. I also added the Jazz Inspector debugging tool to help with further troubleshooting.

12 July 2024

shadcn

I rebuilt the UI of my personal drinks tracking app using shadcn, a modern component library that provides clean, accessible interface elements. I also switched the project to use Bun as the package manager and tidied up some styling issues along the way.

16 December 2023

add `@joeinnes/svelte-image`

The Svelte Society website maintains a directory of community-built components for the Svelte JavaScript framework. I added my own image component library to their registry so other Svelte developers could discover and use it.

11 September 2023

add a daily excess metric which shows how many days you exceeded the recommendations. Type fixes

I added a new metric to my personal drinks tracking app that shows how many days you went over the recommended alcohol intake limits. I also fixed some type-related bugs along the way.

8 September 2023

1.1.1-refactoring

I tidied up the code in my personal drinks tracking app — a small tool I built to keep tabs on my alcohol consumption. This included some general refactoring and a bug fix.

26 March 2023

initial set-up

I set up the initial project structure for Tastine, a personal app built with Svelte. This was the foundational first commit to get the project off the ground.

24 November 2022

fix readme typo

idle-task is a JavaScript library for running tasks during browser idle time so your app stays responsive. I fixed a typo in the README where “priority” was misspelled as “prioriy.” Ironically, my commit message also contained a typo — Muphry’s law in action.

28 October 2022

create README

Chicken Dinner Timer is a web app I built for timing how long to cook chicken. I added a README file to the repo so visitors can quickly understand what the project is and how to use it.

explain double prime symbol better

I updated the README for a small project about double prime vowel symbols used in linguistics. The explanation of what the double prime symbol is and how it’s used wasn’t clear enough, so I rewrote it to be easier to understand.

update README.md

I updated the README documentation for my personal blog, which is built with SvelteKit.

21 August 2022

add a 'clickHandler' export which allows you to handle clicks on data points

Svelte Tiny Linked Charts is a small library for rendering sparkline charts in Svelte apps. Previously, the charts were display-only — you could look at them but not interact. I added a click handler so developers can run custom code when a user clicks on a data point in the chart, like showing more details about that value.

13 August 2022

using EXIF data for file names will give more accuracy

I updated my family photo management app to use EXIF data (the metadata embedded in photos by cameras, like the date and time a photo was taken) for generating file names. This gives much more accurate file naming than guessing or using arbitrary names, making it easier to organise and find photos.

7 August 2022

fix typo

CapRover is a self-hosted platform for deploying apps with one click. One of its app templates had “STMP” instead of “SMTP” (the protocol used for sending email). I fixed the typo.

13 January 2022

joeinnes/issue4

Notesvac is a small app I built for tracking notes and vacation days. I improved the styling to make it feel more like a native app and added a proper footer with privacy policy and terms of service information.

10 January 2022

allow passing 'version' to Knex

Directus is an open-source headless CMS that connects to your database. Some cloud database providers require you to specify a database version, but Directus wasn’t passing that setting through correctly. I fixed it so that setting a DB_VERSION environment variable actually works as expected.

6 January 2022

add defaultLayout as an optional property in markdownOptions

Astro is a static site framework. I added support for setting a default layout for Markdown pages through the configuration, so you don’t have to specify which layout template to use at the top of every single Markdown file.

2 December 2021

create traist.co.uk.md

The 1MB Club is a curated list of websites that are under 1MB in total size. I submitted traist.co.uk to be included in the collection.

1 December 2021

add a tip explaining HTTP Only cookies issue

Directus is an open-source headless CMS. I noticed developers in the Discord were frequently running into a confusing authentication error when building front-end apps locally. I added a tip to the docs explaining why the error happens (it is related to how browsers handle secure cookies during local development) and two ways to work around it.

29 November 2021

sveltekit

I rewrote my personal fork of Elpea, a music discovery app, from scratch using SvelteKit. The migration included visual improvements like using album cover art as a semi-transparent background, along with better reactivity so the interface updates more smoothly.

22 November 2021

sDK: Start auth refresh job when constructor is initialised

Directus is an open-source headless CMS. Its JavaScript SDK had a bug where users would get unexpectedly logged out after refreshing the page, even though their login session was still valid. I fixed it so the SDK automatically checks and refreshes the login token when it starts up, keeping users properly signed in.

13 November 2021

cors update

Bubi Bikes is an app I built for checking Budapest’s bike-sharing system. The app fetches data from an external API, but browsers block those requests for security reasons unless they go through a proxy. I updated the proxy the app uses so it could keep working.

11 October 2021

add an empty state to artist search

Elpea is a music discovery app. When you searched for an artist and got no results, the page would just show a blank area, which was confusing. I added a friendly message that appears when no results are found, so users know their search didn’t turn up anything rather than wondering if the app is broken.

added newer mockup screenshot

Elpea is a web app I worked on at Traist. I updated the mockup screenshot in the repo to reflect the latest design of the application.

update to newest version of next.js

Elpea is a music discovery app. I upgraded it to the latest version of Next.js (the web framework it’s built on) and fixed a few bugs that came up during the upgrade, including one related to how device information is passed to the music player.

12 March 2021

add documentation on using next/image

TinaCMS is a Git-backed headless CMS. I added documentation explaining how to use Next.js’s built-in image optimization component with TinaCMS, including the benefits it provides and important caveats developers should be aware of.

8 February 2021

docs update for tinacms/tinacms#1703

TinaCMS is a Git-backed headless CMS for editing Markdown content. I updated the documentation on the TinaCMS website to reflect changes that were made in the main TinaCMS repo, keeping the docs in sync with how the code actually works.

2 February 2021

fix docs: check if cleanup is needed before cleaning up

TinaCMS is a content management system that lets you edit Markdown files visually. The docs had a code example that could crash if the editor hadn’t fully loaded before the cleanup code ran. I added a check to make sure the editor is actually ready before trying to clean it up, preventing the error.

1 February 2021

add cleanup function to 'useEffect' example of dynamic imports

TinaCMS is a Git-backed headless CMS for editing content. Their docs had a code example showing how to dynamically load the editor, but the example was missing a cleanup step that prevents memory leaks in React. I added the missing cleanup function so developers copying the example would get working, production-ready code.

some options for GlobalFormPlugin can't be passed through useFormScreenPlugin

TinaCMS is a content management system that lets you edit website content visually. I fixed a gap where developers using a shortcut function to create editing forms couldn’t customize things like the icon or layout style. Now those options can be passed through directly, so you don’t need a workaround.

24 January 2021

added chatwoot

Traist is a company website I worked on. I integrated Chatwoot, an open-source live chat widget, so visitors to the site can start a conversation directly from the page. I also fixed a small performance issue with font loading along the way.

19 January 2021

(docs): correct example of getGithubFile usage with incorrect parameters

TinaCMS is a Git-backed headless CMS for editing Markdown content. The docs had a code example for fetching files from GitHub that was using the wrong parameters, which would have confused anyone copying it. I fixed the example so it actually works.

suggested trick for pushing menu below toolbar

TinaCMS is a content management system with a visual editing toolbar that sits at the top of the page. I contributed a CSS trick to the docs showing how to push your site’s own sticky menus below TinaCMS’s toolbar, so they don’t overlap and hide each other.

18 January 2021

sass modules

I upgraded the Traist company website to use SASS modules, a more modern way of organizing CSS stylesheets that keeps styles neatly scoped and easier to maintain. I also improved some of the typography along the way.

4 January 2021

30 December 2020

add documentation of options.params.endpoint to the s3 section of readme

UploadFS is a Node.js library for storing files in cloud storage like Amazon S3. I noticed the docs were missing information about how to configure a custom S3 endpoint (which you need if you’re using an S3-compatible service that isn’t AWS), so I added that documentation.

30 November 2020

3.0: prompt to prompts (#1)

ApostropheCMS is an open-source content management system. I updated the codebase to use the newer “prompts” library instead of the older “prompt” library for handling interactive command-line input during the 3.0 rewrite.

28 November 2020

corrected spelling

Ackee is a self-hosted, privacy-focused web analytics tool. I fixed a few spelling mistakes in the codebase.

fix charset issues on mySQL (fixes #388)

Umami is a privacy-focused web analytics tool (like a simpler, open-source alternative to Google Analytics). When using MySQL as the database, special characters weren’t being stored correctly because the database tables weren’t set up with the right character encoding. I fixed this by making sure tables are created with UTF-8 support, so all characters display properly.

20 October 2020

1 October 2020

update README.md

I updated the README documentation for my Simon Says game web app to better describe the project.

17 August 2020

swap out single quotes for backticks

This is a Leaflet maps plugin for OctoberCMS. If a map marker’s popup text contained an apostrophe (like “Joe’s Coffee”), the whole map would break and refuse to load. I fixed this by switching from single quotes to template literals in the code, so apostrophes in popup content no longer crash the map.

3 August 2020

fix error in docs

Figbird is a React hooks library for working with Feathers.js APIs. I spotted an error in its documentation and submitted a fix to correct it.

more verbose example

Figbird is a React library for working with Feathers.js APIs. The getting-started example was missing important setup details, so I added the Feathers client configuration to make it easier for new users to get up and running.

22 July 2020

glitch

I made updates to my COVID-19 data tracker for Hungary, syncing changes from the Glitch online code editor where I was building and iterating on the project.

27 April 2020

added an options property to set headings manually

FlipDown is a JavaScript countdown timer with a retro flip-clock style. The labels for the time units (days, hours, minutes, seconds) were hardcoded in English. I added an option to customize these headings, which is handy for using the timer in other languages or for changing labels like “Days” to “Jours” in French.

24 April 2020

enable monitor to keep running in case Apostrophe can't start

Apostrophe Monitor is a tool that watches over an ApostropheCMS website and restarts it if it crashes. Previously, if the CMS couldn’t start at all (for example, due to a code error), the monitor would just give up and exit. I changed it so that the monitor stays running and shows a helpful error page in the browser instead, giving you time to fix the problem without losing the monitoring process.

22 April 2020

added missing close curly brace

Apostrophe Palette is a UI editor plugin for ApostropheCMS. The README had a code example with a missing closing curly brace, which would have caused errors if someone copied and pasted it. I added the missing brace to fix the example.

15 March 2020

updated app

I pushed an update to my BuBi Bikes app, which shows real-time availability of Budapest’s bike-sharing stations so you can quickly find a nearby bike or an open dock.

12 January 2020

updated with Glitch

I made updates to my wedding save-the-date web app, syncing changes from Glitch (an online code editor that makes it easy to build and iterate on small web projects).

30 December 2019

updated with Glitch

I made updates to my wedding save-the-date web app, syncing changes from Glitch (an online code editor that makes it easy to build and iterate on small web projects).

26 December 2019

glitch

I made updates to my wedding save-the-date web app, syncing changes from the Glitch online code editor where I was working on it at the time.

updated with Glitch

I made updates to my wedding save-the-date web app, syncing changes from Glitch (an online code editor that makes it easy to build and iterate on small web projects).

updated with Glitch

I made updates to my wedding save-the-date web app, syncing changes from Glitch (an online code editor that makes it easy to build and iterate on small web projects).

25 December 2019

updated with Glitch

I made updates to my wedding save-the-date web app, syncing changes from Glitch (an online code editor that makes it easy to build and iterate on small web projects).

28 October 2019

glitch

I updated my wedding planning web app with some code refactoring (moving logic into controllers) and a language selection feature, syncing the changes from the Glitch online editor.

pushed footer to bottom

Screen2vid is a simple web tool I built for screen recording. The footer was floating in the middle of the page when there wasn’t much content, so I fixed it to stick to the bottom where it belongs.

13 October 2019

merge in initial

I set up the initial version of a wedding planning web app, including the base styling and date formatting with proper locale support so dates display correctly for different regions.

6 July 2019

added WebSockets

This is a collaborative coding dictionary project. I added WebSocket support so that the app could update in real time — when someone adds or edits a definition, everyone else sees the change instantly without reloading the page.

29 October 2018

added documentation for tour.removeStep (fixes #278)

Shepherd is a JavaScript library for creating guided product tours — those step-by-step walkthroughs that show new users around an app. The tour.removeStep method existed but wasn’t documented, so developers didn’t know it was available. I added the missing documentation so people can discover and use it.

28 October 2018

added myself

Hacktobermap is a Hacktoberfest project that plots contributors on a world map. I added myself to the map as part of my Hacktoberfest contributions.

created fizzbuzz implementation using ugly ternary

FizzBuzz is a classic programming challenge where you print numbers but replace some with “Fizz”, “Buzz”, or “FizzBuzz”. This repo collects creative solutions in different languages and styles. I contributed a deliberately ugly JavaScript one-liner using nested ternary operators — because sometimes the fun is in making it as unreadable as possible.

27 October 2018

added details for Sem'ya

The Name Suggestion Index is a community-maintained list of well-known businesses and how they should be tagged in OpenStreetMap. I added details for “Sem’ya,” a Russian retail chain, including its Wikipedia link and English name, so mappers can correctly identify and tag these stores.

17 September 2018

ensure params are set in creates and removes

Feathers-vuex is a library that connects Vue.js apps to Feathers.js, a real-time API framework. A recent update to Feathers accidentally broke things by not always including required request parameters, causing crashes. I added a safety check so that parameters are always set when creating or removing data, preventing “undefined” errors even if the upstream library has a hiccup.

2 October 2017

added a 'time-to-station' parameter

VBB-AnyBar is a tool that shows Berlin public transit departures using a little coloured dot in your menu bar. I added a “time to station” setting so the app can account for how long it takes you to walk (or cycle, or drive) to the station, making its departure alerts actually useful for knowing when to leave.

added note on 'when' option

This is a tool for filtering German public transit departures by direction. It already supported a “when” option to look up departures at a specific time, but this wasn’t mentioned anywhere in the documentation. I added it to the README so other developers could discover and use the feature.

8 August 2017

correcting typo in .gitignore

This is a tutorial project for setting up user authentication with Passport.js and RethinkDB. I fixed a typo in the .gitignore file, which tells Git which files to leave out of the repository.

19 December 2016

update querying_mongodb.md

Redash is an open-source tool for visualising data from databases. I added an example to their documentation showing how to filter results when querying a MongoDB database, making it easier for new users to understand how to narrow down their data.

23 November 2016

create projects.json

I added a data file to my personal website that lists my projects, making it easy to display them on the site without hardcoding everything into the page itself.

13 November 2016

first commit

I created the initial version of a web project aimed at helping homeless people. This was the first commit that set up the project and got it off the ground.

15 October 2016

added links to sections

Disease Info UI is a Hacktoberfest project that aggregates information about various diseases. The page was getting long and hard to navigate, so I added a table of contents at the top with jump links to each section, making it easier to find the disease you’re looking for.

10 October 2016

query in url

Primerpedia is a tool for quickly looking up Wikipedia article introductions. I added the ability to share search results via URL — you can now link someone directly to a search by adding a query parameter (like ?page=cats) to the web address, and the search will run automatically when the page loads.

9 October 2016

proofread/copy-edited README

Jedi Validate is a lightweight JavaScript form validation library. I proofread and copy-edited the project’s README to improve clarity and fix grammatical errors, making it easier for new users to understand how to use the library.

18 September 2016

remove arrow from initialisation instructions for Safari compatibility

DPicker is a minimal date picker component for the web. The setup instructions in the documentation used a modern JavaScript syntax (arrow functions) that Safari didn’t support at the time, so I replaced them with traditional function syntax to make the examples work in all browsers.

21 July 2016

correct spelling of Google

Meteor Starter is a template for quickly spinning up Meteor.js apps. I spotted that “Google” was misspelled as “Googe” and fixed the typo.

11 May 2016

added noncritical CSS

I added some extra CSS styles to my personal website for things like hover effects. These styles aren’t essential for the page to work, but they make it feel more polished.

flash fix

On an older version of my personal website, elements would briefly flash when the page loaded because they were being hidden with display: none, which causes the browser to recalculate the layout. I switched to using opacity: 0 instead, which hides things without triggering a reflow, making the page load smoother.

fluid typography enabled

I added fluid typography to my personal website. Instead of text jumping between fixed sizes at certain screen widths, fluid typography makes the font size scale smoothly as you resize the window, so it always looks good whether you’re on a phone or a big monitor.

hover styles now included

I added hover effects to links and interactive elements on an older version of my personal website, so users get visual feedback when mousing over clickable things.

loaded non-critical styles

I optimised my personal website’s loading speed by deferring non-essential stylesheets. Instead of making the browser load all the CSS upfront before showing any content, less important styles now load in the background so the page appears faster.

14 April 2016

add joeinnes

Patchwork is a beginner-friendly project for learning how to use Git and GitHub. I completed the tutorial by adding my username to the project, practising the basics of forking, branching, and submitting a pull request.

13 March 2016

notifications

I added browser notifications to my chat app so users get alerted when new messages arrive in their channels, even if they’re not actively looking at the chat window.

17 October 2015

fixed insert vulnerability

I fixed a security vulnerability in my personal real-time chat app built with Meteor.js, where database insert operations weren’t being properly validated, potentially allowing malicious data to be submitted.

16 October 2015

added reactive timing and subscriptions logic

I built a personal real-time chat app using Meteor.js. In this update, I added the logic for channels to update in real time when new messages arrive, so users automatically see the latest content without refreshing the page.

subs

I added channel subscriptions and several other features to my personal chat app, including the ability to subscribe to specific chat channels, infinite scrolling to load older messages, and improved channel permissions so people can only see the channels they have access to.

updating Dev

I merged several recent features into the development branch of my personal chat app, including message editing, infinite scroll for loading older messages, and the channel subscription system.

9 October 2015

channel permissions

I built a personal real-time chat app using Meteor.js. In this update, I added channel-level permissions so that only authorised users can see messages in private channels, and admins can add or remove users from those channels.

8 October 2015

edit messages

I built a personal real-time chat app using Meteor.js. In this update, I added the ability for users to edit their own messages after sending them.

merge pull request #5 from joeinnes/markdown-emoticons

I merged the markdown and emoticon features from my development branch into the main branch of my chat app, making rich text formatting and emoticons available to all users.

message permissions

I added permission controls to my chat app so that only users who have access to a channel can see its messages. I also built an admin panel for managing channels, adding and removing users, and added user avatars via Gravatar.

5 October 2015

dev

I built a personal real-time chat app using Meteor.js. This was an early merge bringing in several improvements, including better notification pop-ups when things go wrong, and an access control system so channels can be public or restricted to specific users.

markdown emoticons

I added support for markdown formatting (like bold and italic text) and emoticons to my personal chat app, so messages look richer and more expressive instead of just plain text.

3 October 2015

merging in dev

I built the first working version of a personal real-time chat application using Meteor.js, with basic visual design and the ability to create and switch between different chat channels.

25 September 2015

set encoding as UTF-8 in diff_match_patch.php

Codiad is a code editor that runs in a web browser. Its file-comparison feature was breaking when files contained special characters (like accented letters), because it wasn’t explicitly set to handle UTF-8 encoding. I added the UTF-8 encoding declaration so that comparing files with non-English characters works correctly.

26 June 2015

fixes #794

Anchor CMS is a lightweight PHP blogging platform. It would crash when running on a machine without internet access because it tried to check for updates without handling the case where it couldn’t connect. I added a check so it gracefully skips the update check when there’s no network connection, instead of crashing.