Total monthly infrastructure cost at launch was designed to stay near free-tier levels. The stack remains India-first (DPDP, IST, paise, GST 18%) and optimized so one developer can operate it with minimal overhead. CloudFront provides application edge delivery; Cloudflare remains DNS and R2 storage only.
The Stack by Layer
Browse each layer of the platform. Every choice below is in production use.- Core & UI
- Data & Auth
- Infrastructure
- Email
- Testing & Quality
- Observability
- CRM & Leads
Why shadcn/ui: components are copy-pasted into your repo — you own 100% of the code. Built on Radix UI primitives for production-tested accessibility, with zero runtime overhead.
Design Principles
- Lighthouse gates: performance ≥ 95; accessibility, best practices, and SEO = 100
- Premium feel — rich, high-end aesthetic matching the brand
- CloudFront-backed delivery — static assets served near users; dynamic requests route to Lambda
- Single developer — tooling must minimise ops overhead
- ₹0/month at launch — every service on a free tier
Technology Decision Log
Key decisions where alternatives were seriously considered. Expand each to see what was rejected and why.Auth → Better Auth (rejected: Clerk, Auth.js)
Auth → Better Auth (rejected: Clerk, Auth.js)
Self-hosted, the Google consent screen shows your domain, and it ships a built-in RBAC plugin. Clerk and Auth.js were rejected on hosting/branding and missing native RBAC.
ORM → Drizzle (rejected: Prisma)
ORM → Drizzle (rejected: Prisma)
Drizzle is pure TypeScript with no runtime query-engine binary, keeping Lambda packaging small and the data layer portable across AWS, local development, and the Render CMS.
Database → Neon (rejected: Supabase, PlanetScale)
Database → Neon (rejected: Supabase, PlanetScale)
Git-like branching (10 free branches), serverless scale-to-zero, and all scheduled work driven via QStash HTTP routes.
Compute → AWS Lambda + CloudFront through SST
Compute → AWS Lambda + CloudFront through SST
apps/web and apps/admin each deploy as an SST sst.aws.Nextjs component. OpenNext packages the application, Lambda runs SSR/API compute, and CloudFront delivers each app. Cloudflare remains authoritative DNS and R2 storage; Payload CMS stays on Render and invoicing stays on Cloud Run.Realtime → Ably (rejected: Pusher)
Realtime → Ably (rejected: Pusher)
6M messages/mo free versus Pusher’s 200k/day.
Analytics → PostHog (rejected: Google Analytics)
Analytics → PostHog (rejected: Google Analytics)
DPDP Act concerns with GA. PostHog offers 1M events/mo plus feature flags.
Linting → Biome (rejected: ESLint + Prettier)
Linting → Biome (rejected: ESLint + Prettier)
~100x faster, a single config file, and native TypeScript support.
Related Pages
Architecture
How these technologies fit together as a layered monorepo
Data Model
The 38-table Drizzle schema running on Neon
System Design
High-level and low-level design documents
