ar-saas
v0.5.8
Published
Generador de proyectos SaaS multi-tenant para startups argentinas. Landing page, auth, dashboard y legal listos para producción.
Downloads
2,137
Maintainers
Readme
ar-saas
Quickstart
npx ar-saas mi-proyectoRespondés algunas preguntas y en minutos tenés un proyecto completo corriendo localmente.
¿Qué genera?
mi-proyecto/
├── backend/ # NestJS 11 + MongoDB
│ ├── src/
│ │ ├── modules/
│ │ │ ├── auth/ # Auth completo (JWT + GitHub OAuth en cookies HttpOnly)
│ │ │ ├── users/ # Usuarios con roles
│ │ │ ├── workspaces/ # Multi-tenancy por workspace
│ │ │ └── mail/ # Emails transaccionales con Resend
│ │ └── common/ # Guards, filtros, decoradores, base repository
│ ├── .env # Copiado de .env.example automáticamente
│ └── package.json
│
├── frontend/ # Next.js 15 + Tailwind CSS 4 + shadcn/ui
│ ├── src/
│ │ ├── config/
│ │ │ └── site.ts # ← Personalización central del SaaS
│ │ ├── app/
│ │ │ ├── page.tsx # Landing page completa
│ │ │ ├── (auth)/ # Login, register (+términos), verify, reset
│ │ │ ├── (dashboard)/ # Rutas protegidas
│ │ │ │ ├── dashboard/ # Overview con stat cards
│ │ │ │ ├── profile/ # Perfil de usuario + cambio de contraseña
│ │ │ │ ├── settings/ # Notificaciones, workspace, zona peligrosa
│ │ │ │ ├── billing/ # Plan actual, historial, upgrade
│ │ │ │ └── team/ # Miembros + invitaciones
│ │ │ ├── (legal)/
│ │ │ │ ├── terms/ # Términos y condiciones
│ │ │ │ └── privacy/ # Política de privacidad
│ │ │ └── setup/ # Onboarding inicial
│ │ ├── components/
│ │ │ ├── landing/ # Navbar, Hero, Features, Pricing, FAQ, Footer
│ │ │ ├── dashboard/ # Sidebar, Header, StatCard
│ │ │ └── ui/ # 15+ componentes shadcn/ui
│ │ ├── providers/ # AuthProvider con estado global
│ │ └── lib/api/ # Cliente axios con refresh automático
│ ├── .env.local # Copiado de .env.local.example automáticamente
│ └── package.json
│
├── docker-compose.dev.yml # MongoDB local para desarrollo (Docker opcional)
└── railway.toml / fly.toml / docker-compose.yml # Config de deploy según target elegidoPersonalización
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:
frontend/src/config/site.tsEse archivo es la fuente de verdad para todo el contenido de la app:
export const siteConfig = {
name: 'Mi SaaS',
tagline: 'La plataforma que tu equipo necesita',
description: 'Automatizá tu negocio...',
supportEmail: '[email protected]',
// Navegación de la landing
nav: { links: [...] },
// Secciones de la landing
hero: { headline, description, cta, ctaSecondary },
features: [...], // Íconos, títulos y descripciones
pricing: [...], // 3 tiers con features, precios y CTAs
faq: [...], // Preguntas y respuestas
// Footer
footer: { columns, social, copyright },
// Usado en /terms y /privacy
legal: { companyName, email, lastUpdated },
}Editás ese archivo una sola vez y toda la app (landing, footer, páginas legales) queda actualizada.
Stack
Backend
| Tecnología | Versión | Uso |
|---|---|---|
| NestJS | 11 | Framework principal |
| MongoDB + Mongoose | 9 | Base de datos |
| JWT (passport) | — | Autenticación en cookies HttpOnly |
| passport-github2 | — | OAuth con GitHub |
| Resend | — | Emails transaccionales |
| Swagger | — | Documentación automática en /api/docs |
Frontend
| Tecnología | Versión | Uso | |---|---|---| | Next.js | 15 | App Router, Server Components | | Tailwind CSS | 4 | Estilos | | shadcn/ui + Radix UI | — | 15+ componentes listos (button, dialog, dropdown, tabs, accordion, avatar, switch, etc.) | | react-hook-form | — | Formularios con validación | | axios | — | HTTP client con interceptor de refresh | | lucide-react | — | Íconos |
Módulos incluidos
Frontend — siempre incluido
| Sección | Contenido | |---|---| | Landing page | Navbar sticky, Hero con mockup, Features (6 cards), Pricing (3 tiers), FAQ (acordeón), CTA final, Footer | | Auth | Login, Register (con checkbox de términos), Verify email, Forgot password, Reset password | | Dashboard | Overview con stat cards, sidebar con navegación activa, header con avatar + dropdown | | Perfil | Editar nombre/email, cambiar contraseña (modal), zona de eliminación de cuenta | | Ajustes | Switches de notificaciones por email, configuración de workspace, zona peligrosa | | Facturación | Plan actual, método de pago, historial de facturas, botón de upgrade | | Equipo | Lista de miembros, invitar por email (modal), gestión de roles | | Legal | Términos y condiciones, Política de privacidad — ambas enlazadas desde el footer y el register |
Backend — siempre incluido
| Módulo | Descripción |
|---|---|
| Auth completo | Registro, login, verificación de email, reset de password |
| GitHub OAuth | Login/registro con GitHub (código de intercambio + cookies HttpOnly) |
| Multi-tenancy | Aislamiento estricto por workspaceId en todas las queries |
| Mail transaccional | Verificación, bienvenida y reset con Resend. Fail-open si Resend falla |
Módulos opcionales
| Módulo | Descripción | |---|---| | Notificaciones | Notificaciones in-app + Push Web (VAPID) | | Invoices + Quotes | Facturación con generación de PDF | | CRM | Kanban + Pipeline de ventas |
Configuración
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.
Mínimo para arrancar
Solo 4 variables son necesarias para tener el sistema funcionando con registro, login y dashboard completo:
| Variable | Descripción |
|---|---|
| MONGODB_URI | URI de MongoDB — local (mongodb://localhost:27017/proyecto) o remota |
| JWT_ACCESS_SECRET | Secreto para access tokens (openssl rand -hex 64) |
| JWT_REFRESH_SECRET | Secreto para refresh tokens (distinto al anterior) |
| CORS_ORIGINS | URL del frontend: http://localhost:3000 |
Y en el frontend:
| Variable | Descripción |
|---|---|
| NEXT_PUBLIC_API_URL | URL base del backend (ej: http://localhost:3001) |
Sin Resend configurado: el registro auto-verifica el email y el usuario puede loguearse directamente. No se envía ningún email. Perfecto para desarrollo y demos.
Funcionalidades que requieren configuración adicional
| Funcionalidad | Variables necesarias | Cómo configurar |
|---|---|---|
| Verificación de email y reset de contraseña | RESEND_API_KEY, RESEND_FROM_EMAIL, APP_URL | Crear cuenta gratis en resend.com |
| Login con GitHub | GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET, GITHUB_CALLBACK_URL, FRONTEND_URL | Crear OAuth App en github.com/settings/applications/new |
Configurar emails con Resend
- Crear cuenta gratis en resend.com (3 000 emails/mes gratis)
- Ir a API Keys → "Create API Key" → copiar la key →
RESEND_API_KEY - Para dev: usar el dominio sandbox de Resend (solo envía a tu propio email)
- Para producción: agregar y verificar tu dominio en "Domains" →
RESEND_FROM_EMAIL
Configurar GitHub OAuth
- Ir a github.com/settings/applications/new
- Authorization callback URL:
http://localhost:3001/api/auth/github/callback - Copiar Client ID →
GITHUB_CLIENT_ID - Generar Client Secret →
GITHUB_CLIENT_SECRET
Deploy
El CLI genera la configuración según el entorno elegido:
Railway
# railway.toml generado automáticamente
[build]
builder = "nixpacks"
[deploy]
startCommand = "npm run start:prod"
healthcheckPath = "/api/health"Fly.io
# fly.toml generado automáticamente
app = "mi-proyecto"
primary_region = "gru" # São PauloDocker
# docker-compose.yml generado automáticamente
# Incluye backend + frontend + MongoDB
docker compose upIniciar el proyecto generado
1. Base de datos
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.
Opción A — Docker local (sin cuenta externa)
cd mi-proyecto
docker compose -f docker-compose.dev.yml up -d
# MongoDB corriendo en mongodb://localhost:27017/mi-proyectoOpción B — MongoDB Atlas u otra BD remota
# Editá backend/.env y reemplazá MONGODB_URI:
MONGODB_URI=mongodb+srv://usuario:contraseñ[email protected]/mi-proyecto2. Backend
cd mi-proyecto/backend
npm install
# Mínimo obligatorio: JWT_ACCESS_SECRET, JWT_REFRESH_SECRET, CORS_ORIGINS
# Opcional para emails: RESEND_API_KEY, RESEND_FROM_EMAIL, APP_URL
# Opcional para GitHub OAuth: GITHUB_CLIENT_ID, GITHUB_CLIENT_SECRET, etc.
npm run start:dev
# → http://localhost:3001
# → Swagger: http://localhost:3001/api/docs3. Frontend
cd mi-proyecto/frontend
npm install
# Completar .env.local con NEXT_PUBLIC_API_URL=http://localhost:3000
npm run dev
# → http://localhost:3001 (landing page)
# → http://localhost:3001/login
# → http://localhost:3001/dashboardLa landing page aparece directo en /. El primer setup del workspace se hace desde la pantalla de onboarding /setup.
Flujos de autenticación implementados
POST /api/auth/register— Registro con email de verificaciónGET /api/auth/verify-email?token=— Verificación de emailPOST /api/auth/login— Login (setea cookies HttpOnly)POST /api/auth/refresh— Refresh automático del access tokenPOST /api/auth/logout— Logout (limpia cookies)POST /api/auth/forgot-password— Solicitud de resetPOST /api/auth/reset-password— Reset de contraseñaGET /api/auth/me— Datos del usuario autenticadoGET /api/auth/github— Inicia el flujo OAuth con GitHubGET /api/auth/github/callback— Callback de GitHubPOST /api/auth/github/exchange— Canjea el código por cookies de sesión
Los tokens JWT viajan únicamente en cookies HttpOnly. Nunca en localStorage ni en el body de las respuestas.
Requisitos
- Node.js 18+
- MongoDB — Docker (incluido) o Atlas (free tier disponible)
- Resend (opcional) — solo si querés emails de verificación y reset de contraseña. Sin configurarlo, el registro funciona igual: el email se auto-verifica y el usuario puede loguearse directo.
Licencia
MIT © 2026 Ignacio Becher
El código generado por esta herramienta es completamente tuyo, sin restricciones de uso comercial. Podés usarlo, modificarlo y distribuirlo libremente.
Legal
Propiedad del código generado
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.
Sin garantías
Esta herramienta se provee "tal cual" (as is), sin garantías de ningún tipo. No nos hacemos responsables por:
- Vulnerabilidades de seguridad en el código generado si modificás la configuración por defecto
- Daños directos o indirectos derivados del uso del software
- Pérdida de datos o interrupciones de servicio en proyectos construidos con esta herramienta
Dependencias de terceros
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.
Seguridad
Si encontrás una vulnerabilidad de seguridad en esta herramienta, por favor reportala abriendo un issue en el repositorio de GitHub en lugar de hacerlo público.
