About spacetimedb-tables
A reference skill for designing SpacetimeDB module tables and improving access patterns. It serves developers working with TypeScript, C#, Rust, or C++ schemas, with guidance on indexing, visibility, migrations, events, and schedules.
Key features
- 01Language-specific table declaration patterns
- 02Table visibility and access guidance
- 03Index selection and performance advice
- 04Migration and column-default rules
- 05Event and schedule table guidance
Use cases
- 01Designing a SpacetimeDB module schema
- 02Choosing indexes for frequent queries
- 03Changing a published table safely
Install
Copy the command and run it in a terminal.
$
npx skills add https:/ / github.com/ danmossa/ spacetimedb-skills --skill spacetimedb-tablesAfter installing, type/spacetimedb-tablesin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
references/tables-access-permissions.mdtables-auto-increment.mdtables-column-types.mdtables-constraints.mdtables-default-values.mdtables-event-tables.mdtables-file-storage.mdtables-indexes.mdtables-performance.mdtables-schedule-tables.mdtables.mdDetails
From the project READMEUse this skill for module schema and table performance.
Core table patterns
TypeScript tables use table(options, columns) and must be passed to schema() as an object:
import { schema, table, t } from "spacetimedb/server";
const player = table(
{ name: "player", public: true },
{
id: t.u64().primaryKey().autoInc(),
identity: t.identity().unique(),
name: t.string().index("btree"),
},
);
export default schema({ player });
Language-specific table declarations:
- TypeScript:
{ name: "player_score" }createsctx.db.playerScore. - C#:
[SpacetimeDB.Table(Accessor = "Player", Public = true)]createsctx.Db.Player; the type must bepartial. - Rust:
#[spacetimedb::table(accessor = player, public)]createsctx.db.player();pub structdoes not make a table public. - C++:
SPACETIMEDB_TABLE(Type, player, Public)createsctx.db[player].
Design rules
- Organize data by access/update pattern. Split hot, frequently updated state from rarely changed profile, settings, or stats fields.
- Public tables are visible to clients through subscriptions. Keep server-only state private and expose derived subsets through views when needed.
- Primary keys and unique constraints automatically create indexes; do not add duplicate indexes for them.
- Add indexes only for frequent equality, range, subscription, or join paths. Use B-tree by default; direct indexes are for dense unsigned integer keys and are not universally supported in every language.
- New columns in existing published tables need defaults and must be appended at the end. Check database migration rules before changing existing schemas.
- Auto-increment values are generated by the database and can have gaps after failed transactions.
- Use event tables for append-only client notifications; the event flag cannot be changed after publish.
- Schedule tables need a
ScheduleAtcolumn and a linked scheduled reducer. In TypeScript, importScheduleAtfromspacetimedb, notspacetimedb/server.
Reference map
| Need | Open |
|---|---|
| Table definitions and core patterns | references/tables.md |
| Access control | references/tables-access-permissions.md |
| IDs and defaults | references/tables-auto-increment.md, references/tables-default-values.md |
| Types and constraints | references/tables-column-types.md, references/tables-constraints.md |
| Index design | references/tables-indexes.md |
| Event and schedule tables | references/tables-event-tables.md, references/tables-schedule-tables.md |
| Storage and performance | references/tables-file-storage.md, references/tables-performance.md |
Guidance
- Check migration implications in spacetimedb-databases before changing existing schemas.
- Favor indexed lookups for reducer paths that run often or touch large tables.
- Use event tables for append-only client notifications, especially when replacing reducer result callback patterns.
Comments
Markdown supported