Bienvenida
Un boilerplate listo para producción con Bun + Express + Prisma + Next.js, capas DDD, BetterAuth, billing, observabilidad y un design system UseDeploy.
Qué es esto
Un starter SaaS opinado construido alrededor de cuatro restricciones:
- Domain-Driven Design, aplicado por ESLint —
domain/no puede importarexpress,@prisma/client, ni nada desdeapplication//infrastructure/. - Auth basada en cookies vía BetterAuth (sessions persistidas en Postgres, magic link, Google OAuth, organizaciones).
- Billing agnóstico al proveedor — Stripe, Mercado Pago y Polar comparten una única interfaz
PaymentProvider. - Contratos tipados de punta a punta — los schemas de Zod en
@app/contractsson la única fuente de verdad; la spec de OpenAPI se regenera y se commitea con cada cambio de endpoint.
Qué viene cableado
| Capacidad | Dónde vive | Notas |
|---|---|---|
| Servidor HTTP | apps/server/src/index.ts | OTel arranca primero, luego Express, luego las rutas |
| Módulos DDD | apps/server/src/modules/<context>/ | iam, billing, tenancy, notifications, storage, audit, feature-flags |
| RBAC | packages/shared/src/permissions/ | Strings resource:action, middleware requirePermission(p) |
| Background jobs | apps/server/src/infrastructure/jobs/ | BullMQ, UI de Bull Board en /admin/queues |
| Eventos de dominio | apps/server/src/infrastructure/events/event-bus.ts | Bus en memoria, los listeners se enganchan en bootstrap |
| Storage | apps/server/src/modules/storage/ | Providers null / local / s3 / uploadthing |
| Rate limiting | apps/server/src/infrastructure/http/rate-limit.ts | Limiters por tier memoizados con prefijos de Redis separados |
| Observabilidad | apps/server/src/infrastructure/observability/ | OTel + Prometheus /metrics, Sentry server (@sentry/bun) |
| Frontend | apps/client/ | Next 16, Tailwind v4, Fumadocs, design system UseDeploy en components/brand/* |
Recorrido en 30 segundos
git clone <repo> my-saas
cd my-saas
bun install
cp apps/server/.env.example apps/server/.env
bunx prisma migrate dev --schema apps/server/prisma/schema.prisma
bun run dev # client :3004, server :3005, docs en /docsEl mínimo de env para arrancar: BETTER_AUTH_SECRET, BETTER_AUTH_URL, DATABASE_URL, CORS_ORIGINS. Cada adapter opcional (Sentry, OTel, S3, UploadThing, Redis) arranca como no-op cuando su configuración está sin definir.
Hacia dónde seguir
- Si recién llegás: Primeros pasos → Estructura del proyecto → Entorno.
- Si vas a construir una feature: Cómo hacer: agregar una nueva feature.
- Si vas a tocar la UI: Tokens del frontend y primitives.
- Si necesitás entender por qué algo es como es: Arquitectura y Bounded contexts.