|
| 1 | +# ADR-0001: Lite profile default is Vercel + Supabase + single Next.js app |
| 2 | + |
| 3 | +Date: 2026-05-07 |
| 4 | +Status: Accepted |
| 5 | + |
| 6 | +## Context |
| 7 | + |
| 8 | +The previous bloom-system iteration carried four conflicting "what is the default stack" definitions across `prefs/prefs.yaml`, `stack/docs/stacks/vercel-stack.md`, `skills/CLAUDE.md`, and `skills/skills/vercel-saas-stack/spec.yaml`. They disagreed on package manager (npm vs pnpm), auth + db provider (Supabase vs Clerk + Neon), and monorepo strategy (Nx vs single Next app). New products bootstrapped from "bloom" got incompatible answers depending on which file was read first. |
| 9 | + |
| 10 | +A canonical default must be picked and documented in exactly one place. |
| 11 | + |
| 12 | +## Decision |
| 13 | + |
| 14 | +The lite profile, defined in [`stack.yaml`](../stack.yaml), uses: |
| 15 | + |
| 16 | +- Framework: Next.js (App Router) + TypeScript on Vercel. |
| 17 | +- Package manager: pnpm. |
| 18 | +- Auth + database: Supabase (via `@supabase/ssr`). |
| 19 | +- UI: Tailwind + shadcn/ui (copied into project), monochrome zinc palette. |
| 20 | +- Testing: Vitest (unit) + Playwright (e2e), Chromium-only by default. |
| 21 | +- Payments: Stripe (Checkout + Customer Portal). |
| 22 | +- Email: Resend. |
| 23 | +- Analytics: PostHog + Vercel Analytics + Sentry. |
| 24 | + |
| 25 | +A second profile, `full`, is preserved at [`profiles/full.yaml`](../profiles/full.yaml) for products that need ownership/portability (Nx + NestJS + Postgres-in-Docker + custom JWT). Default is lite. |
| 26 | + |
| 27 | +## Consequences |
| 28 | + |
| 29 | +**Positive**: |
| 30 | +- Time-to-first-deploy under an hour for the common case. |
| 31 | +- Single managed-services vendor for auth + db + storage (Supabase) reduces integration surface. |
| 32 | +- shadcn copied-in pattern means no runtime UI dependency. |
| 33 | +- pnpm gives strict dep resolution and disk efficiency across many side projects. |
| 34 | +- The `full` profile preserves the heavyweight thesis for the rare product that needs it, without forcing it on every bootstrap. |
| 35 | + |
| 36 | +**Negative**: |
| 37 | +- Vendor lock-in on Vercel + Supabase + Stripe. Acceptable for validation-stage products; the full profile is the escape hatch when not. |
| 38 | +- Single Next.js app is harder to split into multiple deployables if a product grows. Acceptable; that's the graduation signal for full. |
| 39 | +- pnpm installation is a one-time tax on a fresh machine. |
| 40 | + |
| 41 | +## Alternatives considered |
| 42 | + |
| 43 | +**Clerk + Neon for auth + db**: Best-in-class auth UX, but adds a second vendor and SSO/B2B-org features that the user does not yet need. Documented as the alternative path when those needs emerge. |
| 44 | + |
| 45 | +**Nx + 3-app monorepo as default**: Solves portability and team-scale problems the user does not have yet. Adds operational complexity (multiple servers, more CI surface) for negligible gain at validation stage. Preserved as the `full` profile. |
| 46 | + |
| 47 | +**npm as the package manager**: Lower mental overhead, every tutorial assumes it. But pnpm's strict resolution and disk savings compound across many side projects; Vercel's docs increasingly default to pnpm. Documented npm as the acceptable fallback when consuming external starters that hard-assume it. |
| 48 | + |
| 49 | +**Drizzle + Neon instead of Supabase native**: Drizzle is a fine ORM but pairs more naturally with Neon. With Supabase, the native client + RLS pattern is the better fit and removes one moving part. |
0 commit comments