Database Schema & Drizzle ORM
Database state is defined using Drizzle ORM with 26 schema files in apps/web/lib/db/schema/.
Schema Architecture
Section titled “Schema Architecture”apps/web/lib/db/schema/├── rbac.ts # roles, role_permissions, user_roles├── profiles.ts # User profiles & preferences├── leads.ts # Leads, deals, pipelines, stages├── contacts.ts # Contacts & organizations├── vendors.ts # Vendors & vendor_strike_logs├── tasks.ts # Tasks, subtasks, task_templates├── finance.ts # Invoices, time_entries, incentive_reports├── ai.ts # ai_chat_history, case_studies└── whatsapp.ts # whatsapp_chats, whatsapp_messagesDatabase Connection Strategy
Section titled “Database Connection Strategy”Per AGENTS.md, Neon PostgreSQL connections are split into two pools:
- Runtime Transaction Pool (
DATABASE_RUNTIME_URL): Used for standard app traffic in serverless runtimes (Vercel, Cloudflare Workers). Uses unnamed prepared statements only. - Owner System DB (
DATABASE_URL): Direct owner client used for migrations, system bootstrapping, and querying sensitive security tables (roles,role_permissions,user_roles).
Migration Workflow
Section titled “Migration Workflow”# Generate new migration files after schema editspnpm db:generate
# Execute pending migrations against target databasepnpm db:migrate[!CAUTION] Do NOT use
drizzle-kit pushdirectly against production. Always generate and apply migration scripts.
