# Storage

Choose where tasks and discussions are stored. Bud is the interface, not the database.

Bud doesn't store tasks or comments itself. A **work adapter** supplies tasks and a **thread adapter** supplies discussions: canvas pins, code comments and task discussions. The built-in Beads adapter supplies both, so with no configuration everything lives in your project's Beads workspace.

Plugins choose other stores. This keeps tasks in Beads and discussions on Git:

```ts title="bud.config.ts"
import { defineConfig } from '@bud.sh/app'
import { beads, gitComments } from '@bud.sh/app/plugins'

export default defineConfig({
  routes: ['/'],
  plugins: [beads({ only: 'work' }), gitComments()],
})
```

| Plugin          | Stores                                                 |
| --------------- | ------------------------------------------------------ |
| `beads()`       | Tasks and discussions in the project's Beads workspace |
| `gitComments()` | Discussions on the `bud/comments` Git branch           |
| `memory()`      | Tasks and discussions in memory, gone when Bud stops   |
| Your own        | See [Your own store](#your-own-store)                  |

Only one plugin may store tasks and one discussions. `storage: { work: false }` or `{ threads: false }` turns one off, and Bud never falls back to another store.

An adapter declares its fields, statuses, actions and extra sections, and Bud's interface follows: a different tracker shows its own properties in the same task pages.

## Your own store

A store is a plugin whose `work` or `threads` is an Effect layer providing `WorkAdapter` or `ThreadAdapter` from `@bud.sh/app/server`, or a function making one for the project. It runs only in Bud's server, so credentials come from environment variables and never reach the browser. Bud checks the services when it starts.

```ts title="bud.config.ts"
import { defineConfig } from '@bud.sh/app'
import { definePlugin, memory } from '@bud.sh/app/plugins'

// A tracker of your own would build its layer from WorkAdapter in @bud.sh/app/server.
const tracker = memory().work

export default defineConfig({
  routes: ['/'],
  plugins: [definePlugin({ name: 'tracker', label: 'Tracker', work: tracker })],
})
```

## Comments in Beads

Each discussion is a Beads `message` issue: hidden from `bd list` and `bd ready`, so agents' work queues stay clean, and synced with the rest of the workspace. Replies are Beads comments, resolving closes the issue and linked tasks are `related` dependencies. You can delete your own messages; a discussion's first message goes only while it's the only one, and deleting it removes the discussion.

## Moving older comments

Projects that used Bud's earlier Git storage can copy their comments into the configured discussion store:

```sh
npx bud comments migrate --dry-run
npx bud comments migrate
```

Migration keeps authors, times, statuses and anchors, skips threads it already copied and never changes the `bud/comments` branch. Keep `gitComments()` in `plugins` if you'd rather stay on Git.
