ar-saas 0.3.1 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +338 -314
  3. package/dist/cli.js +19 -0
  4. package/dist/generator.js +166 -55
  5. package/package.json +52 -50
  6. package/templates/backend/.env.example +67 -67
  7. package/templates/backend/.prettierrc +4 -4
  8. package/templates/backend/README.md +249 -168
  9. package/templates/backend/eslint.config.mjs +35 -35
  10. package/templates/backend/nest-cli.json +8 -8
  11. package/templates/backend/package-lock.json +10979 -10979
  12. package/templates/backend/package.json +88 -88
  13. package/templates/backend/src/app.controller.spec.ts +24 -24
  14. package/templates/backend/src/app.controller.ts +15 -15
  15. package/templates/backend/src/app.module.ts +40 -40
  16. package/templates/backend/src/app.service.ts +11 -11
  17. package/templates/backend/src/common/base/base.repository.ts +221 -221
  18. package/templates/backend/src/common/base/base.schema.ts +24 -24
  19. package/templates/backend/src/common/decorators/cookie.decorator.ts +9 -9
  20. package/templates/backend/src/common/decorators/current-user.decorator.ts +20 -20
  21. package/templates/backend/src/common/decorators/workspace-id.decorator.ts +14 -14
  22. package/templates/backend/src/common/filters/global-exception.filter.ts +61 -61
  23. package/templates/backend/src/common/guards/jwt-auth.guard.ts +5 -5
  24. package/templates/backend/src/common/interceptors/workspace-tenant.interceptor.ts +45 -45
  25. package/templates/backend/src/main.ts +51 -51
  26. package/templates/backend/src/modules/auth/auth.controller.ts +158 -158
  27. package/templates/backend/src/modules/auth/auth.module.ts +20 -20
  28. package/templates/backend/src/modules/auth/auth.service.ts +257 -257
  29. package/templates/backend/src/modules/auth/dto/forgot-password.dto.ts +9 -9
  30. package/templates/backend/src/modules/auth/dto/login.dto.ts +14 -14
  31. package/templates/backend/src/modules/auth/dto/refresh-token.dto.ts +12 -12
  32. package/templates/backend/src/modules/auth/dto/register.dto.ts +26 -26
  33. package/templates/backend/src/modules/auth/dto/reset-password.dto.ts +16 -16
  34. package/templates/backend/src/modules/auth/dto/verify-email.dto.ts +9 -9
  35. package/templates/backend/src/modules/auth/strategies/jwt.strategy.ts +43 -43
  36. package/templates/backend/src/modules/mail/mail.module.ts +9 -9
  37. package/templates/backend/src/modules/mail/mail.service.ts +141 -141
  38. package/templates/backend/src/modules/users/schemas/user.schema.ts +54 -54
  39. package/templates/backend/src/modules/users/users.module.ts +14 -14
  40. package/templates/backend/src/modules/users/users.repository.ts +51 -51
  41. package/templates/backend/src/modules/users/users.service.ts +104 -104
  42. package/templates/backend/src/modules/workspaces/schemas/workspace.schema.ts +26 -26
  43. package/templates/backend/src/modules/workspaces/workspaces.module.ts +16 -16
  44. package/templates/backend/src/modules/workspaces/workspaces.repository.ts +34 -34
  45. package/templates/backend/src/modules/workspaces/workspaces.service.ts +42 -42
  46. package/templates/backend/test/app.e2e-spec.ts +25 -25
  47. package/templates/backend/test/jest-e2e.json +9 -9
  48. package/templates/backend/tsconfig.build.json +4 -4
  49. package/templates/backend/tsconfig.json +26 -26
  50. package/templates/frontend/.env.local.example +1 -1
  51. package/templates/frontend/README.md +152 -0
  52. package/templates/frontend/components.json +20 -20
  53. package/templates/frontend/eslint.config.mjs +14 -14
  54. package/templates/frontend/next.config.ts +5 -5
  55. package/templates/frontend/package-lock.json +6722 -6722
  56. package/templates/frontend/package.json +48 -48
  57. package/templates/frontend/pnpm-lock.yaml +5012 -5012
  58. package/templates/frontend/pnpm-workspace.yaml +3 -3
  59. package/templates/frontend/postcss.config.mjs +7 -7
  60. package/templates/frontend/src/app/(auth)/forgot-password/page.tsx +84 -84
  61. package/templates/frontend/src/app/(auth)/layout.tsx +28 -28
  62. package/templates/frontend/src/app/(auth)/login/page.tsx +111 -111
  63. package/templates/frontend/src/app/(auth)/register/page.tsx +161 -161
  64. package/templates/frontend/src/app/(auth)/reset-password/page.tsx +120 -120
  65. package/templates/frontend/src/app/(auth)/verify-email/page.tsx +78 -78
  66. package/templates/frontend/src/app/(dashboard)/billing/page.tsx +111 -111
  67. package/templates/frontend/src/app/(dashboard)/dashboard/page.tsx +105 -105
  68. package/templates/frontend/src/app/(dashboard)/layout.tsx +38 -38
  69. package/templates/frontend/src/app/(dashboard)/profile/page.tsx +226 -226
  70. package/templates/frontend/src/app/(dashboard)/settings/page.tsx +156 -156
  71. package/templates/frontend/src/app/(dashboard)/team/page.tsx +178 -178
  72. package/templates/frontend/src/app/(legal)/privacy/page.tsx +127 -127
  73. package/templates/frontend/src/app/(legal)/terms/page.tsx +118 -118
  74. package/templates/frontend/src/app/globals.css +81 -81
  75. package/templates/frontend/src/app/layout.tsx +26 -26
  76. package/templates/frontend/src/app/page.tsx +5 -45
  77. package/templates/frontend/src/app/setup/page.tsx +371 -275
  78. package/templates/frontend/src/components/dashboard/header.tsx +89 -89
  79. package/templates/frontend/src/components/dashboard/sidebar.tsx +71 -71
  80. package/templates/frontend/src/components/dashboard/stat-card.tsx +34 -34
  81. package/templates/frontend/src/components/landing/faq.tsx +39 -39
  82. package/templates/frontend/src/components/landing/features.tsx +54 -54
  83. package/templates/frontend/src/components/landing/footer.tsx +76 -76
  84. package/templates/frontend/src/components/landing/hero.tsx +72 -72
  85. package/templates/frontend/src/components/landing/navbar.tsx +78 -78
  86. package/templates/frontend/src/components/landing/pricing.tsx +90 -90
  87. package/templates/frontend/src/components/ui/accordion.tsx +52 -52
  88. package/templates/frontend/src/components/ui/avatar.tsx +46 -46
  89. package/templates/frontend/src/components/ui/badge.tsx +30 -30
  90. package/templates/frontend/src/components/ui/button.tsx +52 -52
  91. package/templates/frontend/src/components/ui/card.tsx +50 -50
  92. package/templates/frontend/src/components/ui/checkbox.tsx +27 -27
  93. package/templates/frontend/src/components/ui/dialog.tsx +100 -100
  94. package/templates/frontend/src/components/ui/dropdown-menu.tsx +173 -173
  95. package/templates/frontend/src/components/ui/form.tsx +158 -158
  96. package/templates/frontend/src/components/ui/input.tsx +21 -21
  97. package/templates/frontend/src/components/ui/label.tsx +22 -22
  98. package/templates/frontend/src/components/ui/separator.tsx +25 -25
  99. package/templates/frontend/src/components/ui/skeleton.tsx +7 -7
  100. package/templates/frontend/src/components/ui/switch.tsx +28 -28
  101. package/templates/frontend/src/components/ui/tabs.tsx +54 -54
  102. package/templates/frontend/src/components/ui/textarea.tsx +20 -20
  103. package/templates/frontend/src/components/ui/toast.tsx +109 -109
  104. package/templates/frontend/src/components/ui/toaster.tsx +30 -30
  105. package/templates/frontend/src/config/site.ts +197 -197
  106. package/templates/frontend/src/hooks/use-toast.ts +116 -116
  107. package/templates/frontend/src/lib/api/auth.ts +39 -39
  108. package/templates/frontend/src/lib/api/client.ts +66 -66
  109. package/templates/frontend/src/lib/hooks/use-auth.ts +1 -1
  110. package/templates/frontend/src/lib/utils.ts +6 -6
  111. package/templates/frontend/src/providers/auth-provider.tsx +60 -60
  112. package/templates/frontend/src/types/api.ts +12 -12
  113. package/templates/frontend/src/types/auth.ts +27 -27
  114. package/templates/frontend/tsconfig.json +23 -23
