npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

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

Readme

ar-saas


Quickstart

npx ar-saas mi-proyecto

Respondé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 elegido

Personalizació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.ts

Ese 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

  1. Crear cuenta gratis en resend.com (3 000 emails/mes gratis)
  2. Ir a API Keys → "Create API Key" → copiar la key → RESEND_API_KEY
  3. Para dev: usar el dominio sandbox de Resend (solo envía a tu propio email)
  4. Para producción: agregar y verificar tu dominio en "Domains" → RESEND_FROM_EMAIL

Configurar GitHub OAuth

  1. Ir a github.com/settings/applications/new
  2. Authorization callback URL: http://localhost:3001/api/auth/github/callback
  3. Copiar Client IDGITHUB_CLIENT_ID
  4. Generar Client SecretGITHUB_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 Paulo

Docker

# docker-compose.yml generado automáticamente
# Incluye backend + frontend + MongoDB
docker compose up

Iniciar 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-proyecto

Opción B — MongoDB Atlas u otra BD remota

# Editá backend/.env y reemplazá MONGODB_URI:
MONGODB_URI=mongodb+srv://usuario:contraseñ[email protected]/mi-proyecto

2. 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/docs

3. 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/dashboard

La 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ón
  • GET /api/auth/verify-email?token= — Verificación de email
  • POST /api/auth/login — Login (setea cookies HttpOnly)
  • POST /api/auth/refresh — Refresh automático del access token
  • POST /api/auth/logout — Logout (limpia cookies)
  • POST /api/auth/forgot-password — Solicitud de reset
  • POST /api/auth/reset-password — Reset de contraseña
  • GET /api/auth/me — Datos del usuario autenticado
  • GET /api/auth/github — Inicia el flujo OAuth con GitHub
  • GET /api/auth/github/callback — Callback de GitHub
  • POST /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.