I Shipped...

26 August 2026 (4PRs)

closed late native connections safely

I stopped a native connection from being attached after it had already disconnected. The admission step now checks that the connection is still current before accepting it, and closes late arrivals through the normal cleanup path.

required admin claims for announcement changes

I tightened announcement permissions so creating, changing, or deleting announcements requires an authenticated administrator. Ordinary chat messages keep their existing rules, and an ordinary message can no longer be moved into the announcements room to bypass them.

made anonymous sessions read-only even on exclusive writes

I enforced the documented read-only rule for anonymous sessions at the final write-admission point. Anonymous clients can still read public data, but they can no longer insert, update, or delete data through ordinary or exclusive-write paths.

flushed pending RocksDB writes when closing

I made storage shutdown flush acknowledged writes that were still waiting in RocksDB. A failed flush is reported and remains retryable, so closing the database cannot falsely claim that pending data has been safely synchronised.

25 August 2026 (11PRs)

preserved original row provenance in write policy checks

I fixed write-policy checks so updates keep the original creator and creation time separate from the person making the change. I also made inline policy requirements request the hidden version information they need, and reject the operation when that history cannot be reconstructed.

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 (5PRs)

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.