# Description of Changes Revert the following PRs that have caused some breakage: ```a32cffa76Finish refactoring out replay (#4850)d639be0afReplay: some code motion & reuse `ReplayCommittedState` (#4849)78d6b6f7dUpdate NativeAOT-LLVM infrastructure to current ABI (#4515)d5c1738c1Better module backtraces for panics and whatnot (#577)6f23b19f3Wait for database update to become durable (#4846)81c9eab86Add `spacetime lock/unlock` to prevent accidental database deletion (#4502)809aebd7cMove field `replay_table_updated` to `ReplayCommittedState` (#4807)21b58ef99Update axum (#2713)b5cadff7aExtract replay stuff out of `CommittedState`, part 1 (#4804) ``` I also updated the Python smoketests for breakage introduced in https://github.com/clockworklabs/SpacetimeDB/pull/4502. Reverting that PR caused conflicts, so this fix is more straightforward. # API and ABI breaking changes Maybe kind of, but we haven't released any of these. # Expected complexity level and risk 1 # Testing Ask @bfops about testing --------- Co-authored-by: Zeke Foppa <bfops@users.noreply.github.com>
Get a SpacetimeDB Rust app running in under 5 minutes.
Prerequisites
- Rust installed
- SpacetimeDB CLI installed
Install the SpacetimeDB CLI before continuing.
Create your project
Run the spacetime dev command to create a new project with a Rust SpacetimeDB module.
This will start the local SpacetimeDB server, compile and publish your module, and generate Rust client bindings.
spacetime dev --template basic-rs
Explore the project structure
Your project contains both server and client code.
Edit spacetimedb/src/lib.rs to add tables and reducers. Use the generated bindings in src/module_bindings/ to build your client.
my-spacetime-app/
├── spacetimedb/ # Your SpacetimeDB module
│ ├── Cargo.toml
│ └── src/
│ └── lib.rs # Server-side logic
├── Cargo.toml
├── src/
│ ├── main.rs # Client application
│ └── module_bindings/ # Auto-generated types
└── README.md
Understand tables and reducers
Open spacetimedb/src/lib.rs to see the module code. The template includes a Person table and two reducers: add to insert a person, and say_hello to greet everyone.
Tables store your data. Reducers are functions that modify data — they're the only way to write to the database.
use spacetimedb::{ReducerContext, Table};
#[spacetimedb::table(accessor = person, public)]
pub struct Person {
name: String,
}
#[spacetimedb::reducer]
pub fn add(ctx: &ReducerContext, name: String) {
ctx.db.person().insert(Person { name });
}
#[spacetimedb::reducer]
pub fn say_hello(ctx: &ReducerContext) {
for person in ctx.db.person().iter() {
log::info!("Hello, {}!", person.name);
}
log::info!("Hello, World!");
}
Test with the CLI
Open a new terminal and navigate to your project directory. Then use the SpacetimeDB CLI to call reducers and query your data directly.
cd my-spacetime-app
# Call the add reducer to insert a person
spacetime call add Alice
# Query the person table
spacetime sql "SELECT * FROM person"
name
---------
"Alice"
# Call say_hello to greet everyone
spacetime call say_hello
# View the module logs
spacetime logs
2025-01-13T12:00:00.000000Z INFO: Hello, Alice!
2025-01-13T12:00:00.000000Z INFO: Hello, World!
Next steps
- See the Chat App Tutorial for a complete example
- Read the Rust SDK Reference for detailed API docs