Skip to content

Este documento explica las decisiones tecnicas clave del proyecto y sus justificaciones.

Usar AWS S3 para almacenamiento y CloudFront para distribucion de videos.

OpcionProsContras
AWS S3 + CloudFrontPago por uso, escalable, ya configuradoMas complejo de configurar
YouTube (unlisted)Gratis, facilSin control, ads posibles, no profesional
Vimeo ProPlayer profesional$20/mes minimo, limites de almacenamiento
Bunny.netMas baratoMenos integracion AWS
  1. Ya configurado: El proyecto usa S3 para file uploads
  2. Pago por uso: ~$0.023/GB almacenamiento + ~$0.085/GB transferencia
  3. Escalable: Crece automaticamente con el uso
  4. Control total: URLs firmadas para contenido privado
  5. Global: CloudFront tiene edge locations en Latinoamerica
100GB videos almacenados = $2.30/mes
50GB transferencia/mes = $4.25/mes
Total: ~$6.55/mes

2. Pricing Model: Individual + Suscripcion

Section titled “2. Pricing Model: Individual + Suscripcion”

Ofrecer tanto compra individual de cursos como suscripciones mensuales/anuales.

OpcionProsContras
Solo suscripcionIngresos recurrentesBarrera alta para nuevos usuarios
Solo individualBaja barrera de entradaSin ingresos recurrentes
AmbosMaxima flexibilidadMas complejo de implementar
  1. Conversion: Cursos individuales para usuarios casuales
  2. Retencion: Suscripciones para usuarios comprometidos
  3. Descuento anual: Incentiva compromiso a largo plazo
  4. Stripe: Ya soporta ambos modelos sin costo adicional
PlanPrecioDescripcion
Curso Individual$29-99Acceso de por vida al curso
Mensual$19/mesAcceso a todos los cursos
Anual$149/ano~35% descuento vs mensual

Hardcodear todo el contenido en español en lugar de usar i18n.

OpcionProsContras
i18n (react-intl, etc)Multi-idioma futuroComplejidad adicional
Hardcode SpanishSimple, rapidoSolo español
ParametrizableFlexibleOver-engineering
  1. Mercado objetivo: Hispanohablantes en Latinoamerica
  2. Simplicidad: Menos codigo, menos bugs
  3. Performance: Sin overhead de i18n
  4. Evolucion: Se puede agregar i18n despues si es necesario
app/src/shared/content/es.ts
export const content = {
auth: {
login: "Iniciar Sesion",
signup: "Crear Cuenta",
// ...
},
courses: {
catalog: "Catalogo de Cursos",
enroll: "Inscribirme",
// ...
},
};

No incluir features de comunidad (foros, Q&A) en el MVP.

OpcionProsContras
Incluir en MVPFeature completaRetrasa lanzamiento
Post-launchLanzamiento rapidoSin comunidad inicial
Terceros (Discord)Facil, gratisFuera de la plataforma
  1. Enfoque: Primero el core (cursos + pagos)
  2. Validacion: Verificar que hay usuarios antes de construir comunidad
  3. Complejidad: Foros requieren moderacion, notificaciones, etc.
  4. Alternativa temporal: Discord/Slack para early adopters
  1. Lanzar MVP (Fases 1-7)
  2. Conseguir primeros 100 usuarios
  3. Validar necesidad de comunidad
  4. Implementar Fase 8 si hay demanda

Generar certificados como PDFs en el servidor.

OpcionProsContras
PDF server-sideControl total, profesionalMas codigo
Imagen estaticaSimpleNo descargable
Servicio terceroMenos codigoCosto adicional, dependencia
LinkedIn certificatesIntegracion socialRequiere partnership
  1. Control: Diseno personalizado con branding
  2. Sin dependencias: No requiere servicios externos
  3. Descargable: Los usuarios valoran PDFs
  4. Verificable: Se puede agregar URL de verificacion
server/certificates.ts
import PDFDocument from "pdfkit";
export async function generateCertificatePDF({
userName,
courseName,
completionDate,
}: CertificateData): Promise<string> {
const doc = new PDFDocument();
// ... generar PDF
// Subir a S3
// Retornar URL
}

Mantener Wasp como framework (heredado del template Open SaaS).

  1. Full-stack: Frontend + Backend + DB en un solo lugar
  2. Type-safe: Tipos generados automaticamente
  3. Auth built-in: Email/password, OAuth, etc.
  4. Operations: Queries/Actions con cache automatico
  5. Jobs: Cron jobs integrados (PgBoss)
  • Curva de aprendizaje para nuevo framework
  • Documentacion menos extensa que Next.js/Express
  • Comunidad mas pequena

Usar ShadCN UI (ya incluido en el template).

  1. Copy-paste: Codigo tuyo, no dependencia
  2. Customizable: Facil de modificar
  3. Tailwind-based: Consistente con el resto del proyecto
  4. Accessible: Basado en Radix UI primitives
  5. 22+ componentes: Button, Card, Dialog, Table, etc.
  • Card (CourseCard)
  • Progress (ProgressRing)
  • Dialog (modals)
  • Table (admin tables)
  • Form (formularios)

Mantener PostgreSQL (heredado del template).

  1. Robusta: Soporte para relaciones complejas
  2. Prisma: ORM excelente con tipos
  3. PgBoss: Jobs usando la misma DB
  4. Fly.io: Facil de desplegar
  5. Escalable: Maneja el crecimiento
model Course {
@@index([isPublished])
@@index([category])
}
model Lesson {
@@index([courseId, order])
}
model Enrollment {
@@index([userId])
@@index([courseId])
}

AreaDecisionRazon Principal
VideoAWS S3 + CloudFrontYa configurado, pago por uso
PricingIndividual + SuscripcionMaxima flexibilidad
IdiomaHardcode SpanishSimplicidad
ComunidadPost-launchEnfoque en core primero
CertificadosPDF server-sideControl total
FrameworkWaspHeredado, full-stack
UIShadCNCopy-paste, customizable
DatabasePostgreSQLRobusta, Prisma