v2.7.0-hotfix3
knadh/listmonkv2.7.0-hotfix3Jul 22, 2026by rekhoff
AI Summary
This release introduces .NET 10 NativeAOT-LLVM support, adds schema migration capabilities for unique/primary-key constraints, and introduces a Model Context Protocol server. It also includes breaking changes to TypeScript and Svelte bindings, along with numerous improvements to performance, reliability, observability, and bug fixes across multiple SDKs.
Key Highlights
- .NET 10 NativeAOT-LLVM support for C# modules with automatic compilation
- Schema migration support for adding unique/primary-key constraints to existing tables
- Model Context Protocol server for authenticated database access
- Enhanced Svelte reconnection and token swap capabilities
- Expanded Prometheus metrics for connection and memory monitoring
Breaking Changes
- TypeScript: Generated table and view handles now use camelCase instead of snake_case
- Svelte: ConnectionState.getConnection is no longer generic (getConnection<MyConn>() is now getConnection())
New Features
- .NET 10 NativeAOT-LLVM support for C# modules
- Add unique or primary-key constraints through schema migration
- Model Context Protocol server for standalone databases
- Primary-key support for views in C++
- Typed query builder for Unreal SDK
- Primary-key view lookup for C# and Unreal clients
- TypeScript schedule registration for split modules
- Svelte reconnect and token swap capabilities
- Rust SDK capability traits and generic table accessors
- Public RemoteTableName in the C# SDK
- spacetime sql --format json command
- CLI database locking with spacetime lock and spacetime unlock
- Safer BSATN array decoding to prevent out-of-memory failures
- Improved view cleanup and view metrics
- Expanded connection and memory metrics in Prometheus
Full Release Notes
## Breaking Changes
### TypeScript: Generated table and view handles now use camelCase
Generated TypeScript client handles now follow TypeScript casing, such as `conn.db.loggedOutPlayer` rather than `conn.db.logged_out_player`. The former snake_case handles remain available as deprecated aliases, but code that enumerates generated handles may now see both names.
([#5286](<https://github.com/clockworklabs/SpacetimeDB/pull/5286>))
### Svelte: `ConnectionState.getConnection` is no longer generic
In the Svelte binding, `getConnection<MyConn>()` is now `getConnection()`. It continues to return the active connection; only the removed type argument affects callers.
([#5375](<https://github.com/clockworklabs/SpacetimeDB/pull/5375>))
## Features
### .NET 10 NativeAOT-LLVM support for C# modules
C# modules can now target .NET 10 and use NativeAOT-LLVM automatically. Runtime packages include both .NET 8 and .NET 10 targets, while `spacetime init --lang csharp --dotnet-version` selects the generated project SDK version. Existing .NET 8 JIT and opt-in NativeAOT paths remain supported.
([#4915](<https://github.com/clockworklabs/SpacetimeDB/pull/4915>))
### Add unique or primary-key constraints through schema migration
Adding a `#[unique]` or `#[primary_key]` constraint to an existing table is now a non-breaking migration when existing data satisfies the constraint. If duplicate data exists, the migration fails safely and identifies duplicate values.
([#4465](<https://github.com/clockworklabs/SpacetimeDB/pull/4465>))
### Model Context Protocol server
Standalone databases now expose an authenticated MCP endpoint at `POST /v1/database/:name_or_identity/mcp`. It provides tools to check health, retrieve module schemas, run SQL, and invoke reducers.
([#5489](<https://github.com/clockworklabs/SpacetimeDB/pull/5489>))
### Primary-key support for views in C++
C++ modules can now declare primary keys on procedural views.
([#5354](<https://github.com/clockworklabs/SpacetimeDB/pull/5354>))
### Typed query builder for Unreal SDK
The Unreal SDK now supports a typed, generated query builder for client subscriptions in both C++ and Blueprint.
([#4810](<https://github.com/clockworklabs/SpacetimeDB/pull/4810>))
### Primary-key view lookup for C# and Unreal clients
Generated C# and Unreal client bindings now support `Find()` on views with primary keys.
([#5494](<https://github.com/clockworklabs/SpacetimeDB/pull/5494>))
### TypeScript schedule registration for split modules
TypeScript reducers and procedures now accept an `onSchedule` option. This enables schedule registration without importing reducer implementations from table definitions, which supports splitting modules across files. Existing `table({ scheduled })` usage remains supported.
([#5435](<https://github.com/clockworklabs/SpacetimeDB/pull/5435>))
### Svelte reconnect and token swap
Svelte applications can now reconnect programmatically with `reconnect(builder)`, allowing an anonymous connection to be replaced after sign-in without a page reload. Svelte providers also gain automatic reconnect behavior.
([#5375](<https://github.com/clockworklabs/SpacetimeDB/pull/5375>))
### Rust SDK capability traits and generic table accessors
The Rust SDK adds composable context capabilities, granular table traits, and generated `TableAccessor` marker types. These additions make it easier for downstream integrations to write generic code over table access and context capabilities.
([#5307](<https://github.com/clockworklabs/SpacetimeDB/pull/5307>), [#4775](<https://github.com/clockworklabs/SpacetimeDB/pull/4775>), [#5055](<https://github.com/clockworklabs/SpacetimeDB/pull/5055>))
### Public `RemoteTableName` in the C# SDK
C# table bindings now expose `RemoteTableName`, enabling applications to build dynamic SQL without hard-coded table names.
([#4714](<https://github.com/clockworklabs/SpacetimeDB/pull/4714>))
### `spacetime sql --format json`
The `spacetime sql` command now accepts `--format json` for raw API-response output. Text remains the default format.
([#5459](<https://github.com/clockworklabs/SpacetimeDB/pull/5459>))
### CLI database locking
`spacetime lock` and `spacetime unlock` prevent accidental deletion of locked databases.
([#4888](<https://github.com/clockworklabs/SpacetimeDB/pull/4888>))
## Performance, Reliability & Observability
### Safer BSATN array decoding
BSATN decoding no longer blindly pre-allocates arrays based on their binary length prefix, preventing out-of-memory failures on adversarial or malformed inputs.
([#5343](<https://github.com/clockworklabs/SpacetimeDB/pull/5343>))
### Improved view cleanup and view metrics
Expired materialized views are now cleared in bounded batches and cleanup runs more aggressively while a backlog exists. New metrics distinguish view work from reducer work and report view calls triggered by each reducer.
([#5503](<https://github.com/clockworklabs/SpacetimeDB/pull/5503>), [#5553](<https://github.com/clockworklabs/SpacetimeDB/pull/5553>))
### Expanded connection and memory metrics
New Prometheus metrics report outgoing-queue disconnects, WebSocket rejections and terminations by cause, WebSocket idle timeouts, more specific WebSocket receive failures, module-instance memory usage, and startup snapshot metrics.
([#5331](<https://github.com/clockworklabs/SpacetimeDB/pull/5331>), [#5358](<https://github.com/clockworklabs/SpacetimeDB/pull/5358>), [#5400](<https://github.com/clockworklabs/SpacetimeDB/pull/5400>), [#5436](<https://github.com/clockworklabs/SpacetimeDB/pull/5436>), [#5495](<https://github.com/clockworklabs/SpacetimeDB/pull/5495>), [#5547](<https://github.com/clockworklabs/SpacetimeDB/pull/5547>))
## Bug Fixes
### View backing-table migration
Databases automatically migrate procedural-view backing tables created by earlier versions to the current schema.
([#5441](<https://github.com/clockworklabs/SpacetimeDB/pull/5441>))
### TypeScript SDK fixes
- `Uuid` values can be used as literals in query-builder `.where()` predicates.
- Enum columns can be declared as primary keys or indexes without a runtime error.
- One-column prefix scans on multi-column indexes now work in module `filter` and `delete` calls.
- `Random.fill` correctly supports empty and 32-bit typed arrays.
- Identity-like constructors tolerate numeric values originating from JSON and fail earlier for invalid values.
([#5075](<https://github.com/clockworklabs/SpacetimeDB/pull/5075>), [#4389](<https://github.com/clockworklabs/SpacetimeDB/pull/4389>), [#5428](<https://github.com/clockworklabs/SpacetimeDB/pull/5428>), [#5115](<https://github.com/clockworklabs/SpacetimeDB/pull/5115>), [#5041](<https://github.com/clockworklabs/SpacetimeDB/pull/5041>))
### Unreal cache consistency
The Unreal SDK correctly merges overlapping table updates in one transaction, preventing cached unique-index `Find()` calls from returning stale results.
([#5426](<https://github.com/clockworklabs/SpacetimeDB/pull/5426>))
### HTTP, proxy, and SQL fixes
- WebSocket subscriptions behind a standard single-hop proxy now accept a single-IP `X-Forwarded-For` header.
- SQL DML now resolves table accessor names as well as canonical table names.
([#4839](<https://github.com/clockworklabs/SpacetimeDB/pull/4839>), [#5478](<https://github.com/clockworklabs/SpacetimeDB/pull/5478>))
### `spacetime start` port-detection fallback
When `spacetime start` cannot check whether a port is available, such as in a restricted environment, it now continues rather than failing solely because the availability check was denied.
([#5564](<https://github.com/clockworklabs/SpacetimeDB/pull/5564>))
### Improved CLI login errors
`spacetime login` now reports HTTP status failures from authentication endpoints before attempting to parse the response, replacing misleading JSON-decoding errors for invalid auth hosts.
([#5518](<https://github.com/clockworklabs/SpacetimeDB/pull/5518>))
## What's Changed
- Add .NET 10 NativeAOT-LLVM support for C# modules in [#4915](<https://github.com/clockworklabs/SpacetimeDB/pull/4915>)
- Let `spacetime start` continue when port availability cannot be checked in [#5564](<https://github.com/clockworklabs/SpacetimeDB/pull/5564>)
- Allow adding unique constraints to existing tables in [#4465](<https://github.com/clockworklabs/SpacetimeDB/pull/4465>)
- Add primary keys for C++ procedural views in [#5354](<https://github.com/clockworklabs/SpacetimeDB/pull/5354>)
- Add an Unreal SDK query builder in [#4810](<https://github.com/clockworklabs/SpacetimeDB/pull/4810>)
- Add `Find()` for primary-key views in C# and Unreal SDKs in [#5494](<https://github.com/clockworklabs/SpacetimeDB/pull/5494>)
- Add TypeScript schedule registration for split modules in [#5435](<https://github.com/clockworklabs/SpacetimeDB/pull/5435>)
- Add programmatic Svelte reconnect and token swapping in [#5375](<https://github.com/clockworklabs/SpacetimeDB/pull/5375>)
- Add the standalone MCP server endpoint in [#5489](<https://github.com/clockworklabs/SpacetimeDB/pull/5489>)
- Add JSON output for `spacetime sql` in [#5459](<https://github.com/clockworklabs/SpacetimeDB/pull/5459>)
- Fix TypeScript table-handle casing in [#5286](<https://github.com/clockworklabs/SpacetimeDB/pull/5286>)
- Automatically migrate view backing tables in [#5441](<https://github.com/clockworklabs/SpacetimeDB/pull/5441>)
- Improve expired-view cleanup in [#5503](<https://github.com/clockworklabs/SpacetimeDB/pull/5503>)
- Add connection, view, and memory metrics in [#5331](<https://github.com/clockworklabs/SpacetimeDB/pull/5331>), [#5358](<https://github.com/clockworklabs/SpacetimeDB/pull/5358>), [#5400](<https://github.com/clockworklabs/SpacetimeDB/pull/5400>), [#5436](<https://github.com/clockworklabs/SpacetimeDB/pull/5436>), [#5495](<https://github.com/clockworklabs/SpacetimeDB/pull/5495>), [#5547](<https://github.com/clockworklabs/SpacetimeDB/pull/5547>)
**Full Changelog**: [v2.6.1-hotfix3...release/candidate/v2.7.0-hotfix3](<https://github.com/clockworklabs/SpacetimeDB/compare/v2.6.1-hotfix3...release/candidate/v2.7.0-hotfix3>)