| 1 | Session-based auth over JWT | Server-side revocation, no refresh token handling | Database lookup on every request |
| 2 | Shared-database multi-tenancy | Simple deployment, low cost, easy cross-client queries | No database-level isolation; relies on application-layer filtering |
| 3 | Prisma over raw SQL/TypeORM | Type safety, generated client, migration management | Vendor lock-in; less query-level control |
| 4 | better-auth over Passport.js | Modern API, less boilerplate, built-in session management | Smaller community, fewer plugins |
| 5 | React Query over Redux | Server-state caching, deduplication, background refetching | Learning curve for Redux users |
| 6 | shadcn/ui over Material UI | Accessible primitives, full Tailwind control, no bundle bloat | More manual styling work |
| 7 | Firebase Hosting over Vercel | Free tier, simple deployment | Less framework-specific optimization |
| 8 | Render over AWS/GCP | Simple deployment, free tier, good NestJS support | Cold starts, limited customization |
| 9 | Single-file Prisma schema | One source of truth, easy to review | Large file, harder to navigate |
| 10 | Client-side CSV export | No server load, instant download | Browser memory limits for large datasets |
| 11 | Thin controllers with domain services | Testable controllers, transaction-safe services | More service methods to maintain |
| 12 | Admin-role gating for the Data Import Hub | Prevents permission-OR leaks to non-admin roles holding one import permission | An admin without import permissions sees an explicit empty state |