package/README.md CHANGED
@@ -1,314 +1,338 @@
1
- # ar-saas
2
-
3
- <p align="center">
4
- <img src="assets/logo.png" alt="ar-saas" width="400" />
5
- </p>
6
-
7
- <p align="center">
8
- <strong>Generador de proyectos SaaS multi-tenant para startups argentinas</strong><br/>
9
- Backend NestJS + Frontend Next.js completo — landing, auth, dashboard y legal listos para producción.
10
- </p>
11
-
12
- <p align="center">
13
- <a href="https://www.npmjs.com/package/ar-saas"><img src="https://img.shields.io/npm/v/ar-saas.svg" alt="npm version" /></a>
14
- <a href="https://github.com/ignaciobecher/ar-saas/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="license" /></a>
15
- <img src="https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen" alt="node version" />
16
- </p>
17
-
18
- ---
19
-
20
- ## Quickstart
21
-
22
- ```bash
23
- npx ar-saas mi-proyecto
24
- ```
25
-
26
- Respondés algunas preguntas y en minutos tenés un proyecto completo corriendo localmente.
27
-
28
- ---
29
-
30
- ## ¿Qué genera?
31
-
32
- ```
33
- mi-proyecto/
34
- ├── backend/ # NestJS 11 + MongoDB
35
- │ ├── src/
36
- │ │ ├── modules/
37
- │ │ │ ├── auth/ # Auth completo (JWT + GitHub OAuth en cookies HttpOnly)
38
- │ │ │ ├── users/ # Usuarios con roles
39
- │ │ │ ├── workspaces/ # Multi-tenancy por workspace
40
- │ │ │ └── mail/ # Emails transaccionales con Resend
41
- │ │ └── common/ # Guards, filtros, decoradores, base repository
42
- │ ├── .env # Copiado de .env.example automáticamente
43
- │ └── package.json
44
-
45
- ├── frontend/ # Next.js 15 + Tailwind CSS 4 + shadcn/ui
46
- │ ├── src/
47
- │ │ ├── config/
48
- │ │ │ └── site.ts # ← Personalización central del SaaS
49
- │ │ ├── app/
50
- │ │ │ ├── page.tsx # Landing page completa
51
- │ │ │ ├── (auth)/ # Login, register (+términos), verify, reset
52
- │ │ │ ├── (dashboard)/ # Rutas protegidas
53
- │ │ │ │ ├── dashboard/ # Overview con stat cards
54
- │ │ │ │ ├── profile/ # Perfil de usuario + cambio de contraseña
55
- │ │ │ │ ├── settings/ # Notificaciones, workspace, zona peligrosa
56
- │ │ │ │ ├── billing/ # Plan actual, historial, upgrade
57
- │ │ │ │ └── team/ # Miembros + invitaciones
58
- │ │ │ ├── (legal)/
59
- │ │ │ │ ├── terms/ # Términos y condiciones
60
- │ │ │ │ └── privacy/ # Política de privacidad
61
- │ │ │ └── setup/ # Onboarding inicial
62
- │ │ ├── components/
63
- │ │ │ ├── landing/ # Navbar, Hero, Features, Pricing, FAQ, Footer
64
- │ │ │ ├── dashboard/ # Sidebar, Header, StatCard
65
- │ │ │ └── ui/ # 15+ componentes shadcn/ui
66
- │ │ ├── providers/ # AuthProvider con estado global
67
- │ │ └── lib/api/ # Cliente axios con refresh automático
68
- │ ├── .env.local # Copiado de .env.local.example automáticamente
69
- │ └── package.json
70
-
71
- └── railway.toml / fly.toml / docker-compose.yml
72
- ```
73
-
74
- ---
75
-
76
- ## Personalización
77
-
78
- Al generar el proyecto, el CLI pregunta el nombre, tagline, descripción y email de soporte del SaaS. Esos valores se inyectan automáticamente en un único archivo:
79
-
80
- ```
81
- frontend/src/config/site.ts
82
- ```
83
-
84
- Ese archivo es la **fuente de verdad** para todo el contenido de la app:
85
-
86
- ```ts
87
- export const siteConfig = {
88
- name: 'Mi SaaS',
89
- tagline: 'La plataforma que tu equipo necesita',
90
- description: 'Automatizá tu negocio...',
91
- supportEmail: 'hola@mi-saas.com',
92
-
93
- // Navegación de la landing
94
- nav: { links: [...] },
95
-
96
- // Secciones de la landing
97
- hero: { headline, description, cta, ctaSecondary },
98
- features: [...], // Íconos, títulos y descripciones
99
- pricing: [...], // 3 tiers con features, precios y CTAs
100
- faq: [...], // Preguntas y respuestas
101
-
102
- // Footer
103
- footer: { columns, social, copyright },
104
-
105
- // Usado en /terms y /privacy
106
- legal: { companyName, email, lastUpdated },
107
- }
108
- ```
109
-
110
- Editás ese archivo una sola vez y toda la app (landing, footer, páginas legales) queda actualizada.
111
-
112
- ---
113
-
114
- ## Stack
115
-
116
- ### Backend
117
- | Tecnología | Versión | Uso |
118
- |---|---|---|
119
- | NestJS | 11 | Framework principal |
120
- | MongoDB + Mongoose | 9 | Base de datos |
121
- | JWT (passport) | | Autenticación en cookies HttpOnly |
122
- | passport-github2 | — | OAuth con GitHub |
123
- | Resend | — | Emails transaccionales |
124
- | Swagger | — | Documentación automática en `/api/docs` |
125
-
126
- ### Frontend
127
- | Tecnología | Versión | Uso |
128
- |---|---|---|
129
- | Next.js | 15 | App Router, Server Components |
130
- | Tailwind CSS | 4 | Estilos |
131
- | shadcn/ui + Radix UI | | 15+ componentes listos (button, dialog, dropdown, tabs, accordion, avatar, switch, etc.) |
132
- | react-hook-form | — | Formularios con validación |
133
- | axios | — | HTTP client con interceptor de refresh |
134
- | lucide-react | — | Íconos |
135
-
136
- ---
137
-
138
- ## Módulos incluidos
139
-
140
- ### Frontend — siempre incluido
141
-
142
- | Sección | Contenido |
143
- |---|---|
144
- | **Landing page** | Navbar sticky, Hero con mockup, Features (6 cards), Pricing (3 tiers), FAQ (acordeón), CTA final, Footer |
145
- | **Auth** | Login, Register (con checkbox de términos), Verify email, Forgot password, Reset password |
146
- | **Dashboard** | Overview con stat cards, sidebar con navegación activa, header con avatar + dropdown |
147
- | **Perfil** | Editar nombre/email, cambiar contraseña (modal), zona de eliminación de cuenta |
148
- | **Ajustes** | Switches de notificaciones por email, configuración de workspace, zona peligrosa |
149
- | **Facturación** | Plan actual, método de pago, historial de facturas, botón de upgrade |
150
- | **Equipo** | Lista de miembros, invitar por email (modal), gestión de roles |
151
- | **Legal** | Términos y condiciones, Política de privacidad ambas enlazadas desde el footer y el register |
152
-
153
- ### Backend — siempre incluido
154
-
155
- | Módulo | Descripción |
156
- |---|---|
157
- | **Auth completo** | Registro, login, verificación de email, reset de password |
158
- | **GitHub OAuth** | Login/registro con GitHub (código de intercambio + cookies HttpOnly) |
159
- | **Multi-tenancy** | Aislamiento estricto por `workspaceId` en todas las queries |
160
- | **Mail transaccional** | Verificación, bienvenida y reset con Resend. Fail-open si Resend falla |
161
-
162
- ### Módulos opcionales
163
-
164
- | Módulo | Descripción |
165
- |---|---|
166
- | **Notificaciones** | Notificaciones in-app + Push Web (VAPID) |
167
- | **Invoices + Quotes** | Facturación con generación de PDF |
168
- | **CRM** | Kanban + Pipeline de ventas |
169
-
170
- ---
171
-
172
- ## Configuración
173
-
174
- Al ejecutar el CLI se copian automáticamente los archivos `.env.example` → `.env`.
175
-
176
- ### Backend — variables requeridas
177
-
178
- | Variable | Descripción |
179
- |---|---|
180
- | `MONGODB_URI` | URI de conexión a MongoDB |
181
- | `JWT_ACCESS_SECRET` | Secreto para access tokens (`openssl rand -hex 64`) |
182
- | `JWT_REFRESH_SECRET` | Secreto para refresh tokens (distinto al anterior) |
183
- | `RESEND_API_KEY` | API Key de [Resend](https://resend.com) |
184
- | `RESEND_FROM_EMAIL` | Email remitente verificado en Resend |
185
- | `APP_URL` | URL del frontend (para links en emails) |
186
- | `CORS_ORIGINS` | URL del frontend separada por comas |
187
- | `FRONTEND_URL` | URL del frontend para redirecciones OAuth |
188
- | `GITHUB_CLIENT_ID` | Client ID de tu GitHub OAuth App |
189
- | `GITHUB_CLIENT_SECRET` | Client Secret de tu GitHub OAuth App |
190
- | `GITHUB_CALLBACK_URL` | Callback URL registrada en GitHub |
191
-
192
- ### Frontend — variables requeridas
193
-
194
- | Variable | Descripción |
195
- |---|---|
196
- | `NEXT_PUBLIC_API_URL` | URL base del backend (ej: `http://localhost:3000`) |
197
-
198
- ---
199
-
200
- ## Deploy
201
-
202
- El CLI genera la configuración según el entorno elegido:
203
-
204
- ### Railway
205
- ```toml
206
- # railway.toml generado automáticamente
207
- [build]
208
- builder = "nixpacks"
209
-
210
- [deploy]
211
- startCommand = "npm run start:prod"
212
- healthcheckPath = "/api/health"
213
- ```
214
-
215
- ### Fly.io
216
- ```toml
217
- # fly.toml generado automáticamente
218
- app = "mi-proyecto"
219
- primary_region = "gru" # São Paulo
220
- ```
221
-
222
- ### Docker
223
- ```yaml
224
- # docker-compose.yml generado automáticamente
225
- # Incluye backend + frontend + MongoDB
226
- docker compose up
227
- ```
228
-
229
- ---
230
-
231
- ## Iniciar el proyecto generado
232
-
233
- ```bash
234
- # Backend
235
- cd mi-proyecto/backend
236
- npm install
237
- npm run start:dev
238
- # http://localhost:3000
239
- # → Swagger: http://localhost:3000/api/docs
240
-
241
- # Frontend (en otra terminal)
242
- cd mi-proyecto/frontend
243
- npm install
244
- npm run dev
245
- # http://localhost:3001 (landing page)
246
- # → http://localhost:3001/login
247
- # http://localhost:3001/dashboard
248
- ```
249
-
250
- La landing page aparece directo en `/`. El primer setup del backend se hace desde la pantalla de onboarding.
251
-
252
- ---
253
-
254
- ## Flujos de autenticación implementados
255
-
256
- - `POST /api/auth/register` Registro con email de verificación
257
- - `GET /api/auth/verify-email?token=` — Verificación de email
258
- - `POST /api/auth/login` — Login (setea cookies HttpOnly)
259
- - `POST /api/auth/refresh` — Refresh automático del access token
260
- - `POST /api/auth/logout` — Logout (limpia cookies)
261
- - `POST /api/auth/forgot-password` — Solicitud de reset
262
- - `POST /api/auth/reset-password` — Reset de contraseña
263
- - `GET /api/auth/me` — Datos del usuario autenticado
264
- - `GET /api/auth/github` — Inicia el flujo OAuth con GitHub
265
- - `GET /api/auth/github/callback` — Callback de GitHub
266
- - `POST /api/auth/github/exchange` — Canjea el código por cookies de sesión
267
-
268
- Los tokens JWT viajan **únicamente en cookies HttpOnly**. Nunca en `localStorage` ni en el body de las respuestas.
269
-
270
- ---
271
-
272
- ## Requisitos
273
-
274
- - **Node.js** 18+
275
- - **MongoDB** local o [Atlas](https://www.mongodb.com/atlas) (free tier disponible)
276
- - Cuenta en [Resend](https://resend.com) para emails (free tier: 100 emails/día)
277
-
278
- ---
279
-
280
- ## Licencia
281
-
282
- MIT © 2026 [Ignacio Becher](https://github.com/ignaciobecher)
283
-
284
- El código generado por esta herramienta es completamente tuyo, sin restricciones de uso comercial. Podés usarlo, modificarlo y distribuirlo libremente.
285
-
286
- ---
287
-
288
- ## Legal
289
-
290
- **Propiedad del código generado**
291
-
292
- Todo el código que `ar-saas` genera en tu proyecto te pertenece a vos. No reclamamos ningún derecho sobre el código generado ni sobre los productos que construyas con él.
293
-
294
- **Sin garantías**
295
-
296
- Esta herramienta se provee "tal cual" (*as is*), sin garantías de ningún tipo. No nos hacemos responsables por:
297
-
298
- - Vulnerabilidades de seguridad en el código generado si modificás la configuración por defecto
299
- - Daños directos o indirectos derivados del uso del software
300
- - Pérdida de datos o interrupciones de servicio en proyectos construidos con esta herramienta
301
-
302
- **Dependencias de terceros**
303
-
304
- El código generado incluye dependencias de terceros (NestJS, Next.js, MongoDB, etc.), cada una con su propia licencia. Es tu responsabilidad revisar y cumplir con los términos de cada dependencia en tu proyecto.
305
-
306
- **Seguridad**
307
-
308
- Si encontrás una vulnerabilidad de seguridad en esta herramienta, por favor reportala abriendo un issue en el [repositorio de GitHub](https://github.com/ignaciobecher/ar-saas) en lugar de hacerlo público.
309
-
310
- ---
311
-
312
- <p align="center">
313
- Hecho en Argentina 🇦🇷
314
- </p>
1
+ # ar-saas
2
+
3
+ <p align="center">
4
+ <img src="assets/logo.png" alt="ar-saas" width="400" />
5
+ </p>
6
+
7
+ <p align="center">
8
+ <strong>Generador de proyectos SaaS multi-tenant para startups argentinas</strong><br/>
9
+ Backend NestJS + Frontend Next.js completo — landing, auth, dashboard y legal listos para producción.
10
+ </p>
11
+
12
+ <p align="center">
13
+ <a href="https://www.npmjs.com/package/ar-saas"><img src="https://img.shields.io/npm/v/ar-saas.svg" alt="npm version" /></a>
14
+ <a href="https://github.com/ignaciobecher/ar-saas/blob/main/LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue.svg" alt="license" /></a>
15
+ <img src="https://img.shields.io/badge/node-%3E%3D18.0.0-brightgreen" alt="node version" />
16
+ </p>
17
+
18
+ ---
19
+
20
+ ## Quickstart
21
+
22
+ ```bash
23
+ npx ar-saas mi-proyecto
24
+ ```
25
+
26
+ Respondés algunas preguntas y en minutos tenés un proyecto completo corriendo localmente.
27
+
28
+ ---
29
+
30
+ ## ¿Qué genera?
31
+
32
+ ```
33
+ mi-proyecto/
34
+ ├── backend/ # NestJS 11 + MongoDB
35
+ │ ├── src/
36
+ │ │ ├── modules/
37
+ │ │ │ ├── auth/ # Auth completo (JWT + GitHub OAuth en cookies HttpOnly)
38
+ │ │ │ ├── users/ # Usuarios con roles
39
+ │ │ │ ├── workspaces/ # Multi-tenancy por workspace
40
+ │ │ │ └── mail/ # Emails transaccionales con Resend
41
+ │ │ └── common/ # Guards, filtros, decoradores, base repository
42
+ │ ├── .env # Copiado de .env.example automáticamente
43
+ │ └── package.json
44
+
45
+ ├── frontend/ # Next.js 15 + Tailwind CSS 4 + shadcn/ui
46
+ │ ├── src/
47
+ │ │ ├── config/
48
+ │ │ │ └── site.ts # ← Personalización central del SaaS
49
+ │ │ ├── app/
50
+ │ │ │ ├── page.tsx # Landing page completa
51
+ │ │ │ ├── (auth)/ # Login, register (+términos), verify, reset
52
+ │ │ │ ├── (dashboard)/ # Rutas protegidas
53
+ │ │ │ │ ├── dashboard/ # Overview con stat cards
54
+ │ │ │ │ ├── profile/ # Perfil de usuario + cambio de contraseña
55
+ │ │ │ │ ├── settings/ # Notificaciones, workspace, zona peligrosa
56
+ │ │ │ │ ├── billing/ # Plan actual, historial, upgrade
57
+ │ │ │ │ └── team/ # Miembros + invitaciones
58
+ │ │ │ ├── (legal)/
59
+ │ │ │ │ ├── terms/ # Términos y condiciones
60
+ │ │ │ │ └── privacy/ # Política de privacidad
61
+ │ │ │ └── setup/ # Onboarding inicial
62
+ │ │ ├── components/
63
+ │ │ │ ├── landing/ # Navbar, Hero, Features, Pricing, FAQ, Footer
64
+ │ │ │ ├── dashboard/ # Sidebar, Header, StatCard
65
+ │ │ │ └── ui/ # 15+ componentes shadcn/ui
66
+ │ │ ├── providers/ # AuthProvider con estado global
67
+ │ │ └── lib/api/ # Cliente axios con refresh automático
68
+ │ ├── .env.local # Copiado de .env.local.example automáticamente
69
+ │ └── package.json
70
+
71
+ ├── docker-compose.dev.yml # MongoDB local para desarrollo (Docker opcional)
72
+ └── railway.toml / fly.toml / docker-compose.yml # Config de deploy según target elegido
73
+ ```
74
+
75
+ ---
76
+
77
+ ## Personalización
78
+
79
+ Al generar el proyecto, el CLI pregunta el nombre, tagline, descripción y email de soporte del SaaS. Esos valores se inyectan automáticamente en un único archivo:
80
+
81
+ ```
82
+ frontend/src/config/site.ts
83
+ ```
84
+
85
+ Ese archivo es la **fuente de verdad** para todo el contenido de la app:
86
+
87
+ ```ts
88
+ export const siteConfig = {
89
+ name: 'Mi SaaS',
90
+ tagline: 'La plataforma que tu equipo necesita',
91
+ description: 'Automatizá tu negocio...',
92
+ supportEmail: 'hola@mi-saas.com',
93
+
94
+ // Navegación de la landing
95
+ nav: { links: [...] },
96
+
97
+ // Secciones de la landing
98
+ hero: { headline, description, cta, ctaSecondary },
99
+ features: [...], // Íconos, títulos y descripciones
100
+ pricing: [...], // 3 tiers con features, precios y CTAs
101
+ faq: [...], // Preguntas y respuestas
102
+
103
+ // Footer
104
+ footer: { columns, social, copyright },
105
+
106
+ // Usado en /terms y /privacy
107
+ legal: { companyName, email, lastUpdated },
108
+ }
109
+ ```
110
+
111
+ Editás ese archivo una sola vez y toda la app (landing, footer, páginas legales) queda actualizada.
112
+
113
+ ---
114
+
115
+ ## Stack
116
+
117
+ ### Backend
118
+ | Tecnología | Versión | Uso |
119
+ |---|---|---|
120
+ | NestJS | 11 | Framework principal |
121
+ | MongoDB + Mongoose | 9 | Base de datos |
122
+ | JWT (passport) | — | Autenticación en cookies HttpOnly |
123
+ | passport-github2 | — | OAuth con GitHub |
124
+ | Resend | — | Emails transaccionales |
125
+ | Swagger | — | Documentación automática en `/api/docs` |
126
+
127
+ ### Frontend
128
+ | Tecnología | Versión | Uso |
129
+ |---|---|---|
130
+ | Next.js | 15 | App Router, Server Components |
131
+ | Tailwind CSS | 4 | Estilos |
132
+ | shadcn/ui + Radix UI | — | 15+ componentes listos (button, dialog, dropdown, tabs, accordion, avatar, switch, etc.) |
133
+ | react-hook-form | — | Formularios con validación |
134
+ | axios | — | HTTP client con interceptor de refresh |
135
+ | lucide-react | — | Íconos |
136
+
137
+ ---
138
+
139
+ ## Módulos incluidos
140
+
141
+ ### Frontend — siempre incluido
142
+
143
+ | Sección | Contenido |
144
+ |---|---|
145
+ | **Landing page** | Navbar sticky, Hero con mockup, Features (6 cards), Pricing (3 tiers), FAQ (acordeón), CTA final, Footer |
146
+ | **Auth** | Login, Register (con checkbox de términos), Verify email, Forgot password, Reset password |
147
+ | **Dashboard** | Overview con stat cards, sidebar con navegación activa, header con avatar + dropdown |
148
+ | **Perfil** | Editar nombre/email, cambiar contraseña (modal), zona de eliminación de cuenta |
149
+ | **Ajustes** | Switches de notificaciones por email, configuración de workspace, zona peligrosa |
150
+ | **Facturación** | Plan actual, método de pago, historial de facturas, botón de upgrade |
151
+ | **Equipo** | Lista de miembros, invitar por email (modal), gestión de roles |
152
+ | **Legal** | Términos y condiciones, Política de privacidad — ambas enlazadas desde el footer y el register |
153
+
154
+ ### Backend — siempre incluido
155
+
156
+ | Módulo | Descripción |
157
+ |---|---|
158
+ | **Auth completo** | Registro, login, verificación de email, reset de password |
159
+ | **GitHub OAuth** | Login/registro con GitHub (código de intercambio + cookies HttpOnly) |
160
+ | **Multi-tenancy** | Aislamiento estricto por `workspaceId` en todas las queries |
161
+ | **Mail transaccional** | Verificación, bienvenida y reset con Resend. Fail-open si Resend falla |
162
+
163
+ ### Módulos opcionales
164
+
165
+ | Módulo | Descripción |
166
+ |---|---|
167
+ | **Notificaciones** | Notificaciones in-app + Push Web (VAPID) |
168
+ | **Invoices + Quotes** | Facturación con generación de PDF |
169
+ | **CRM** | Kanban + Pipeline de ventas |
170
+
171
+ ---
172
+
173
+ ## Configuración
174
+
175
+ Al ejecutar el CLI se copian automáticamente los archivos `.env.example` → `.env` y se precarga `MONGODB_URI` apuntando a la base de datos Docker local. Si preferís usar MongoDB Atlas u otra BD remota, reemplazá ese valor antes de iniciar el backend.
176
+
177
+ ### Backend — variables requeridas
178
+
179
+ | Variable | Descripción |
180
+ |---|---|
181
+ | `MONGODB_URI` | URI de MongoDB local (`mongodb://localhost:27017/proyecto`) o remota (Atlas, Railway, etc.) |
182
+ | `JWT_ACCESS_SECRET` | Secreto para access tokens (`openssl rand -hex 64`) |
183
+ | `JWT_REFRESH_SECRET` | Secreto para refresh tokens (distinto al anterior) |
184
+ | `RESEND_API_KEY` | API Key de [Resend](https://resend.com) |
185
+ | `RESEND_FROM_EMAIL` | Email remitente verificado en Resend |
186
+ | `APP_URL` | URL del frontend (para links en emails) |
187
+ | `CORS_ORIGINS` | URL del frontend separada por comas |
188
+ | `FRONTEND_URL` | URL del frontend para redirecciones OAuth |
189
+ | `GITHUB_CLIENT_ID` | Client ID de tu GitHub OAuth App |
190
+ | `GITHUB_CLIENT_SECRET` | Client Secret de tu GitHub OAuth App |
191
+ | `GITHUB_CALLBACK_URL` | Callback URL registrada en GitHub |
192
+
193
+ ### Frontend — variables requeridas
194
+
195
+ | Variable | Descripción |
196
+ |---|---|
197
+ | `NEXT_PUBLIC_API_URL` | URL base del backend (ej: `http://localhost:3000`) |
198
+
199
+ ---
200
+
201
+ ## Deploy
202
+
203
+ El CLI genera la configuración según el entorno elegido:
204
+
205
+ ### Railway
206
+ ```toml
207
+ # railway.toml generado automáticamente
208
+ [build]
209
+ builder = "nixpacks"
210
+
211
+ [deploy]
212
+ startCommand = "npm run start:prod"
213
+ healthcheckPath = "/api/health"
214
+ ```
215
+
216
+ ### Fly.io
217
+ ```toml
218
+ # fly.toml generado automáticamente
219
+ app = "mi-proyecto"
220
+ primary_region = "gru" # São Paulo
221
+ ```
222
+
223
+ ### Docker
224
+ ```yaml
225
+ # docker-compose.yml generado automáticamente
226
+ # Incluye backend + frontend + MongoDB
227
+ docker compose up
228
+ ```
229
+
230
+ ---
231
+
232
+ ## Iniciar el proyecto generado
233
+
234
+ ### 1. Base de datos
235
+
236
+ El CLI genera un `docker-compose.dev.yml` con MongoDB listo para desarrollo local. **Docker es opcional** — podés usar cualquier MongoDB (Atlas, Railway, etc.) cambiando `MONGODB_URI` en `backend/.env`.
237
+
238
+ **Opción A — Docker local (sin cuenta externa)**
239
+ ```bash
240
+ cd mi-proyecto
241
+ docker compose -f docker-compose.dev.yml up -d
242
+ # MongoDB corriendo en mongodb://localhost:27017/mi-proyecto
243
+ ```
244
+
245
+ **Opción B MongoDB Atlas u otra BD remota**
246
+ ```bash
247
+ # Editá backend/.env y reemplazá MONGODB_URI:
248
+ MONGODB_URI=mongodb+srv://usuario:contraseña@cluster.mongodb.net/mi-proyecto
249
+ ```
250
+
251
+ ### 2. Backend
252
+
253
+ ```bash
254
+ cd mi-proyecto/backend
255
+ npm install
256
+ # Completar variables en .env (JWT secrets, Resend, GitHub OAuth, etc.)
257
+ npm run start:dev
258
+ # http://localhost:3000
259
+ # Swagger: http://localhost:3000/api/docs
260
+ ```
261
+
262
+ ### 3. Frontend
263
+
264
+ ```bash
265
+ cd mi-proyecto/frontend
266
+ npm install
267
+ # Completar .env.local con NEXT_PUBLIC_API_URL=http://localhost:3000
268
+ npm run dev
269
+ # → http://localhost:3001 (landing page)
270
+ # → http://localhost:3001/login
271
+ # → http://localhost:3001/dashboard
272
+ ```
273
+
274
+ La landing page aparece directo en `/`. El primer setup del workspace se hace desde la pantalla de onboarding `/setup`.
275
+
276
+ ---
277
+
278
+ ## Flujos de autenticación implementados
279
+
280
+ - `POST /api/auth/register` — Registro con email de verificación
281
+ - `GET /api/auth/verify-email?token=` — Verificación de email
282
+ - `POST /api/auth/login` Login (setea cookies HttpOnly)
283
+ - `POST /api/auth/refresh` — Refresh automático del access token
284
+ - `POST /api/auth/logout` Logout (limpia cookies)
285
+ - `POST /api/auth/forgot-password` — Solicitud de reset
286
+ - `POST /api/auth/reset-password` — Reset de contraseña
287
+ - `GET /api/auth/me` — Datos del usuario autenticado
288
+ - `GET /api/auth/github` — Inicia el flujo OAuth con GitHub
289
+ - `GET /api/auth/github/callback` — Callback de GitHub
290
+ - `POST /api/auth/github/exchange` — Canjea el código por cookies de sesión
291
+
292
+ Los tokens JWT viajan **únicamente en cookies HttpOnly**. Nunca en `localStorage` ni en el body de las respuestas.
293
+
294
+ ---
295
+
296
+ ## Requisitos
297
+
298
+ - **Node.js** 18+
299
+ - **MongoDB** Docker (incluido) o [Atlas](https://www.mongodb.com/atlas) (free tier disponible)
300
+ - Cuenta en [Resend](https://resend.com) para emails (free tier: 100 emails/día)
301
+
302
+ ---
303
+
304
+ ## Licencia
305
+
306
+ MIT © 2026 [Ignacio Becher](https://github.com/ignaciobecher)
307
+
308
+ El código generado por esta herramienta es completamente tuyo, sin restricciones de uso comercial. Podés usarlo, modificarlo y distribuirlo libremente.
309
+
310
+ ---
311
+
312
+ ## Legal
313
+
314
+ **Propiedad del código generado**
315
+
316
+ Todo el código que `ar-saas` genera en tu proyecto te pertenece a vos. No reclamamos ningún derecho sobre el código generado ni sobre los productos que construyas con él.
317
+
318
+ **Sin garantías**
319
+
320
+ Esta herramienta se provee "tal cual" (*as is*), sin garantías de ningún tipo. No nos hacemos responsables por:
321
+
322
+ - Vulnerabilidades de seguridad en el código generado si modificás la configuración por defecto
323
+ - Daños directos o indirectos derivados del uso del software
324
+ - Pérdida de datos o interrupciones de servicio en proyectos construidos con esta herramienta
325
+
326
+ **Dependencias de terceros**
327
+
328
+ El código generado incluye dependencias de terceros (NestJS, Next.js, MongoDB, etc.), cada una con su propia licencia. Es tu responsabilidad revisar y cumplir con los términos de cada dependencia en tu proyecto.
329
+
330
+ **Seguridad**
331
+
332
+ Si encontrás una vulnerabilidad de seguridad en esta herramienta, por favor reportala abriendo un issue en el [repositorio de GitHub](https://github.com/ignaciobecher/ar-saas) en lugar de hacerlo público.
333
+
334
+ ---
335
+
336
+ <p align="center">
337
+ Hecho en Argentina 🇦🇷
338
+ </p>