Stack
Runtime: Node.js 20 LTS
Framework: Next.js 15 (App Router)
Language: TypeScript 5 (strict)
Auth: OAuth 2.1 + PKCE + API keys (custom, no Keycloak)
Billing: Stripe Billing Meters + webhooks
DB: PostgreSQL via Supabase (free tier)
ORM: Prisma
Cache: Upstash Redis (free tier)
Deploy: Vercel / Railway / Fly.io
Tests: Vitest, 300+ passing
Notes on the choices#
Stripe Billing Meters, not custom invoicing. Usage events are reported to Stripe and Stripe handles aggregation and invoicing, see how billing works.
Free tiers throughout. Supabase and Upstash both work on their free plans while you validate demand.
Related: quickstart, deploy.