v2.2.0
2FastLabs/agent-squadv2.2.0May 2, 2026by jdetter
AI Summary
This release focuses on significant performance improvements for SpacetimeDB's realtime capabilities and operational safety. It introduces a new v3 WebSocket transport for better throughput, adds safety features like database locking, and enhances TypeScript developer ergonomics with new templates and hooks.
Key Highlights
- New v3 WebSocket transport for faster client throughput
- Added `spacetime lock` and `spacetime unlock` commands for database safety
- Safer database deletion with confirmation prompts
- New Astro + TypeScript template with SSR and React islands
- Improved TypeScript React bindings with `useProcedure` hook
New Features
- v3 WebSocket transport (batching multiple messages into a single frame)
- Database locking commands (`spacetime lock` and `spacetime unlock`)
- Confirmation prompts for `spacetime delete`
- Astro + TypeScript template with SSR and live React islands
- Typed `useProcedure` hook for React bindings
- Direct table clearing APIs in Rust, C#, C++, and TypeScript
- Bytes-key B-tree support for multi-column range scans
Full Release Notes
2.2.0 is here, and this one is a meaningful step forward for SpacetimeDB's realtime performance, operational safety, and day-to-day developer workflow. There are plenty of smaller fixes in this release too, but these are the major changes worth calling out. ## Features ### Faster realtime transport and client throughput We’ve introduced a new v3 WebSocket transport that batches multiple logical client messages into a single frame, cutting per-message overhead while keeping the existing message model intact (#4761). The TypeScript SDK now uses the new transport by default (#4784). Under the hood, this release also includes a substantial round of hot-path performance work across the TS client, JS module runtime, and durability pipeline to improve throughput and reduce scheduler overhead under load. ### Safer production database operations We added `spacetime lock` and `spacetime unlock` to protect databases from accidental deletion (#4502). On top of that, `spacetime delete` now asks for confirmation by default (#4770), `spacetime list` shows database names alongside identities (#4769), and `spacetime publish --yes` can now skip only the prompts you intend to skip instead of skipping all of them (#4885). ### Better TypeScript app ergonomics Web developers get two nice upgrades in 2.2.0. There’s now a first-party Astro + TypeScript template with SSR and a live React island for realtime updates (#4688), and the TypeScript React bindings now include a typed `useProcedure` hook so procedures fit the same ergonomic pattern as reducers (#4752). ### Smoother schema evolution Publishing schema changes is less brittle now. Empty tables can be dropped during auto-migration (#4593), and changing or removing a primary key no longer leaves stale schema state behind that breaks future publishes (#4666). ### More powerful table and index APIs Modules can now clear tables directly from Rust, C#, C++, and TypeScript (#4729), and the index layer gained bytes-key B-tree support for more capable multi-column range scans (#4733). ## Bug Fixes - Improved crash resistance for JavaScript modules by preventing V8 near-heap-limit failures from taking down the server, and by rotating isolates when heap growth or fragmentation gets out of hand (#4777, #4684). - Fixed a schema migration bug where changing or removing a primary key could leave stale schema state behind and break a later publish (#4666). - Fixed table migration sequence persistence so `autoinc` values no longer reset after restart when a table has been migrated (#4902). - Windows CLI binaries are now code-signed, which should make installation and update flows smoother on Windows (#4906). - Improved module panic backtraces so runtime failures are easier to diagnose (#577). - Hardened local durability so snapshot files, `metadata.toml`, and pid files are properly synced to disk instead of being vulnerable to loss on an untimely crash (#4891, #4892, #4890). - Fixed an Unreal SDK bug where overlapping subscriptions could fire duplicate `OnInsert` events for already-cached rows (#4903). If you run into anything new with this release, file an issue on GitHub or drop into Discord and let us know. ## What's Changed * [C#] Add support for IEnumerable<T> for Views' return types by @rekhoff in https://github.com/clockworklabs/SpacetimeDB/pull/4486 * Replace `JsInstance` pool with single worker and FIFO queue by @joshua-spacetime in https://github.com/clockworklabs/SpacetimeDB/pull/4663 * Improve benchmark cli, make compatible with deno by @coolreader18 in https://github.com/clockworklabs/SpacetimeDB/pull/4647 * Improve `merge_apply_inserts` by @Centril in https://github.com/clockworklabs/SpacetimeDB/pull/4310 * Add distributed typescript benchmark harness by @joshua-spacetime in https://github.com/clockworklabs/SpacetimeDB/pull/4698 * Rotate V8 isolate on heap growth or fragmentation by @joshua-spacetime in https://github.com/clockworklabs/SpacetimeDB/pull/4684 * fix(keynote-2): split demo and bench CLI parsing by @joshua-spacetime in https://github.com/clockworklabs/SpacetimeDB/pull/4703 * core: Bounded channel for durability worker by @kim in https://github.com/clockworklabs/SpacetimeDB/pull/4652 * Bypass `AlgebraicValue` for datastore updates and bsatn based index scans + BytesKey optimization by @Centril in https://github.com/clockworklabs/SpacetimeDB/pull/4311 * Add more context around some errors by @jsdt in https://github.com/clockworklabs/SpacetimeDB/pull/4702 * Add .gitignore files to quickstart templates by @clockwork-labs-bot in https://github.com/clockworklabs/SpacetimeDB/pull/4609 * docs: Add supported index key types to Index docs page by @clockwork-labs-bot in https://github.com/clockworklabs/SpacetimeDB/pull/4606 * fix: single-column BTree index Range filter/delete by @DexterKoelson in https://github.com/clockworklabs/SpacetimeDB/pull/4737 * Stop setting core affinity on macos by @joshua-spacetime in https://github.com/clockworklabs/SpacetimeDB/pull/4676 * Small typescript sdk optimizations by @joshua-spacetime in https://github.com/clockworklabs/SpacetimeDB/pull/4640 * Configure compression for keynote benchmark by @joshua-spacetime in https://github.com/clockworklabs/SpacetimeDB/pull/4743 * Update client defaults in keynote bench by @joshua-spacetime in https://github.com/clockworklabs/SpacetimeDB/pull/4745 * Reduce overhead in the typescript sdk by @joshua-spacetime in https://github.com/clockworklabs/SpacetimeDB/pull/4744 * Replace JS worker's rendezvous channel with unbounded queue by @joshua-spacetime in https://github.com/clockworklabs/SpacetimeDB/pull/4704 * fix(unreal): macOS build failure — Nil macro collision with Objective-C++ by @brougkr in https://github.com/clockworklabs/SpacetimeDB/pull/4712 * Run reducers in their own V8 `HandleScope` for js modules by @joshua-spacetime in https://github.com/clockworklabs/SpacetimeDB/pull/4746 * Remove rust client from keynote bench by @joshua-spacetime in https://github.com/clockworklabs/SpacetimeDB/pull/4753 * Remove warmup from distributed keynote bench by @joshua-spacetime in https://github.com/clockworklabs/SpacetimeDB/pull/4757 * core: Enable instrumentation of multiple tokio runtimes by @kim in https://github.com/clockworklabs/SpacetimeDB/pull/4694 * Improve a test with new `TableIndex::iter` & simplify index iterator defs by @Centril in https://github.com/clockworklabs/SpacetimeDB/pull/4759 * Bump the esm (gzip) package size again by @jdetter in https://github.com/clockworklabs/SpacetimeDB/pull/4760 * Add module ABI & API for `clear`ing tables by @Centril in https://github.com/clockworklabs/SpacetimeDB/pull/4729 * fix: Replace unwrap with proper error handling in WebSocket subscribe handler by @Shiven0504 in https://github.com/clockworklabs/SpacetimeDB/pull/4696 * [TS] Fix access before initialization in codegen by @coolreader18 in https://github.com/clockworklabs/SpacetimeDB/pull/4709 * feat: Allow dropping empty tables during auto-migration by @Ludv1gL in https://github.com/clockworklabs/SpacetimeDB/pull/4593 * Increase timeout for typescript query builder tests by @joshua-spacetime in https://github.com/clockworklabs/SpacetimeDB/pull/4783 * Merge durability actors to reduce per-tx scheduler handoffs by @joshua-spacetime in https://github.com/clockworklabs/SpacetimeDB/pull/4767 * Cache V8 heap stats instead of querying them on every call by @joshua-spacetime in https://github.com/clockworklabs/SpacetimeDB/pull/4778 * Record metrics periodically in batches by @joshua-spacetime in https://github.com/clockworklabs/SpacetimeDB/pull/4801 * Show database names in `spacetime list` by @clockwork-labs-bot in https://github.com/clockworklabs/SpacetimeDB/pull/4769 * Require confirmation for `spacetime delete` by @clockwork-labs-bot in https://github.com/clockworklabs/SpacetimeDB/pull/4770 * v3 websocket transport protocol by @joshua-spacetime in https://github.com/clockworklabs/SpacetimeDB/pull/4761 * durability: Use `async-channel` to allow blocking send by @kim in https://github.com/clockworklabs/SpacetimeDB/pull/4802 * Fix primary key migration causing stale schema (#3934) by @clockwork-labs-bot in https://github.com/clockworklabs/SpacetimeDB/pull/4666 * Refactored `SELECT` detection in PG SQL by @egormanga in https://github.com/clockworklabs/SpacetimeDB/pull/3771 * Add TESTING.md, which documents some of our testing by @gefjon in https://github.com/clockworklabs/SpacetimeDB/pull/2898 * CI - rust smoketests lib expansion by @bfops in https://github.com/clockworklabs/SpacetimeDB/pull/4269 * Extract replay stuff out of `CommittedState`, part 1 by @Centril in https://github.com/clockworklabs/SpacetimeDB/pull/4804 * Unity tutorial part 2 CLI call fix by @T-Podgorski in https://github.com/clockworklabs/SpacetimeDB/pull/3665 * Add internal docs for C# bindings packages by @kazimuth in https://github.com/clockworklabs/SpacetimeDB/pull/2938 * Run client_connected hook for HTTP SQL requests by @clockwork-labs-bot in https://github.com/clockworklabs/SpacetimeDB/pull/4563 * Update typescript sdk to use v3 websocket api by @joshua-spacetime in https://github.com/clockworklabs/SpacetimeDB/pull/4784 * docs: Add commitlog reference document by @clockwork-labs-bot in https://github.com/clockworklabs/SpacetimeDB/pull/4668 * durability: Simplify shutdown by @kim in https://github.com/clockworklabs/SpacetimeDB/pull/4808 * fix(ts-bindings): populate response headers in fetch() by @philtrem in https://github.com/clockworklabs/SpacetimeDB/pull/4691 * Export AuthCtx and JwtClaims in stdb/server typescript sdk by @dusk125 in https://github.com/clockworklabs/SpacetimeDB/pull/4649 * Fix `spacetime dev` bug when running with a project path by @aasoni in https://github.com/clockworklabs/SpacetimeDB/pull/4809 * fix: reorder Vue component by @MichaHuhn in https://github.com/clockworklabs/SpacetimeDB/pull/4748 * Update axum by @coolreader18 in https://github.com/clockworklabs/SpacetimeDB/pull/2713 * Move field `replay_table_updated` to `ReplayCommittedState` by @Centril in https://github.com/clockworklabs/SpacetimeDB/pull/4807 * Add path context to invalid TOML config errors by @clockwork-labs-bot in https://github.com/clockworklabs/SpacetimeDB/pull/4815 * Make Tyler a codeowner for CI and tools by @jdetter in https://github.com/clockworklabs/SpacetimeDB/pull/4836 * Windows VM runner test by @jdetter in https://github.com/clockworklabs/SpacetimeDB/pull/4278 * move 00300-spacetime-json.md into the right docs folder by @xDovos in https://github.com/clockworklabs/SpacetimeDB/pull/4779 * Clean up keynote-2 template README & DEVELOP by @bradleyshep in https://github.com/clockworklabs/SpacetimeDB/pull/4624 * docs(fix): add missing `ctx.db` by @MichaHuhn in https://github.com/clockworklabs/SpacetimeDB/pull/4768 * Add Astro TypeScript template by @leovoon in https://github.com/clockworklabs/SpacetimeDB/pull/4688 * Add a test for #1121 by @drogus in https://github.com/clockworklabs/SpacetimeDB/pull/1125 * Add `spacetime lock/unlock` to prevent accidental database deletion by @clockwork-labs-bot in https://github.com/clockworklabs/SpacetimeDB/pull/4502 * Adds a non-repeating scheduled reducer test by @rekhoff in https://github.com/clockworklabs/SpacetimeDB/pull/3233 * Wait for database update to become durable by @kim in https://github.com/clockworklabs/SpacetimeDB/pull/4846 * Update the defaultValue check to allow for falsy and undefined values by @JasonAtClockwork in https://github.com/clockworklabs/SpacetimeDB/pull/4838 * Better module backtraces for panics and whatnot by @coolreader18 in https://github.com/clockworklabs/SpacetimeDB/pull/577 * Add `cargo lint` as alias for `cargo ci lint` by @bfops in https://github.com/clockworklabs/SpacetimeDB/pull/4853 * CI - Move the `git diff` check under `cargo ci smoketests` by @bfops in https://github.com/clockworklabs/SpacetimeDB/pull/4854 * CI - move `pnpm build` into `cargo ci test` by @bfops in https://github.com/clockworklabs/SpacetimeDB/pull/4855 * Add `sdk-test-procedure-cs` test module by @rekhoff in https://github.com/clockworklabs/SpacetimeDB/pull/4840 * Add useProcedure React hook and export procedures from codegen by @DexterKoelson in https://github.com/clockworklabs/SpacetimeDB/pull/4752 * Update NativeAOT-LLVM infrastructure to current ABI by @cloutiertyler in https://github.com/clockworklabs/SpacetimeDB/pull/4515 * Keep subscription fanout worker warm with adaptive linger policy by @joshua-spacetime in https://github.com/clockworklabs/SpacetimeDB/pull/4805 * Replay: some code motion & reuse `ReplayCommittedState` by @Centril in https://github.com/clockworklabs/SpacetimeDB/pull/4849 * CI - Fold typescript lint into `cargo ci lint` by @bfops in https://github.com/clockworklabs/SpacetimeDB/pull/4856 * [TS] Implement near-heap-limit termination by @coolreader18 in https://github.com/clockworklabs/SpacetimeDB/pull/4777 * CI - Merge hooks by @bfops in https://github.com/clockworklabs/SpacetimeDB/pull/4224 * `cargo ci self-docs` uses doc comments as well as explicit helptext by @bfops in https://github.com/clockworklabs/SpacetimeDB/pull/4860 * CI - Move the DLL updating code into a function by @bfops in https://github.com/clockworklabs/SpacetimeDB/pull/4868 * CI - Merge workflow files by @bfops in https://github.com/clockworklabs/SpacetimeDB/pull/4869 * CI - `cargo ci update-flow` runs on Windows by @bfops in https://github.com/clockworklabs/SpacetimeDB/pull/4874 * CI - Move simple jobs into `cargo ci` by @bfops in https://github.com/clockworklabs/SpacetimeDB/pull/4871 * Smoketests - Fix another name collision by @bfops in https://github.com/clockworklabs/SpacetimeDB/pull/4873 * Fix SQL parser to support negative numbers in INSERT statements by @rekhoff in https://github.com/clockworklabs/SpacetimeDB/pull/4660 * Add support for bytes key btree indices by @Centril in https://github.com/clockworklabs/SpacetimeDB/pull/4733 * Indices: house keeping (privatize stuff + fix minor bug in `insert_index`) by @Centril in https://github.com/clockworklabs/SpacetimeDB/pull/4782 * Finish refactoring out replay by @Centril in https://github.com/clockworklabs/SpacetimeDB/pull/4850 * bindings: reuse panic message for datastore_index_scan_point_bsatn by @Centril in https://github.com/clockworklabs/SpacetimeDB/pull/4876 * Revert breaking PRs by @bfops in https://github.com/clockworklabs/SpacetimeDB/pull/4881 * Add some tests and metadata to LockedFile by @jsdt in https://github.com/clockworklabs/SpacetimeDB/pull/4834 * @brougkr fix(unreal): Replace FTickableGameObject with FTSTicker by @JasonAtClockwork in https://github.com/clockworklabs/SpacetimeDB/pull/4835 * CI - Use new internal test inputs by @bfops in https://github.com/clockworklabs/SpacetimeDB/pull/4231 * Properly handle execution time<->energy conversion in v8 host by @coolreader18 in https://github.com/clockworklabs/SpacetimeDB/pull/4884 * fix: update seq table when migrating table. by @Shubham8287 in https://github.com/clockworklabs/SpacetimeDB/pull/4902 * Include location in nginx config for logs specific directives by @aceysmith in https://github.com/clockworklabs/SpacetimeDB/pull/3654 * CLI - Hide the `--server-issued-login` param by @bfops in https://github.com/clockworklabs/SpacetimeDB/pull/4905 * align UUID reducer examples with allowed signatures by @GEFNENEN in https://github.com/clockworklabs/SpacetimeDB/pull/3999 * Add enabled option to useTable hook by @DexterKoelson in https://github.com/clockworklabs/SpacetimeDB/pull/4721 * Re-land Replay extraction PRs by @Centril in https://github.com/clockworklabs/SpacetimeDB/pull/4893 * Remove Python smoketests by @bfops in https://github.com/clockworklabs/SpacetimeDB/pull/4896 * Rekhoff/reapply update nativeaot llvm infrastructure by @rekhoff in https://github.com/clockworklabs/SpacetimeDB/pull/4897 * paths: fdatasync PidFile by @kim in https://github.com/clockworklabs/SpacetimeDB/pull/4890 * Update Unreal SDK tests to work on Mac by @JasonAtClockwork in https://github.com/clockworklabs/SpacetimeDB/pull/4861 * Fix listen_addr help default value by @clockwork-labs-bot in https://github.com/clockworklabs/SpacetimeDB/pull/4812 * WIP: Start SDK tests for delete_all_by_eq_bsatn by @kazimuth in https://github.com/clockworklabs/SpacetimeDB/pull/2164 * Make Timestamp a FilterableValue by @rafaelGuerreiro in https://github.com/clockworklabs/SpacetimeDB/pull/4693 * Confirmed database updates, take 3 by @kim in https://github.com/clockworklabs/SpacetimeDB/pull/4909 * `spacetime publish --yes` now takes optional arguments by @jdetter in https://github.com/clockworklabs/SpacetimeDB/pull/4885 * consult, prioritize event.request_id over database_update.request_id (#2729) by @apron-manlike0o in https://github.com/clockworklabs/SpacetimeDB/pull/3368 * [TS] Allow brotli to be specified for compression and reorganize some websocket stuff by @coolreader18 in https://github.com/clockworklabs/SpacetimeDB/pull/4561 * snapshot: Ensure all snapshot files are durable by @kim in https://github.com/clockworklabs/SpacetimeDB/pull/4891 * Update the C++ smoketest to use `latest` by @JasonAtClockwork in https://github.com/clockworklabs/SpacetimeDB/pull/4919 * Case conversion tests by @Shubham8287 in https://github.com/clockworklabs/SpacetimeDB/pull/4450 * fix(unreal): suppress spurious OnInsert on overlapping subscription refcount bump by @SamuelE-Arvika in https://github.com/clockworklabs/SpacetimeDB/pull/4903 * Windows Binary Signing through DigiCert by @rekhoff in https://github.com/clockworklabs/SpacetimeDB/pull/4906 * client-api: stop logging suspended-database errors as 500s by @jdetter in https://github.com/clockworklabs/SpacetimeDB/pull/4918 * paths: fsync after writing to a file by @kim in https://github.com/clockworklabs/SpacetimeDB/pull/4892 * Version bump 2.2.0 by @jdetter in https://github.com/clockworklabs/SpacetimeDB/pull/4916 ## New Contributors * @DexterKoelson made their first contribution in https://github.com/clockworklabs/SpacetimeDB/pull/4737 * @T-Podgorski made their first contribution in https://github.com/clockworklabs/SpacetimeDB/pull/3665 * @philtrem made their first contribution in https://github.com/clockworklabs/SpacetimeDB/pull/4691 * @MichaHuhn made their first contribution in https://github.com/clockworklabs/SpacetimeDB/pull/4748 * @xDovos made their first contribution in https://github.com/clockworklabs/SpacetimeDB/pull/4779 * @leovoon made their first contribution in https://github.com/clockworklabs/SpacetimeDB/pull/4688 * @GEFNENEN made their first contribution in https://github.com/clockworklabs/SpacetimeDB/pull/3999 * @apron-manlike0o made their first contribution in https://github.com/clockworklabs/SpacetimeDB/pull/3368 **Full Changelog**: https://github.com/clockworklabs/SpacetimeDB/compare/v2.1.0...v2.2.0