v2.2.0

kyutai-labs/hibiki-zerov2.2.0May 2, 2026by jdetter

AI Summary

This release focuses on enhancing SpacetimeDB's realtime performance with a new v3 WebSocket transport, improving operational safety with lock commands and confirmation prompts, and refining TypeScript developer ergonomics and schema evolution.

Key Highlights

  • Introduced a new v3 WebSocket transport that batches messages to improve throughput and reduce overhead.
  • Added `spacetime lock` and `unlock` commands to protect databases from accidental deletion.
  • Enhanced TypeScript ergonomics with a new Astro + TypeScript template and typed `useProcedure` hook.
  • Improved schema evolution by allowing empty tables to be dropped and fixing primary key migration issues.

New Features

  • v3 WebSocket transport protocol
  • `spacetime lock` and `spacetime unlock` commands
  • First-party Astro + TypeScript template with SSR
  • Typed `useProcedure` hook in TypeScript React bindings
  • `spacetime delete` confirmation prompt
  • `spacetime list` showing database names
  • `spacetime publish --yes` selective prompt skipping
  • Table and index APIs for clearing tables (Rust, C#, C++, TS)
  • 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