# Node

import { Steps, Tabs, TabItem, Code } from '@astrojs/starlight/components';
import { makeCreate } from '../../../data/data.ts'


## Minimal example


## `getting-started/node/minimal-example.ts`

```ts filename="getting-started/node/minimal-example.ts"
/** biome-ignore-all lint/correctness/noUnusedVariables: docs snippet keeps inline setup */
// ---cut---
import { makeAdapter } from '@livestore/adapter-node'
import { createStorePromise } from '@livestore/livestore'

import { schema, tables } from './livestore/schema.ts'

const adapter = makeAdapter({
  storage: { type: 'fs' },
  // sync: { backend: makeWsSync({ url: 'ws://localhost:8787' }) },
})

const main = async () => {
  const store = await createStorePromise({ adapter, schema, storeId: 'demo-store' })

  const todos = store.query(tables.todos)
  console.log(todos)
}

main().catch(() => undefined)
```

### `getting-started/node/livestore/schema.ts`

```ts filename="getting-started/node/livestore/schema.ts"
import { defineMaterializer, Events, makeSchema, Schema, State } from '@livestore/livestore'

export const tables = {
  todos: State.SQLite.table({
    name: 'todos',
    columns: {
      id: State.SQLite.text({ primaryKey: true }),
      text: State.SQLite.text(),
      completed: State.SQLite.boolean({ default: false }),
    },
  }),
} as const

export const events = {
  todoCreated: Events.synced({
    name: 'v1.TodoCreated',
    schema: Schema.Struct({ id: Schema.String, text: Schema.String }),
  }),
} as const

const materializers = State.SQLite.materializers(events, {
  [events.todoCreated.name]: defineMaterializer(events.todoCreated, ({ id, text }) =>
    tables.todos.insert({ id, text, completed: false }),
  ),
})

const state = State.SQLite.makeState({ tables, materializers })

export const schema = makeSchema({ events, state })
```

### Option A: Quick start

For a quick start, we recommend using our template app following the steps below.

{/* For existing projects, see [Existing project setup](#existing-project-setup). */}

<Steps>

1. **Set up project from template**

   <Tabs syncKey="package-manager">
     <TabItem label="bun">
       <Code code={makeCreate('node-todomvc-sync-cf', 'bunx')} lang="sh" />
     </TabItem>
     <TabItem label="pnpm">
       <Code code={makeCreate('node-todomvc-sync-cf', 'pnpm dlx')} lang="sh" />
     </TabItem>
     <TabItem label="npm">
       <Code code={makeCreate('node-todomvc-sync-cf', 'npx')} lang="sh" />
     </TabItem>
   </Tabs>

   Replace `livestore-app` with your desired app name.

2. **Install dependencies**

   It's strongly recommended to use `bun` or `pnpm` for the simplest and most reliable dependency setup (see [note on package management](/misc/package-management) for more details).

   <Tabs syncKey="package-manager">
     <TabItem label="bun">
       <Code code="bun install" lang="sh" />
     </TabItem>
     <TabItem label="pnpm">
       <Code code="pnpm install" lang="sh" />
     </TabItem>
     <TabItem label="npm">
       <Code code="npm install" lang="sh" />
     </TabItem>
   </Tabs>

   Pro tip: You can use [direnv](https://direnv.net/) to manage environment variables.

3. **Run dev environment**

   <Tabs syncKey="package-manager">
     <TabItem label="bun">
       <Code code="bun start" lang="sh" />
     </TabItem>
     <TabItem label="pnpm">
       <Code code="pnpm start" lang="sh" />
     </TabItem>
     <TabItem label="npm">
       <Code code="npm run start" lang="sh" />
     </TabItem>
   </Tabs>

</Steps>