I Shipped...

25 August 2026 (10PRs)

made persistence regression tests wait for real completion

I made persistence regression tests wait for storage shutdown and replay to finish instead of relying on fixed delays. This prevents slow CI runs from racing a live browser database or checking for restored data too early.

made failed broker-worker initialisation safely retryable

I made failed broker-worker setup retryable instead of leaving a permanent failed result behind. Partially opened databases and related resources are now closed exactly once, so a later connection can try again without leaking the earlier attempt.

kept failed client shutdowns as registry barriers

I stopped the client registry from forgetting a failed shutdown and immediately creating a replacement for the same key. Later users now see the shutdown error until the broken state is dealt with, while failures during initial creation can still be retried.

kept caller-owned starter directories intact

I stopped the starter test helper from deleting a directory supplied by its caller. It now removes temporary directories that it created itself, while leaving caller-owned directories and their contents alone.

failed startup when the durable catalogue is corrupt

I changed server startup to report a damaged or unreadable durable catalogue instead of silently starting with an empty in-memory index. The error now points to the failed operation, while unknown catalogue entries remain forward-compatible.

expired incomplete fragmented messages before they leaked resources

I added idle and maximum-age limits for messages that arrive in fragments. Stale partial messages now release their stored bytes and IDs during normal transport activity, while fragments that continue making progress can still complete.

encoded payload enums inside arrays without panics

I fixed encoding for arrays containing enum values with their own payload fields. Each value now uses the description of its selected case, so valid data round-trips correctly and invalid data returns a normal error instead of crashing.

delivered shared collector updates to every subscription

I fixed shared query updates so every subscription listening to the same result receives the update. The change only copies the data when another subscriber still needs it, and keeps it available if a paused subscriber has to retry.

avoided copying uncompressed inbound messages

I removed an unnecessary full-buffer copy when decoding uncompressed incoming messages. The decoder now borrows those bytes, while compressed messages still own their decompressed data and the public interface stays unchanged.

added issuer and audience checks to backend JWT authentication

I added optional issuer and audience checks to backend JWT authentication. This means a correctly signed token can still be rejected when it was meant for a different service, while existing setups keep their current behaviour when no extra checks are configured.

24 August 2026 (10PRs)

supported runtime-comparable permission values

I taught permission compilation to turn supported timestamps, finite numbers, byte arrays, and nested arrays into runtime values. Invalid and non-finite values are rejected at the TypeScript boundary or with precise paths instead of failing later.

stabilised Expo secret loading across remounts

I shared in-flight Expo secret loads across concurrent and Strict Mode remounts, kept successful secrets for reuse, and allowed failed loads to retry. Unrelated errors are still reported as themselves.

made React client replacement lifecycle-safe

I made React client acquisition safe across server rendering, replacement, cancellation, and Strict Mode remounts. Different configurations now wait for the previous client to be released before acquiring a replacement.

made IndexedDB batches see earlier changes

I changed IndexedDB batch planning so each operation sees the value produced by earlier operations in the same batch. I also serialised batches sharing one storage instance so overlapping writes cannot overwrite newer results.

kept sibling policy joins anchored correctly

I kept each inferred relation join tied to the protected row instead of letting a later sibling join start from the previous relation. Explicit nested joins and recursive gathers still keep their intended chaining.

finished cleanup after shutdown failures

I changed shutdown cleanup to keep running each cleanup step after an earlier failure, then rethrow the first failure. This prevents one broken step from leaving the database, telemetry, client, or worker running.

compiled the DELETE policy fallback

I made DELETE USING fall back to UPDATE USING when no explicit delete rule exists, while keeping explicit DELETE USING rules in charge. This brings schema conversion in line with the documented contract and inherited policy checks.

cleared staged Inspector changes when changing tables

I cleared staged edits, inserts, deletes, errors, and pending scroll state when the Inspector changes routed tables. Sorting, filtering, pagination, and column layout changes within one table still retain staged state.

canonicalised client configuration identity

I made client configuration identity use recursively sorted keys. Configurations that differ only in property order now share the same identity instead of causing duplicate runtimes or unnecessary replacement.

bounded shape registrations before admission

I applied the size limit to the complete shape-registration request before deriving keys or retaining state. Oversized peer registrations are rejected early, while the existing public limits and wire format stay unchanged.