github clockworklabs/SpacetimeDB v2.15.0
Release v2.15.0

one hour ago

Features

New TypeScript module packages

Four new opt-in TypeScript packages are available for SpacetimeDB modules, each with documentation, tests, and examples:

  • Agents: provider adapters, tool calls, conversation summaries, embeddings, and stale-lock cleanup.
  • Auth: password and OAuth handlers, ES256 sessions, connection binding, and profiles.
  • Files: upload, listing, deletion, per-file visibility, and HTTP serving helpers.
  • PostHog: server-side analytics and feature-flag evaluation, with durable queued events and explicit batch flushing.

(#5905, #5907)

Rust outbox! shorthand for async IDC

Rust modules can now declare an outbox table with spacetimedb::outbox!(receiver::reducer), which generates the message ID, target, and reducer argument columns from the module bindings. Optional accessor and name arguments are supported; manual #[spacetimedb::table(...)] declarations remain available.

(#6460)

Breaking Changes

C# module build: managed builds are now the default for .NET 10

.NET 10 C# module projects now build as managed assemblies by default; the CLI selects wasi-wasm explicitly for spacetime build and spacetime publish, which are unaffected. This prepares for upcoming C# module unit-testing support. .NET 8 projects are unaffected.

EXPERIMENTAL_WASM_AOT has been renamed to SPACETIMEDB_WASM_AOT (the legacy variable still works in the CLI). Do not define either symbol manually - the runtime's build targets set it automatically.

Existing .NET 10 modules may need to update their .csproj:

  1. Remove the unconditional <RuntimeIdentifier>wasi-wasm</RuntimeIdentifier>.
  2. Make WASM-specific settings conditional on RuntimeIdentifier being wasi-wasm.
  3. Add explicit, conditional LLVM compiler package references - the runtime package no longer supplies them transitively.

A minimal .NET 10 project now looks like:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>net10.0</TargetFramework>
  </PropertyGroup>

  <PropertyGroup Condition="'$(RuntimeIdentifier)' == 'wasi-wasm'">
    <PublishTrimmed>true</PublishTrimmed>
    <SelfContained>true</SelfContained>
    <MSBuildEnableWorkloadResolver>false</MSBuildEnableWorkloadResolver>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="SpacetimeDB.Runtime" Version="2.15.*" />
  </ItemGroup>

  <ItemGroup Condition="'$(RuntimeIdentifier)' == 'wasi-wasm'">
    <PackageReference Include="Microsoft.DotNet.ILCompiler.LLVM" Version="10.0.0-*" />
    <PackageReference Include="runtime.$(NETCoreSdkPortableRuntimeIdentifier).Microsoft.DotNet.ILCompiler.LLVM" Version="10.0.0-*" />
  </ItemGroup>
</Project>

Keep your existing project-specific settings, such as nullable analysis, implicit usings, assembly names, and other dependencies. LLVM packages still require the dotnet-experimental NuGet feed.

(#6346)

Bug Fixes

clear_table no longer double-counts rows

MutTxId::clear_table previously counted every committed row as removed, including rows already deleted by the same transaction. It now counts only newly deleted rows. Note this changes the module ABI clear() return value in that case, for every module language.

(#6499)

TypeScript SDK: fix types for NodeNext consumers

Importing spacetimedb with moduleResolution: "nodenext" no longer fails with missing exported members (e.g. Timestamp). Generated bindings additionally need the --import-extension flag from #6097 to compile under NodeNext.

(#6009)

TypeScript SDK: deprecation notes now reach db without a declare field

Deprecated names are now properly crossed out on conn.db, inside callbacks, and on EventContext. This also fixes generated bindings being rejected by Expo's Babel preset (React Native). No runtime change.

(#6013)

Check publication permissions before reserving database names

A publish attempt rejected by permission checks could still reserve its requested database name. Permissions are now checked before the name is registered.

(#6457)

Fix database identity publish

Corrects publishing behavior related to database identities. Previously released as a hotfix; now merged into mainline. Publishing by name is unaffected.

(#6507)

Improvements

Faster find/filter in the TypeScript SDK

The TypeScript SDK now uses a map for lookups on indexed columns, making find and filter significantly faster.

(#6416)

CLI: warning before using a server-issued login

Commands that auto-accepted a server-issued login when passed --yes now warn and ask for confirmation, avoiding a "split identity" between a local server and maincloud. Using your spacetimedb.com login on all servers remains the intended setup.

(#6337)

CLI: yes/no prompts restored on EOF

CLI yes/no prompts once again use their configured default on EOF, restoring the pre-2.14 behavior.

(#6458)

What's Changed

  • Added agents, authentication, and file module packages for TypeScript modules in #5905
  • Added a PostHog analytics module for TypeScript modules in #5907
  • Added the spacetimedb::outbox! Rust shorthand for async IDC in #6460
  • Made managed builds the default for .NET 10 C# modules and renamed EXPERIMENTAL_WASM_AOT to SPACETIMEDB_WASM_AOT in #6346
  • Fixed clear_table double-counting rows already deleted in the same transaction in #6499
  • Fixed TypeScript SDK types for NodeNext consumers in #6009
  • Fixed TypeScript SDK deprecation notes so generated bindings work with Babel/Expo in #6013
  • Checked publication permissions before reserving database names in #6457
  • Fixed database identity publish in #6507
  • Made find/filter use indexed lookups in the TypeScript SDK in #6416
  • Added a CLI warning before using a server-issued login in #6337
  • Restored the CLI yes/no prompt default on EOF in #6458

Full public changelog: v2.14.1...v2.15.0

Don't miss a new SpacetimeDB release

NewReleases is sending notifications on new releases.