Commit Graph

3070 Commits

Author SHA1 Message Date
Tyler Cloutier a4d29daec8 Fix spacetime dev template issues and clean up CLI (#4396)
## Summary

Multiple fixes and improvements to `spacetime dev`, `spacetime publish`,
`spacetime init`, and templates:

### CLI fixes
- **Fix `spacetime dev` watch path and .env.local handling** for
templates with a `spacetimedb/` subdirectory
- **Validate package manager availability** before installing
dependencies — re-prompts if the selected PM isn't on PATH
- **Remove JS/TS beta warning** from `spacetime publish`
- **Remove unstable warning** from `spacetime init`
- **Remove unused `spacetime energy` command** (can be re-added later
when properly implemented)
- **Fix `tsc` detection on Windows** — `set_extension(".cmd")` produced
`tsc..cmd` (double dot); fixed to `set_extension("cmd")`
- **Add `typescript` as devDependency** to all server template
`spacetimedb/package.json` files so `tsc` is available during build
- **Strip `\?\` extended-length path prefix** from user-facing output in
both `dev` and `publish` commands (produced by `fs::canonicalize()` on
Windows)
- **Fix publish reporting success when user declines** non-local server
prompt — changed `return Ok(())` to `bail!()` consistent with other
abort cases
- **Forward stdin to client process** in `spacetime dev` so interactive
CLI templates work

### Template fixes
- **Fix Angular template environment variables** — Angular's esbuild
builder doesn't support `import.meta.env`, so we use a dev script to
generate `environment.local.ts` with Angular's native `fileReplacements`
pattern
- **Fix TanStack Start template** — rename `createRouter` to `getRouter`
(v1.121+ breaking change), upgrade to React 19, and add
`@vitejs/plugin-react` for automatic JSX runtime support
- **Fix `moduleResolution` in remix-ts and nextjs-ts** server tsconfigs
— change from `"node"` to `"bundler"` to support subpath exports like
`spacetimedb/server`
- **Fix browser-ts template** — convert from static HTML + IIFE bundle
to standard Vite dev server app so it works with `spacetime dev` and
reads env vars from `.env.local`
- **Add `deno` as devDependency** to deno-ts template (matches how
bun-ts includes bun)
- **Convert basic-ts from empty web app to CLI app** matching basic-rs —
connect, subscribe to person table, print on insert

## Test plan

- [x] `cargo test -p spacetimedb-cli` — all 133 tests pass
- [ ] `spacetime dev --template angular-ts` — verify Angular app
connects with correct database name
- [ ] `spacetime dev --template react-ts` — verify React template still
works
- [ ] `spacetime dev --template tanstack-ts` — verify TanStack Start
template loads without errors
- [ ] `spacetime dev --template remix-ts` — verify Remix template builds
and runs
- [ ] `spacetime dev --template nextjs-ts` — verify Next.js template
still works
- [ ] `spacetime dev --template browser-ts` — verify Vite dev server
starts and app connects
- [ ] `spacetime dev --template bun-ts` — verify Bun CLI template runs
interactively
- [ ] `spacetime dev --template basic-ts` — verify CLI connects and
prints on insert
- [ ] Verify no `\?\` prefix in any displayed paths on Windows
- [ ] Verify no `tsc not found` warning when building server modules
- [ ] Select unavailable package manager at init prompt — verify
re-prompt
- [ ] Decline non-local server prompt — verify clean error instead of
"Published successfully!"

---------

Co-authored-by: Piotr Sarnacki <drogus@gmail.com>
Co-authored-by: John Detter <4099508+jdetter@users.noreply.github.com>
Co-authored-by: clockwork-labs-bot <bot@clockworklabs.com>
v2.0.1
2026-02-24 02:39:42 -05:00
bradleyshep e9ecfa9775 Keynote fixes/refinements (#4418)
# Description of Changes

Integrate the `keynote-2` benchmark template into the pnpm workspace so
it uses the local SpacetimeDB TypeScript SDK instead of a pinned npm
version.

- Add `templates/keynote-2` to `pnpm-workspace.yaml` and switch its
`spacetimedb` dependency to `workspace:*`
- Regenerate module bindings for SDK 2.0.1
- Update `DEVELOP.md`: bump Node.js prerequisite to ≥ 22.x (required by
the SDK's use of `Promise.withResolvers`), update CLI commands to use
`cargo run -p spacetimedb-cli --` for local development
- Fix `build` script: use `tsc` only (keynote-2 is a Node.js CLI app,
not a web app — `vite build` fails without an `index.html`)
- Fix demo results display: treat 0 TPS as a failure (`✗ FAILED`)
instead of showing it as a valid result and producing a nonsensical
"Infinityx FASTER" comparison
- Enable `LOG_ERRORS` by default in the demo so reducer failures are
immediately visible instead of silently producing 0 TPS
- Minor cleanup: fix unused variable warning in
`init_sqlite_seed_in_docker.ts`

# API and ABI breaking changes

None.

# Expected complexity level and risk

1 — Scoped entirely to the `keynote-2` template and its workspace
integration. No changes to the SDK, server, or any other template.

# Testing

- [ ] Run `pnpm install && pnpm --filter spacetimedb build` from repo
root
- [ ] Run `pnpm run demo -- --systems spacetimedb --seconds 3` from
`templates/keynote-2` against a local SpacetimeDB server and confirm
non-zero TPS
- [ ] Verify that a system producing 0 TPS shows `✗ FAILED` and is
excluded from the comparison chart
- [ ] Verify that reducer errors are printed to console during benchmark
failures

---------

Co-authored-by: clockwork-labs-bot <bot@clockworklabs.com>
2026-02-23 23:27:30 -08:00
Zeke Foppa 2b85157d18 Confirmed reads default only for v2 connections (#4419)
# Description of Changes

Reducing scope of https://github.com/clockworklabs/SpacetimeDB/pull/4390
to only apply to V2 clients.

# API and ABI breaking changes

I think this is an API change?

# Expected complexity level and risk

1

# Testing

<!-- Describe any testing you've done, and any testing you'd like your
reviewers to do,
so that you're confident that all the changes work as expected! -->

- [ ] <!-- maybe a test you want to do -->
- [ ] <!-- maybe a test you want a reviewer to do, so they can check it
off when they're satisfied. -->

Co-authored-by: Zeke Foppa <bfops@users.noreply.github.com>
2026-02-23 23:27:12 -08:00
bradleyshep c37b7912b3 LLM Benchmark docs updates from testings (#4416)
# Description of Changes

Documentation updates from llm-benchmark testing. Includes:

- **Core concepts**: Tables, column types, auto-increment, indexes,
access permissions, schedule tables, event tables, performance
- **Client references**: C# and TypeScript reference updates
- **Migration guide**: 2.0 migration docs
- **AI rules**: `spacetimedb-csharp.mdc`, `spacetimedb-typescript.mdc`,
new `spacetimedb-migration-2.0.mdc`
- **Cheat sheet**: Database cheat sheet updates
- **Reducers, procedures, reducer context**: Small fixes and
clarifications
- **llms.md**: LLM-related doc updates

# API and ABI breaking changes

None. Documentation only.

# Expected complexity level and risk

**Complexity: 2** — Broad docs changes but no code. Risk is limited to
incorrect or misleading docs.

# Testing

- [ ] Build docs site and confirm it renders
- [ ] Spot-check updated pages (tables, schedule tables, cheat sheet,
client references)
- [ ] Confirm C# tutorial examples use `nameof(...)` and snake_case

---------

Signed-off-by: bradleyshep <148254416+bradleyshep@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Tyler Cloutier <cloutiertyler@users.noreply.github.com>
Co-authored-by: joshua-spacetime <josh@clockworklabs.io>
2026-02-23 21:09:14 -08:00
clockwork-labs-bot b002158db8 Enable confirmed reads by default (#4390)
## Summary

Enable confirmed reads by default for all WebSocket subscriptions and
SQL queries. This is a 2.0 breaking change that improves data integrity.

### What changed

Previously, subscription updates and SQL results were sent to clients
immediately, before the transaction was confirmed durable. A server
crash could cause clients to have observed data that was lost.

Now the server defaults to `confirmed=true`. Clients receive updates
only after durability is confirmed. This adds a small latency cost but
guarantees that any data a client receives will survive a server
restart.

### Changes

**Server (2 files, 2 lines each):**
- `subscribe.rs`: `SubscribeQueryParams.confirmed` defaults to `true`
- `database.rs`: `SqlQueryParams.confirmed` defaults to `true`

**Documentation:**
- Migration guide updated with "Confirmed Reads Enabled by Default"
section
- Added to overview list and quick migration checklist

### Opt-out

Clients can opt out by explicitly passing `?confirmed=false` in the
WebSocket URL or using `.withConfirmedReads(false)` /
`.WithConfirmedReads(false)` / `.with_confirmed_reads(false)` in SDKs.

### Smoketest impact

Smoketests that don't explicitly pass `--confirmed` will now get
confirmed reads via the server default. This should not cause failures
-- confirmed reads only add a small wait for durability confirmation
before sending results. The `confirmed_reads.py` smoketest explicitly
passes `--confirmed` and continues to work as before.

### SDK impact

No SDK changes needed. SDKs only send the `confirmed` query parameter
when explicitly set by the user. When not set, the server default
applies -- which is now `true`.

---------

Signed-off-by: Zeke Foppa <196249+bfops@users.noreply.github.com>
Co-authored-by: clockwork-labs-bot <clockwork-labs-bot@users.noreply.github.com>
Co-authored-by: clockwork-labs-bot <bot@clockworklabs.com>
Co-authored-by: Zeke Foppa <196249+bfops@users.noreply.github.com>
Co-authored-by: Zeke Foppa <bfops@users.noreply.github.com>
2026-02-24 02:27:42 +00:00
Jason Larabie e476668b3a C++ Quickstart - spacetime dev not working (#4414)
# Description of Changes
Updated the /templates/basic-cpp to target Rust 2.0.* and add
pre-generated bindings as the updated `spacetime dev` seems to require
that.

# API and ABI breaking changes

N/A 

# Expected complexity level and risk

1 - Template only change

# Testing

- [x] Was able to use `spacetimedb-cli.exe dev --template basic-cpp`
2026-02-24 00:05:10 +00:00
Noa 28ca85566a Fix keynote-2 module (#4412)
# Description of Changes

Updates to v2 bindings

# Expected complexity level and risk

1

# Testing

- [x] Compiles
2026-02-23 23:30:03 +00:00
bradleyshep 55c1b815d4 LLM Benchmark Results - Feb 26 (#4388)
# Description of Changes

- Update llm benchmark results based on latest testing
- Clean up details file to remove old models
- Regenerated the summary file

# API and ABI breaking changes

- None

# Expected complexity level and risk

- 1

# Testing

- Verify the new summary file loads correctly on the website.
2026-02-23 23:15:39 +00:00
Ryan 92e9767a81 [Docs] Updates to 00600-c-sharp.md to work in 2.0 (#4415)
# Description of Changes

* Updates directory tree to reflect the actual results of running
`spacetime dev --template basic-cs my-spacetime-app` with no additional
arguments.
* Updates the `Add` -> `add` reducer call to use lower-case to match the
default when no override is specified.
* Updates the `SayHello` -> `say_hello` reducer call to use lower-case
to match the default when no override is specified.

# API and ABI breaking changes

None

# Expected complexity level and risk

1

# Testing

- [X] Walked through every step with a local server to test behavior.
This involved.
* Cleared all local cache and rebuilding the CLI.
* Rebuilding the DLLs
* From my test project directory, running:
`D:\Projects\ClockworkLabs\SpacetimeDB\target\debug\spacetimedb-cli.exe
dev --template basic-cs my-spacetime-app` and selecting the default
values.
* This threw an error because, I believe, it was not using the local
DLLs.
* Going into each `.csproj` to ensure they are using the local versions
of the files.
* Running the remaining commands, while targeting the local CLI
executables:
  * Note: `local` server is mapped to `127.0.0.1:3000`
```
D:\Projects\ClockworkLabs\SpacetimeDB\target\debug\spacetimedb-cli.exe publish -s local my-spacetime-app
D:\Projects\ClockworkLabs\SpacetimeDB\target\debug\spacetimedb-cli.exe call -s local my-spacetime-app add Alice
D:\Projects\ClockworkLabs\SpacetimeDB\target\debug\spacetimedb-cli.exe sql -s local my-spacetime-app "SELECT * FROM Person"
D:\Projects\ClockworkLabs\SpacetimeDB\target\debug\spacetimedb-cli.exe call -s local my-spacetime-app say_hello
D:\Projects\ClockworkLabs\SpacetimeDB\target\debug\spacetimedb-cli.exe logs -s local my-spacetime-app
```
2026-02-23 23:11:39 +00:00
Jeffrey Dallatezza 7923d6f64b Update default doc version to 2.0.0 (#4411)
# Description of Changes

Docs will now go to version 2.0.0 by default, and there is a banner with
a link to the newer docs if someone is viewing the v1 docs.

# Expected complexity level and risk

1. Biggest risk here is breaking links.

# Testing

I tested this locally, and checked that links are working.

There is also a broken link checker in the CI.
2026-02-23 23:09:42 +00:00
Noa bb08c8b571 [TS] Add typescript dependency to typescript templates (#4409)
# Description of Changes

`spacetime build` now attempts to run tsc for typescript modules, and
will emit a warning if it's not present. This PR makes it so our CLI
stops emitting a warning for our templates.

# Expected complexity level and risk

1

# Testing

- [x] Verified that typescript gets properly installed.
2026-02-23 22:40:41 +00:00
Zeke Foppa 88407f0958 Bump versions to 2.0.1 (#4403)
# Description of Changes

Just bumping versions to 2.0.1.

# API and ABI breaking changes

None

# Expected complexity level and risk

1

# Testing
- [ ] CI passes

---------

Co-authored-by: Zeke Foppa <bfops@users.noreply.github.com>
2026-02-23 21:54:10 +00:00
Zeke Foppa edb54e51e4 Fix version upgrade check for prerelease versions (#4407)
# Description of Changes

Fix our version compatibility checking for prereleases. Fixes
https://github.com/clockworklabs/SpacetimeDB/issues/4405.

# API and ABI breaking changes

None.

# Expected complexity level and risk

1

# Testing
I've added more unit tests for the upgrade behavior surrounding
prereleases (upgrading to a prerelease, upgrading from a prerelease, and
upgrading between prereleases).

---------

Co-authored-by: Zeke Foppa <bfops@users.noreply.github.com>
2026-02-23 21:12:56 +00:00
Phoebe Goldman 0f8bff5f01 sql_parts does not conflict with interactive in CLI sql subcommand (#4402)
# Description of Changes

With the introduction of `spacetime.json`, our arg parsing has gotten
more complex, and in particular, we now use the `sql_parts` argument to
pass the database name rather than a separate positional arg, to support
eliding the database name. This means that there is a case where both
`sql_parts` and `interactive` will be supplied, so they cannot be marked
as conflicting.

# API and ABI breaking changes

N/a

# Expected complexity level and risk

1

# Testing

- [x] Manually ran `spacetime sql --interactive my-database`, which
worked locally with this patch.
2026-02-23 20:47:26 +00:00
John Detter 6836d26bae CI - Fail properly if psql failed to install (#4399)
# Description of Changes

We had an issue where the install failed but did not fail the step:
```
Run choco install psql -y --no-progress
Chocolatey v2.6.0
Installing the following packages:
psql
By installing, you accept licenses for the packages.
Failed to fetch results from V2 feed at 'https://community.chocolatey.org/api/v2/Packages(Id='psql',Version='16.2.0')' with following message : Response status code does not indicate success: 504 (Gateway Time-out).
Need to add specific handling for exception type NuGetResolverInputException
Unable to find package 'psql'. Existing packages must be restored before performing an install or update.
```

# API and ABI breaking changes

<!-- If this is an API or ABI breaking change, please apply the
corresponding GitHub label. -->

None - this is just CI

# Expected complexity level and risk

None - this is just CI

<!--
How complicated do you think these changes are? Grade on a scale from 1
to 5,
where 1 is a trivial change, and 5 is a deep-reaching and complex
change.

This complexity rating applies not only to the complexity apparent in
the diff,
but also to its interactions with existing and future code.

If you answered more than a 2, explain what is complex about the PR,
and what other components it interacts with in potentially concerning
ways. -->

# Testing

<!-- Describe any testing you've done, and any testing you'd like your
reviewers to do,
so that you're confident that all the changes work as expected! -->

- [x] Windows smoketests are able to use `psql` properly

---------

Signed-off-by: John Detter <4099508+jdetter@users.noreply.github.com>
Signed-off-by: Zeke Foppa <196249+bfops@users.noreply.github.com>
Co-authored-by: Zeke Foppa <196249+bfops@users.noreply.github.com>
2026-02-23 20:13:29 +00:00
joshua-spacetime 6298e0a4e0 Remove query builder's .build() from llm docs (#4398)
# Description of Changes

Removes left over references to the query builder's `.build()` method as
well as some stale C# references from `llms.md`.

Only rust and C# docs needed updating.

# API and ABI breaking changes

None

# Expected complexity level and risk

1. Small docs update

# Testing

N/A
2026-02-23 19:19:52 +00:00
Tyler Cloutier d3deaeec08 Docs: Add links to all quickstart guides on Getting Started page (#4395)
## Summary
- Update the `QuickstartLinks` component on the Getting Started
(`/docs`) page to show all 16 quickstart guides instead of just 4
(TypeScript, C#, Rust, React)
- The component now uses `useDocsVersion()` to filter items based on the
active doc version, so v1.12 only shows quickstarts that exist in that
version while v2.0 shows all 16
- Add new SVG logos for Vue, Nuxt, Svelte, Angular, TanStack Start,
Deno, and C++
- Replace existing logos (React, Next.js, Node.js, Bun, Remix, HTML5)
with consistent monochrome `currentColor` versions sourced from the
spacetime-web homepage
- Fix Rust logo visibility in dark mode by removing hardcoded
`style="color: black;"`

## Test plan
- [ ] Verify the Getting Started page on v2.0.0-rc1 shows all 16
quickstart cards
- [ ] Verify the Getting Started page on v1.12.0 shows only the
quickstarts that exist in that version (react, vue, svelte, typescript,
rust, c-sharp)
- [ ] Verify all card links navigate to the correct quickstart page
- [ ] Verify logos are visible in both light and dark mode
2026-02-23 18:49:34 +00:00
clockwork-labs-bot 3b48c4bee5 Fix spacetime logout failing when offline (#4361)
Fixes #2437

`spacetime logout` previously required a network connection to the auth
server, making it impossible to log out (and thus log in with a
different method) when offline.

This change makes the server-side session invalidation best-effort: if
the auth server is unreachable, a warning is printed but local
credentials are still cleared. This allows offline development workflows
like `spacetime login --server-issued-login local`.

Co-authored-by: clockwork-labs-bot <clockwork-labs-bot@users.noreply.github.com>
2026-02-23 18:07:52 +00:00
Jeffrey Dallatezza 6a93a38739 Use the query type in the useTable of vue and svelte (#4400)
# Description of Changes

Use the `Query` type for the vue and svelte `useTable` functions.

# API and ABI breaking changes

This shouldn't break any code that is using query builders.

# Expected complexity level and risk

1.
2026-02-23 18:06:35 +00:00
Ryan 85095cfa85 [C#] Removes Query<TRow> and .Build() in favor of IQuery<TRow> (#4393)
This fixes an issue with the C# implementation of Query Builder
requiring `Build()` to return a query, and the return type being
`Query<TRow>` rather than `IQuery<TRow>`.

# Description of Changes

1. Runtime/query-builder
* Removed the concrete `Query<TRow>` carrier type and every `.Build()`.
Query builder shapes now expose only `IQuery<TRow>` plus `ToSql()`.
* Ensured all builder entry points (tables, joins, filters) continue to
return `IQuery<TRow>`.
2. Source generator + bindings
* Updated `ViewDeclaration` analysis to treat any return type
implementing `SpacetimeDB.IQuery<TRow>` as a SQL view.
* Dispatcher generation now emits
`ViewResultHeader.RawSql(returnValue.ToSql())` . This eliminates a
`Query<TRow>` special-case.
3. Tests, fixtures, regression module
* Converted the C# query-builder unit tests, codegen fixtures, and
regression-test server views to call `ToSql()`/return `IQuery<TRow>`.
* Added coverage proving `RightSemiJoin` (and friends) still satisfy
`IQuery<TRow>`.
4. CLI templates & generated bindings
* Regenerated/edited C# template bindings so
`SubscriptionBuilder.AddQuery` accepts `Func<QueryBuilder,
IQuery<TRow>>` and captures SQL via `ToSql()`.

# API and ABI breaking changes

While technically API breaking, this actually brings the API closer to
the intended design.
* `Query<TRow>` has been removed from the public surface area; any
previous references (including `.Build()` and `.Sql`) must be replaced
with the builder instance itself plus `.ToSql()`.
* View methods must now return an `IQuery<TRow>` (or any custom type
implementing it) when producing SQL for the host.
* Generated C# client bindings now expect typed subscription callbacks
to produce `IQuery<TRow>`, aligning the client SDK with the new runtime
contract.

# Expected complexity level and risk

3 - Medium: Touches runtime, codegen, fixtures, and templates. Risk is
mitigated by parity with Rust semantics and comprehensive test updates,
but downstream modules must recompile to adopt the new interface.

# Testing

- [X] Built CLI and ran regression tests locally with removed `.Build()`
- [X] Ran `dotnet test .\sdks\csharp\tests~\tests.csproj -c Release`
with all tests passing
- [X] Ran `dotnet test
.\crates\bindings-csharp\Codegen.Tests\Codegen.Tests.csproj -c Release`
with all tests passing
2026-02-23 15:34:51 +00:00
Kim Altintop 8aa22da034 commitlog: Improve committed_meta (#4338)
- Extends `commit::Metadata` to include the checksum
- Extends `segment::Metadata` to include `Some(commit::Metadata)`
  containing the last commit in the segment (if there is one)
- Changes `committed_meta` to:
  - ignore empty segments at the end of the log
  - try harder to provide useful metadata, even if only a prefix of the
    latest segment is readable

This is allows to eliminate remaining `Commitlog::open` calls with the
purpose of querying the latest commit (offset). `Commitlog::open`
creates an empty segment if the tail of the log is corrupt, which is a
non-obvious side-effect that can be confusing when debugging.

It also allows to eliminate uses where the `commits_from` iterator is
used to find the latest full commit. The `Commits` iterator requires the
caller to handle the case of a corrupted commit at the end of the log,
by advancing the iterator once more after it has yielded an error in
order to check that it is exhausted, and then deciding whether to ignore
the error. This is easy to forget.

`committed_meta` now just does the right thing, preserving information
about tail corruption for when that's useful.
2026-02-23 14:16:59 +00:00
bradleyshep c14c8d15b0 TS quickstart template fixes (nextjs + nodejs) (#4380)
# Description of Changes

- Node.js: Use esbuild instead of tsx 
- Node.js: Remove interactive CLI since it doesn't work with `spacetime
dev`
- Next.js: Fix onError callback to use single argument (ctx) and use
ctx.event for the error.
- Next.js: Replace lint-disable comment with `_connection` for the
unused variable.
- Updated quickstart docs to use proper `withDatabaseName`

# API and ABI breaking changes

None.

# Expected complexity level and risk

**Complexity: 1–2.** Small tooling, type, and lint tweaks. Low risk.

# Testing

- [ ] Build affected templates (e.g. `pnpm build` in nextjs-ts).
- [ ] Lint passes.
2026-02-22 11:05:56 +00:00
Jeffrey Dallatezza aa9b3d3db0 Close the connection on errors for applied subscriptions (#4378)
# Description of Changes

Until we have per-query storage, if we get a subscription error for a
subscription that we have already applied, we don't know how to remove
the data for that query from our cache. This change just kills the
connection if that happens.

# Expected complexity level and risk

1

# Testing

This has some unit test coverage.

---------

Co-authored-by: clockwork-labs-bot <bot@clockworklabs.com>
2026-02-21 23:52:19 +00:00
Ludv1gL d2223a2237 fix: Handle empty HTTP response body in procedure bindings (#4386)
## Summary

- `create_bytes_source()` in the host returns `BytesSourceId::INVALID`
for empty response bodies, but `HttpClient::send()` unconditionally
reads the body source via `read_bytes_source_into()`, which panics with
`"invalid source passed"`
- Any procedure HTTP request returning an empty body (e.g. HTTP 200 with
no content from a successful reducer call) triggers this panic
- Fix: check for `BytesSource::INVALID` before reading, matching the
existing pattern used for JWT payloads in `bindings-sys`

## Test plan

- [x] Verified `cargo check -p spacetimedb` passes
- [x] Trigger an HTTP request from a procedure that returns an empty
response body (e.g. calling a reducer via HTTP that returns 200 with no
body)
- [x] Verify no panic occurs and an empty `Body` is returned

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-02-21 04:54:16 +00:00
Phoebe Goldman 2d4395c76d Docs: SpacetimeDB 2.0 migration guide (#4383)
# Description of Changes

Expanded and reorganized the 2.0 migration guide, and also deleted a
file that was in the wrong place. (The word "migration" is
overloaded...)

# API and ABI breaking changes

N/a

# Expected complexity level and risk

Like, 1 I guess, since this isn't code? But we should be careful to get
this right.

# Testing

- [x] Pasted all 2.0 Rust examples into a project based on the
`basic-rs` template and got 'em to build.
- This required filling in some code outside the examples (defining
`play_damage_animation`, binding `target` and `amount`), and changing
one table name that was used in two examples, but otherwise everything
is valid.
  - I didn't test the 1.0 examples.

---------

Co-authored-by: Jason Larabie <jason@clockworklabs.io>
Co-authored-by: = <cloutiertyler@gmail.com>
2026-02-21 03:29:39 +00:00
joshua-spacetime 26b35d39ca Fix view macro to keep original visibility (#4387)
# Description of Changes

Fixes a bug that dropped a view function's original visibility.

# API and ABI breaking changes

None

# Expected complexity level and risk

1

# Testing

- [x] Smoketest as regression test
2026-02-21 03:10:17 +00:00
bradleyshep 9c73277edb Template packages -> workspace instead of 1.* (#4373)
# Description of Changes

- Quickstart templates: use workspace:* for spacetimedb instead of 1.*
so in-repo dev uses the local SDK.

# API and ABI breaking changes

None.

# Expected complexity level and risk

1. Template and workspace config only.

# Testing

- [ ] `pnpm install` from repo root; `spacetime dev --no-config` from a
template.
- [ ] `spacetime init` in a new dir; generated project has versioned
`spacetimedb`, not `workspace:*`.

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-20 23:52:04 +00:00
Jeffrey Dallatezza bddfc19725 Add doc versioning (#4381)
# Description of Changes

This change cuts a version of the docs from 1.12.0
(e45cf891c2), and saves it under
`docs/versioned_docs/version-1.12.0`.

If you go to the docs page, it will redirect to the 1.12.0 docs, which
has a banner at the top for trying the prerelease docs:
<img width="1027" height="283" alt="Screenshot 2026-02-20 at 12 07
39 PM"
src="https://github.com/user-attachments/assets/8ff3d622-b693-469a-980a-01c34d0506b8"
/>

If you select the prelease docs, there is a warning banner at the top:
<img width="886" height="299" alt="Screenshot 2026-02-20 at 12 08 52 PM"
src="https://github.com/user-attachments/assets/5508a635-765e-40cc-ad2a-cbbed7f779dd"
/>


# Expected complexity level and risk

This only changes docs.

# Testing

I've testing by running this locally.
2026-02-20 22:41:39 +00:00
clockwork-labs-bot dd2c95f113 Move CaseConversionPolicy to public SpacetimeDB namespace (#4382)
Move `CaseConversionPolicy` from `SpacetimeDB.Internal` to the public
`SpacetimeDB` namespace so module authors can write:

```csharp
[SpacetimeDB.Settings]
public const CaseConversionPolicy CASE_CONVERSION_POLICY = CaseConversionPolicy.SnakeCase;
```

instead of the verbose:

```csharp
public const SpacetimeDB.Internal.CaseConversionPolicy CASE_CONVERSION_POLICY = SpacetimeDB.Internal.CaseConversionPolicy.SnakeCase;
```

### Changes
- Move enum definition from `SpacetimeDB.Internal` to `SpacetimeDB`
namespace in autogen
- Fully qualify all `Internal` references to
`SpacetimeDB.CaseConversionPolicy`
- Codegen source generator accepts both
`SpacetimeDB.CaseConversionPolicy` and
`SpacetimeDB.Internal.CaseConversionPolicy` for backward compatibility
- Updated test fixture and verified snapshots
- All 4 codegen tests pass

---------

Co-authored-by: clockwork-labs-bot <clockwork-labs-bot@users.noreply.github.com>
2026-02-20 22:21:46 +00:00
Jeffrey Dallatezza 3c881f3641 Rename UnknownTransaction event to Transaction (#4377)
# Description of Changes

This changes the event tag from `UnknownTransaction` to `Transaction` to
be more in line with the rust sdk.

# API and ABI breaking changes

This changes the event tags for row updates that happen for transactions
triggered by SQL transactions or reducers called by other connections.

# Expected complexity level and risk

1.

# Testing

Seems trivial.
2026-02-20 21:38:01 +00:00
clockwork-tien 029e7c1e40 fix: Additional fixes for templates (#4372)
# Description of Changes
- Add back `{ public: true }` to tables, update `module_bindings`
accordingly
- Add missing templates to `pnpm-workspace.yaml`

<!-- Please describe your change, mention any related tickets, and so on
here. -->

# API and ABI breaking changes

<!-- If this is an API or ABI breaking change, please apply the
corresponding GitHub label. -->

# Expected complexity level and risk

<!--
How complicated do you think these changes are? Grade on a scale from 1
to 5,
where 1 is a trivial change, and 5 is a deep-reaching and complex
change.

This complexity rating applies not only to the complexity apparent in
the diff,
but also to its interactions with existing and future code.

If you answered more than a 2, explain what is complex about the PR,
and what other components it interacts with in potentially concerning
ways. -->

# Testing

<!-- Describe any testing you've done, and any testing you'd like your
reviewers to do,
so that you're confident that all the changes work as expected! -->

- [ ] <!-- maybe a test you want to do -->
- [ ] <!-- maybe a test you want a reviewer to do, so they can check it
off when they're satisfied. -->

---------

Co-authored-by: bradleyshep <148254416+bradleyshep@users.noreply.github.com>
2026-02-20 21:15:42 +00:00
Noa 03a6c458b8 Don't shadow Math.random() in typescript (#4375)
# Description of Changes

This also affects typescript clients, which wasn't the intention.

# Expected complexity level and risk

1

# Testing

- [x] Typescript client code that uses Math.random is no longer broken.
2026-02-20 19:29:30 +00:00
bradleyshep e256ceff33 Change deno quickstart to use package.json instead of deno.json (#4374)
# Description of Changes

Deno quickstart template now uses `package.json` instead of `deno.json`
so `spacetime dev` can run it. Added `templates/deno-ts/package.json`,
removed `deno.json`, and updated the Deno quickstart doc.

# API and ABI breaking changes

None.

# Expected complexity level and risk

**1** — Template and docs only.

# Testing

- [ ] `spacetime dev --template deno-ts` and confirm client runs.
- [ ] Spot-check updated Deno quickstart doc.
2026-02-20 19:05:59 +00:00
Shubham Mishra ba15373948 typescript: canonical naming for reducer and procedure. (#4371)
# Description of Changes

Canonical naming for reducer and procedure.
It shouldn't have the `name` field there but if it's there it should be
used as canonical name.

# API and ABI breaking changes
Yes

# Expected complexity level and risk
1
2026-02-20 18:01:24 +00:00
Piotr Sarnacki 19cc87ebfa Allow skipping DB if the config file is available (#4358)
# Description of Changes

This PR introduces a possibility to skip passing a DB name to various
commands if there is a config file with one database defined

# API and ABI breaking changes

This changes the behaviour of several CLI commands:

  1. call
  2. subscribe
  3. sql
  4. describe
  5. logs
  6. delete

# Expected complexity level and risk

4 - it's tricky to get all of the combinations of CLI arguments right

# Testing

I've tested the simplest cases manually.

---------

Co-authored-by: clockwork-labs-bot <clockwork-labs-bot@users.noreply.github.com>
Co-authored-by: = <cloutiertyler@gmail.com>
2026-02-20 17:48:54 +00:00
clockwork-labs-bot a89634b4a5 Add #[spacetimedb::settings] for module-level configuration (#4366)
## Summary

Adds a cross-language `#[spacetimedb::settings]` mechanism for declaring
module-level settings. The first supported setting is
`CASE_CONVERSION_POLICY`, which controls how identifiers are
case-converted.

### Rust

```rust
use spacetimedb::CaseConversionPolicy;

#[spacetimedb::settings]
const CASE_CONVERSION_POLICY: CaseConversionPolicy = CaseConversionPolicy::None;
```

- Proc macro validates const name against `KNOWN_SETTINGS`
- Generates `__preinit__` export for registration
- Duplicate settings produce a linker error (duplicate symbol)

### TypeScript

```ts
export const moduleSettings: ModuleSettings = {
  caseConversionPolicy: CaseConversionPolicy.None,
};
```

- `ModuleSettings` interface with typed fields
- `caseConversionPolicy` section pushed in `rawModuleDefV10()`


## Stacked on

- `shub/case-conversion` (base)
- PR #4364 (internal opt-out API)

This PR adds the proper user-facing API on top of the internal mechanism
in #4364.

Co-authored-by: clockwork-labs-bot <clockwork-labs-bot@users.noreply.github.com>
2026-02-20 15:26:40 +00:00
bradleyshep cea601ffa4 Fix various TS templates (#4360)
# Description of Changes

Fix `withModuleName` -> `withDatabaseName` in server-side code across
multiple TypeScript templates. The 2.0 SDK renamed this method, but
several templates still used the old 1.x API name, causing a runtime
error (`DbConnection.builder(...).withUri(...).withModuleName is not a
function`).

**Files changed:**
- `templates/nuxt-ts/server/api/people.get.ts`
- `templates/remix-ts/app/lib/spacetimedb.server.ts`
- `templates/nextjs-ts/lib/spacetimedb-server.ts`
- `templates/nodejs-ts/src/main.ts`
- `templates/deno-ts/src/main.ts`
- `templates/keynote-2/src/connectors/spacetimedb.ts`

# API and ABI breaking changes

None. This aligns templates with the existing 2.0 SDK API.

# Expected complexity level and risk

1 — Trivial string replacement across template files. No logic changes.

# Testing

- [ ] Run `spacetime dev --template nuxt-ts` and verify the Nuxt SSR
server API (`/api/people`) connects without `withModuleName is not a
function` error
- [ ] Run `spacetime dev --template nextjs-ts` and verify the
server-side SpacetimeDB connection works
- [ ] Run `spacetime dev --template remix-ts` and verify the server-side
SpacetimeDB connection works
2026-02-20 15:05:45 +00:00
Shubham Mishra e2f8a60759 Case conversion (#4263)
# Description of Changes

Update the Default casing policy to `snake_case` for `RawModuleDefV10`.

Messy PR contains changes at different places, so that CI can pass:

Here are the main changes as follows:
- `bindings-macro` & `bindings` crate: `name` macro in Indexes for
canonical name and supply it to `RawModuleDefV10` via `ExplicitNames`.
- `bindings-typescript`: 
- Changes has been reviewed through this PR -
https://github.com/clockworklabs/SpacetimeDB/pull/4308.
   
- `binding-csharp`: a single line change to pass `sourceName` of index
instead of null.
- `codegen`:
  
- Changes has been merged from branch -
https://github.com/clockworklabs/SpacetimeDB/pull/4337.
  
- Except a fix in rust codegen to use canonical name in Query buillder
instead of accessor.
  
- `lib/db/raw_def`: Extends `RawDefModuleV10` structure to support case
conversion.
  
- `schema` crate:
- `validate/v9` - Nothing itself should change or changes in v9
validation logic but the file contains a `CoreValidator` which is shared
with `validate/v10`. No test have t be updated to `validate/v9` which
ensures we aren't regressing it.
- `validate/v10`: This is the main meat, look at the new tests added in
bottom to understand what it does.
     
   -  Rest of the files are either test updates or module bindings. 
     
    ## Testing:
1. Extensive unit tests have been added to verify generated `ModuleDef`
is correct.
2. I have done some e2e testing to verify rust codegen with rust and
typescript modules.
3. I would have like to do more testing for other codegens , I am
continue doing .

I have removed `sql.py` smoketest, as that seems to be already migated
in new framework and was headache to update.

## Expected complexity level and risk
4, It could have side-effect which aren't easily visible.


 
 
 
 
 
 -  -  -

---------

Signed-off-by: Shubham Mishra <shivam828787@gmail.com>
Co-authored-by: rekhoff <r.ekhoff@clockworklabs.io>
Co-authored-by: clockwork-labs-bot <clockwork-labs-bot@users.noreply.github.com>
Co-authored-by: clockwork-labs-bot <bot@clockworklabs.com>
Co-authored-by: joshua-spacetime <josh@clockworklabs.io>
Co-authored-by: Noa <coolreader18@gmail.com>
Co-authored-by: = <cloutiertyler@gmail.com>
Co-authored-by: clockwork-labs-bot <clockwork-labs-bot@clockworklabs.io>
Co-authored-by: Jason Larabie <jason@clockworklabs.io>
Co-authored-by: Phoebe Goldman <phoebe@clockworklabs.io>
2026-02-20 10:44:29 +00:00
Ryan d965569397 [C#] Cononical Names and Casing Settings in ModuleDef (#4368)
This is the implementation of the "Nice to Have in 2.0" items from #4295

# Description of Changes
* Propagate the module’s case-conversion policy and each explicit
canonical name (tables, reducers, procedures, views, indexes) into
`RawModuleDefV10`, so runtime consumers receive the same metadata
emitted by the Rust toolchain.
* Implement support for `[SpacetimeDB.Settings]` + explicit `Name = ...`
attribute overrides in the C# module bindings generator.
* Adds an `explicitnames` fixture to the Codegen Test suite to cover the
generated registration calls, ensuring accessor vs. canonical names stay
in sync.
# API and ABI breaking changes
None. Generator + runtime internals only; no public surface changes.

# Expected complexity level and risk
2 – localized to the C# codegen/runtime plumbing, validated by focused
tests.

# Testing
- [X] Compiled CLI changes locally and ran C# regression tests.
- [X] Ran `dotnet test
crates/bindings-csharp/Codegen.Tests/Codegen.Tests.csproj -c Release` to
verify code tests pass
2026-02-20 06:31:07 +00:00
Zeke Foppa e9977ffa81 gitignore AI agent config dirs (#4365)
# Description of Changes

Just adding gitignore lines for AI agent stuff so I don't commit my
configs.

# API and ABI breaking changes

gitignore only

# Expected complexity level and risk

1

# Testing

- [x] My files are no longer showing up in git 🤷

---------

Co-authored-by: Zeke Foppa <bfops@users.noreply.github.com>
2026-02-20 02:54:04 +00:00
Jeffrey Dallatezza 9cf4af4ff2 Add more debug logging to the typescript client (#4356)
# Description of Changes

This adds some logging utilities, that will probably be helpful for
debugging issues. `stdbLogger` can now accept lazy messages. If you call
`setGlobalLogLevel`, that will set a log level globally. It is set to
`info` by default, but when troubleshooting, we can ask people to run
`setGlobalLogLevel('trace')` and share more detailed logs.

In this PR, it adds a new new logs at the `trace` level:
 - All outgoing messages to the server
 - All incoming messages from the server
- After handling a server message, we log the number of triggered row
callbacks

There are also some formatting niceties to truncate large arrays and
redact fields that look like credentials.

We are also using `safe-stable-stringify` to handle some cases that
would be errors in `JSON.stringify`.

# API and ABI breaking changes

This adds the `setGlobalLogLevel` function, which is useful for
debugging.

# Expected complexity level and risk

1.5 - the only real risk here is that 

# Testing

This has some tests of formatting in `logger.test.ts`.
2026-02-20 00:36:18 +00:00
Zeke Foppa dd3f7666bc Fix template global.json under Windows (#4357)
# Description of Changes

Make the `global.json` files under `templates` into literal copies of
the root one, instead of symlinks. The symlinks were causing template
breakage when the CLI was built under windows.

# API and ABI breaking changes

None

# Expected complexity level and risk

1

# Testing

<!-- Describe any testing you've done, and any testing you'd like your
reviewers to do,
so that you're confident that all the changes work as expected! -->

- [x] Changing a template's global.json causes `cargo ci
global-json-policy` to fail
- [x] Making a template's global.json into a symlink also causes `cargo
ci global-json-policy` to fail

---------

Co-authored-by: Zeke Foppa <bfops@users.noreply.github.com>
2026-02-19 23:33:51 +00:00
Phoebe Goldman 2c8f62e019 Make Rust test clients listen for reducer errors (#4359)
# Description of Changes

Prior to this commit, if a reducer call failed during a test in the Rust
SDK test suite, the client would hang, as it generally didn't register
callbacks when invoking reducers. This could mask some bugs, causing the
tests to fail with TIMEOUT rather than a useful message. For example, we
relied on consistency between all of the test modules, which was broken
by our not having updated the C++ bindings library to use the new
case-conversion scheme. This meant that the client was sending reducer
calls with incorrect reducer names to at least one database per test
run, which would result in a `Panic` status or an `Err(Err(_))` outcome.

With this commit, the SDK test clients are updated to inspect the exit
status of reducers they invoke, and (except for intentional reducer
failures) to panic the test client when encountering a reducer error or
panic.

# API and ABI breaking changes

N/a

# Expected complexity level and risk

1

# Testing

- [x] Automated tests passed locally.
- [x] Intentionally broke reducer calls via the 2.0 WS API, causing them
to skip the call and unconditionally respond with `Status::Panic`.
Observed "loud" failures in the test suite with non-`TIMEOUT` output
that looked more debuggable to me.
2026-02-19 23:28:37 +00:00
Tyler Cloutier b2bb2180c5 Fix spacetime dev watch filtering and improve quickstart copy-paste experience (#4317)
## Summary
- Fix `spacetime dev` failing on C# projects by watching the module
directory itself instead of hardcoded `spacetimedb_dir/src/` (which
doesn't exist for C# templates)
- Add layered file-watch filtering to avoid triggering rebuilds on build
artifacts:
1. Always-ignore dirs (`target/`, `bin/`, `obj/`, `node_modules/`, etc.)
  2. Always-watch exceptions (`.env.local`, `spacetime.*.local.json`)
  3. `.gitignore` rules from global, project, and module levels
- Suppress init's generic "Next steps" message when called from
`spacetime dev`, print a dev-appropriate `cd` hint instead when a new
project is created in a subdirectory
- Update 12 quickstart docs to tell users to open a new terminal and `cd
my-spacetime-app` before running CLI commands

## Test plan
- [x] `cargo build -p spacetimedb-cli` compiles successfully
- [ ] `spacetime dev --template basic-cs` no longer errors with "Input
watch path is neither a file nor a directory"
- [ ] Modifying a `.cs` file in `spacetimedb/` triggers a rebuild
- [ ] Build artifacts in `obj/`/`bin/` do not trigger rebuilds
- [ ] Rust projects (`spacetimedb/src/` exists) continue to work as
before
- [ ] `spacetime dev --template basic-cs` from a non-project directory
prints the "Tip: cd" hint, not the generic "Next steps"
- [ ] `spacetime init` standalone still prints "Next steps" as before

---------

Co-authored-by: clockwork-labs-bot <clockwork-labs-bot@users.noreply.github.com>
Co-authored-by: Zeke Foppa <bfops@users.noreply.github.com>
2026-02-19 23:12:34 +00:00
Noa f2ab8be1d1 [TS] Improve how exceptions get rendered in messages (#4347)
# Description of Changes

This changes all types of functions to catch and process `SenderError`,
which seems like something we want to do anyway, since we have examples
of throwing `SenderError` in procedures. For that case, before:

```
The module instance encountered a fatal error: js error Uncaught API returned status 401
	at <anonymous> (src/index.ts:36:13)


```

after:
```
The module instance encountered a fatal error: API returned status 401
```
(it doesn't have the stack trace because a `SenderError` is more akin to
an error return than an exception).

Exception from procedure before:
```
The module instance encountered a fatal error: js error Uncaught TypeError: Cannot read properties of undefined (reading 'abcdef')
	at <anonymous> (src/index.ts:35:7)


```

After:
```
The module instance encountered a fatal error: Uncaught TypeError: Cannot read properties of undefined (reading 'abcdef')
	at <anonymous> (src/index.ts:35:7)
```

# Expected complexity level and risk

2

# Testing

- [x] Verified that exceptions thrown
2026-02-19 23:06:14 +00:00
Piotr Sarnacki 1a0e36e3a9 Warn about publishing DBs from non-local/non-dev spacetime.json in dev (#4350)
# Description of Changes

At the moment, we warn about using a database with a name from
`spacetime.json` in `dev`, but it only checks the root database. This PR
adds support for children, too.

# Expected complexity level and risk

2

# Testing

- [x] Added automated tests
- [x] Tested locally

With the following configs:

```json
# spacetime.json
{
  "server": "maincloud",
  "module-path": "./spacetimedb",
  "database": "main",
  "children": [{
    "database": "foo",
    "module-path": "foo"
  }, {
    "database": "bar",
    "module-path": "bar"
  }]
}
```

```json
# spacetime.local.json
{
  "children": [
    {
      "database": "foo-local"
    }
  ],
  "database": "main"
}
```

This is the output of `spacetime dev`:

```
✓ Using configuration from ./spacetime.json, ./spacetime.local.json

Starting development mode...
Databases: main, foo-local, bar
Watching for changes in 3 directories:
  - /Users/drogus/code/clockwork/spacetime-config-test/my-spacetime-app/spacetimedb
  - /Users/drogus/code/clockwork/spacetime-config-test/my-spacetime-app/foo
  - /Users/drogus/code/clockwork/spacetime-config-test/my-spacetime-app/bar
Warning: You are trying to publish databases in dev mode that were defined in the main spacetime.json file: bar
Do you want to proceed? [Y/n]
```

---------

Signed-off-by: Piotr Sarnacki <drogus@gmail.com>
Signed-off-by: Tyler Cloutier <cloutiertyler@users.noreply.github.com>
Co-authored-by: Tyler Cloutier <cloutiertyler@users.noreply.github.com>
2026-02-19 22:34:36 +00:00
John Detter 0b2462046a Update benchmark docs (#4345)
# Description of Changes

<!-- Please describe your change, mention any related tickets, and so on
here. -->

This updates the PhoenixNap config that we used for running the
benchmarks

# API and ABI breaking changes

<!-- If this is an API or ABI breaking change, please apply the
corresponding GitHub label. -->

None this is docs

# Expected complexity level and risk

None this is docs

<!--
How complicated do you think these changes are? Grade on a scale from 1
to 5,
where 1 is a trivial change, and 5 is a deep-reaching and complex
change.

This complexity rating applies not only to the complexity apparent in
the diff,
but also to its interactions with existing and future code.

If you answered more than a 2, explain what is complex about the PR,
and what other components it interacts with in potentially concerning
ways. -->

# Testing

<!-- Describe any testing you've done, and any testing you'd like your
reviewers to do,
so that you're confident that all the changes work as expected! -->

- [x] The docs are correct

---------

Signed-off-by: John Detter <4099508+jdetter@users.noreply.github.com>
2026-02-19 22:30:33 +00:00
Noa 178a7f0e60 Fix warnings in regen-cpp-moduledef (#4355)
# Description of Changes

This has been annoying me for a bit. We don't care if we use println in
a dev tool.

# Expected complexity level and risk

1

# Testing

- [x] The warnings are gone.
2026-02-19 21:34:27 +00:00
John Detter 27bb9f8edf Remove database names in quickstarts (#4354)
# Description of Changes

<!-- Please describe your change, mention any related tickets, and so on
here. -->

- For the quickstarts we don't want to pass a database name during
`spacetime dev --template ...`

# API and ABI breaking changes

<!-- If this is an API or ABI breaking change, please apply the
corresponding GitHub label. -->

None - this is just docs

# Expected complexity level and risk

None - this is just docs

<!--
How complicated do you think these changes are? Grade on a scale from 1
to 5,
where 1 is a trivial change, and 5 is a deep-reaching and complex
change.

This complexity rating applies not only to the complexity apparent in
the diff,
but also to its interactions with existing and future code.

If you answered more than a 2, explain what is complex about the PR,
and what other components it interacts with in potentially concerning
ways. -->

# Testing

<!-- Describe any testing you've done, and any testing you'd like your
reviewers to do,
so that you're confident that all the changes work as expected! -->

- [x] All quickstarts no longer pass a database name during `spacetime
dev --template ...`
2026-02-19 21:18:29 +00:00
Piotr Sarnacki d9a1ce8153 Fix publishing and generating from subdirs if config is present (#4351)
# Description of Changes

When config is present and no explicit `module-path` has been passed, we
should be resolving paths from the config and defaults relative to the
config file

# Expected complexity level and risk

2

# Testing

- [x] Tested locally
2026-02-19 19:37:20 +00:00