Files
famapp/docs/tasks/03-drizzle-postgres.md
T
ginnoir b89690a9f2 Initial scaffold: tooling, plan, task briefs
- pnpm 10 workspace + TypeScript strict + ESLint flat + Prettier
- CLAUDE.md as canonical brief
- docs/tasks/ — 22 task briefs broken out by phase for sub-sessions
- docs/decisions/ — ADR scaffold

Implements task 01 (repo-init).
2026-05-06 00:05:50 -05:00

1.5 KiB

03 — Drizzle + Postgres setup

Goal

Wire Drizzle ORM to a Postgres 16 instance, with migrations and a working db client.

Depends on

  • 02 (Next.js skeleton)

Scope

  • Install drizzle-orm, drizzle-kit, postgres (the postgres driver, not pg).
  • drizzle.config.ts pointing at src/modules/**/schema.ts and writing to ./drizzle/.
  • src/lib/db.ts exporting a singleton db client built from DATABASE_URL.
  • Initial schema in src/modules/_core/schema.ts:
    • users (id uuid pk, email unique, display_name, created_at)
    • households (id uuid pk, name, created_at)
    • household_members (household_id, user_id, role enum: owner | member, pk on both)
  • pnpm scripts: db:generate, db:migrate, db:studio.
  • docker-compose.dev.yaml at repo root with a famapp-db service for local dev (Postgres 16, exposed on 5432, named volume).

Out of scope

  • Module-specific tables (calendar/lists/notes ship in their own tasks).
  • Seed data (in task 07).

Acceptance criteria

  • docker compose -f docker-compose.dev.yaml up -d starts Postgres locally.
  • pnpm db:generate && pnpm db:migrate produces drizzle/0000_*.sql and applies it.
  • A throwaway script can import { db } from "@/lib/db" and select from users (returning empty).
  • tsc --noEmit passes.

Notes

  • Use the postgres driver — works in both Node and edge-light contexts and is what Drizzle docs prefer for serverless-shaped apps.
  • Keep the dev compose file separate from the production deploy/compose.yaml (task 05).