Skip to content

Database

Schema

The schema lives at packages/server/prisma/schema.prisma. Models:

User

FieldTypeNotes
idUUIDPrimary key
emailstringUnique
namestring
deletedAtDateTime?Soft delete

ApiKey

FieldTypeNotes
keyHashstringSHA-256 of the raw key, unique
keyPrefixstringFirst 10 chars for display
revokedAtDateTime?Null = active

Team

FieldTypeNotes
slugstringUnique, auto-generated
visibilityenumPUBLIC / PRIVATE
joinPolicyenumAUTO_JOIN / APPROVAL_REQUIRED
deletedAtDateTime?Soft delete

TeamMember

FieldTypeNotes
roleenumOWNER / ADMIN / MEMBER

Unique constraint on (teamId, userId).

TeamJoinRequest

Tracks pending and reviewed join requests for teams that require approval.

TeamInvitation

Tracks invitations from an owner/admin to an existing Doto user.

Task

FieldTypeNotes
statusenumINBOX / ACCEPTED / IN_PROGRESS / DONE / REJECTED / NEEDS_CLARIFICATION
priorityenumP0 / P1 / P2 / P3
parentIdUUID?Self-relation for tree structure
depthintComputed on creation, max 4 (root = 0)
tagsstring[]Auto-populated by AI
aiClassificationJSON?{ tags, suggestedPriority, reasoning }
deletedAtDateTime?Soft delete, cascades to children

Prisma v7

Prisma 7 moves the database URL out of schema.prisma and into prisma.config.ts:

typescript
// packages/server/prisma.config.ts
import { defineConfig } from 'prisma/config';

export default defineConfig({
  schema: 'prisma/schema.prisma',
  migrations: { path: 'prisma/migrations' },
  datasource: { url: process.env.DATABASE_URL! },
});

The PrismaClient must be initialized with a driver adapter:

typescript
import { PrismaClient } from '@prisma/client';
import { PrismaPg } from '@prisma/adapter-pg';

const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL });
const prisma = new PrismaClient({ adapter });

Migrations

Create a new migration (development only):

bash
DATABASE_URL=... bun --cwd packages/server run prisma migrate dev --name <description>

Apply pending migrations (production / CI):

bash
DATABASE_URL=... bun --cwd packages/server run prisma migrate deploy

Check migration status:

bash
DATABASE_URL=... bun --cwd packages/server run prisma migrate status

In Docker, prisma migrate deploy runs automatically on container startup via scripts/entrypoint.sh.

Regenerate the client

After changing schema.prisma, regenerate the Prisma client:

bash
DATABASE_URL=... bun --cwd packages/server run prisma generate

Released under the MIT License.