Read rows
const rows = await db.from("todos")
.select("id, title, done")
.author(pubkey)
.eq("done", false);
const one = await db.from("todos").author(pubkey).eq("id", id).single();
const optional = await db.from("todos").author(pubkey).eq("id", id).maybeSingle();
Reads include all authors unless filtered. single() requires one row. maybeSingle() permits zero or one. More than one returns MULTIPLE_ROWS.
Insert
await db.from("todos")
.insert({ id: "task-1", title: "Write docs", done: false })
.select()
.single();
Omit id to generate a UUID. Insert detects a known existing record for this author and returns CONFLICT. This is not a cross-device uniqueness lock.
Upsert
await db.from("todos")
.upsert({ id: "task-1", title: "Revised title", done: true });
Upsert creates or replaces the entire data object. Omitted fields are removed. Use a stable ID for retries.
Update
await db.from("todos").update({ done: true }).eq("id", "task-1").select();
Update merges a patch into each matched record owned by the signer. The SDK signs one new event per record. An explicit other-author filter returns PERMISSION_DENIED.
Delete
await db.from("todos").delete().eq("id", "task-1");
Delete publishes signed requests. Relays can retain copies. Keep deletion tombstones with cached records and backups.
Bulk writes
await db.from("todos").insert([
{ id: "task-1", title: "First", done: false },
{ id: "task-2", title: "Second", done: false },
]).select();
await db.from("todos").update({ done: true }).all();
Updates and deletes need a filter or explicit .all(). Batches stop at the first failed record and can leave earlier writes committed. Inspect partial results and receipts.
Data rules
Fields must be JSON values: strings, finite numbers, booleans, null, arrays, or plain objects. id and _nostr are reserved. Dates, binary values, undefined, bigint, functions, and circular objects are rejected. Store a date as an ISO string and files as Blossom descriptors.
A full row is Row<T>: your data plus id and _nostr with pubkey, eventId, createdAt, and updatedAt. Timestamps are Unix seconds.