Rendering: server components by default, client components only where there is interaction, and static or incrementally regenerated pages wherever the data allows. This keeps the JavaScript bundle small and the pages fast on the phones most users actually have.
Backend: for a small product I keep the API inside Next.js route handlers and use Supabase for Postgres, auth and storage. When the product needs webhooks, queues, a mobile client or business logic that several clients share, I add a NestJS service with Prisma, BullMQ and Redis. Both are TypeScript end to end, so the types stay shared.
Data and deployment: PostgreSQL always, on Neon or Supabase for early products and on a managed instance later. Vercel for the Next.js app; Render, Fly or a container platform for NestJS; Docker for anything that must run in a client's own cloud. Every project ships with CI, automated tests and monitoring.