Skip to main content

Getting Started

This guide walks you through the core workflows: creating a schema with models, creating items from those models, and updating item properties.

Install

# npm
npm install @seedprotocol/sdk

# yarn
yarn add @seedprotocol/sdk

# bun
bun add @seedprotocol/sdk

Prerequisites

  • Initialize the SDK client before using Schema, Model, or Item APIs. Pass your config (endpoints, filesDir, optional dbConfig) to client.init().
import { client } from '@seedprotocol/sdk'

await client.init({
config: {
endpoints: { /* your EAS endpoint */ },
filesDir: '.seed',
},
addresses: ['0x...'], // optional
})

1. Create a schema with models

A schema is a named container for models. Each model defines a set of properties (name and data type).

Create behavior (wait for ready)

Schema, Model, ModelProperty, Item, and ItemProperty each run a small state machine. Their create() methods share the same behavior:

  • Default: create() returns a Promise that resolves when the entity is ready (state machine in the idle state). You should await the result before using the entity.
  • Opt-out: Pass { waitForReady: false } as the last argument to get the entity immediately (synchronous return). Use this when you manage readiness yourself (e.g. internal loops that call waitForEntityIdle later) or when you only need a reference.
  • Timeout: When waiting, you can pass readyTimeout (milliseconds; default 5000) in the same options object, e.g. { readyTimeout: 10000 }.

So in normal app code you’ll write:

  • await Schema.create('Blog')
  • await Model.create('Post', schema, { properties })
  • await Item.create({ modelName: 'Post', schemaName: 'Blog', ... })

and use the returned instance after the promise resolves. Use { waitForReady: false } only when you explicitly want the instance without waiting.

  1. Create the schema by name: await Schema.create('Blog').
  2. Add models with await Model.create(modelName, schema, { properties }). Property definitions use dataType (e.g. 'Text', 'Number', 'Boolean', 'Date', 'Json', 'Html', 'Image', 'File', 'List', 'Relation').

Example: schema with a single model

import { Schema, Model } from '@seedprotocol/sdk'

// Create a schema. Default: waits until ready.
const schema = await Schema.create('Blog')

// Add a model with properties. Default: waits until ready.
const Post = await Model.create('Post', schema, {
properties: {
title: { dataType: 'Text' },
content: { dataType: 'Text' },
published: { dataType: 'Boolean' },
wordCount: { dataType: 'Number' },
},
})

Example: schema with multiple models

import { Schema, Model } from '@seedprotocol/sdk'

const schema = await Schema.create('MyApp')

const Article = await Model.create('Article', schema, {
properties: {
headline: { dataType: 'Text' },
body: { dataType: 'Html' },
publishedAt: { dataType: 'Date' },
},
})

const Author = await Model.create('Author', schema, {
properties: {
name: { dataType: 'Text' },
bio: { dataType: 'Text' },
},
})

You can also create a model by schema name (string) instead of a schema instance. The schema will be resolved by name:

const Post = await Model.create('Post', 'Blog', {
properties: {
title: { dataType: 'Text' },
content: { dataType: 'Text' },
},
})

2. Create an item from a model

Once a model exists, create items (data records) from it. Each item has a value for each model property. Item.create() and a model’s create() (e.g. Post.create()) also wait for the item to be ready by default; you can pass { waitForReady: false } or readyTimeout as a second argument to Item.create().

Using the model’s create method (recommended)

import { Schema, Model } from '@seedprotocol/sdk'

const schema = await Schema.create('Blog')
const Post = await Model.create('Post', schema, {
properties: {
title: { dataType: 'Text' },
content: { dataType: 'Text' },
},
})

const item = await Post.create({
title: 'My first post',
content: 'Hello, world!',
})

console.log(item.seedLocalId) // item's local id
console.log(item.title) // 'My first post'
console.log(item.content) // 'Hello, world!'

Using Item.create directly

You can create an item by passing modelName (and optional schemaName) plus property values:

import { Item } from '@seedprotocol/sdk'

const item = await Item.create({
modelName: 'Post',
schemaName: 'Blog', // optional if you have a single schema
title: 'Another post',
content: 'Some content here.',
})

3. Update properties on an item

Item properties are updated by assigning to the property on the item. The SDK syncs these changes to the database.

// Create an item
const item = await Post.create({
title: 'Draft post',
content: 'Initial content.',
})

// Update by assignment
item.title = 'Updated title'
item.content = 'Revised content.'

// Read back
console.log(item.title) // 'Updated title'
console.log(item.content) // 'Revised content.'

You can also read and update via the properties array (each element has propertyName and value):

// Find a property and update its value
const titleProp = item.properties.find((p) => p.propertyName === 'title')
if (titleProp) {
titleProp.value = 'New title'
}
console.log(item.title) // 'New title'

Full example

import { client, Schema, Model } from '@seedprotocol/sdk'

async function main() {
await client.init({
config: {
endpoints: { /* your EAS endpoint */ },
filesDir: '.seed',
},
})

const schema = await Schema.create('Blog')
const Post = await Model.create('Post', schema, {
properties: {
title: { dataType: 'Text' },
content: { dataType: 'Text' },
},
})

const item = await Post.create({
title: 'First post',
content: 'Hello!',
})

item.title = 'First post (updated)'
item.content = 'Hello, world!'

console.log(item.seedLocalId, item.title, item.content)
}

React hooks (browser)

In a React app you can use hooks for schemas, models, items, and item properties. These are exported from the main package:

  • useSchema, useSchemas, useCreateSchema, useDestroySchema
  • useModel, useModels, useCreateModel, useDestroyModel
  • useItem, useItems, useCreateItem, useDeleteItem
  • useItemProperty, useItemProperties, useCreateItemProperty, useDestroyItemProperty
  • useModelProperty, useModelProperties, useCreateModelProperty, useDestroyModelProperty

Example: create a schema and model in a component, then create and display an item and update its title.

import { useSchema, useCreateModel, useModel, useCreateItem, useItem } from '@seedprotocol/sdk'

function BlogEditor() {
const schema = useSchema('Blog')
const createModel = useCreateModel()
const Post = useModel('Post', 'Blog')
const createItem = useCreateItem()
const [itemId, setItemId] = useState<string | null>(null)
const item = useItem(itemId ?? '')

useEffect(() => {
if (!schema) return
createModel?.('Post', schema, {
properties: { title: { dataType: 'Text' }, content: { dataType: 'Text' } },
})
}, [schema])

const handleCreate = async () => {
if (!Post) return
const newItem = await Post.create({ title: 'New post', content: '' })
setItemId(newItem.seedLocalId ?? newItem.seedUid ?? null)
}

return (
<div>
<button onClick={handleCreate}>New post</button>
{item && (
<input
value={item.title ?? ''}
onChange={(e) => { item.title = e.target.value }}
/>
)}
</div>
)
}