Ir al contenido

Este documento explica las decisiones técnicas clave del proyecto y sus justificaciones.

1. Video Hosting: AWS S3 + CloudFront o Azure Blob Storage

Sección titulada «1. Video Hosting: AWS S3 + CloudFront o Azure Blob Storage»

Soportar dos proveedores de almacenamiento seleccionables mediante STORAGE_PROVIDER:

  • aws — AWS S3 + CloudFront (predeterminado)
  • azure — Azure Blob Storage
opciónProsContras
AWS S3 + CloudFrontPago por uso, escalable, CDN globalMás complejo de configurar (2 servicios)
Azure Blob StorageConfiguración más simple, SAS URLs integradasSin CDN dedicado (latencia variable)
YouTube (unlisted)Gratis, fácilSin control, ads posibles, no profesional
Vimeo ProPlayer profesional$20/mes mínimo, límites de almacenamiento
Bunny.netMás baratoMenos integración con el ecosistema
  1. Flexibilidad operativa: Cada deployment puede elegir el proveedor que mejor encaja (precio, región, acuerdos existentes)
  2. Pago por uso: ambos son ~$0.02/GB almacenamiento
  3. URLs privadas: CloudFront Signed URLs (AWS) y SAS URLs temporales (Azure) — mismo nivel de seguridad
  4. Escalable: ambos crecen automáticamente con el uso
  5. Un solo env var: cambiar de proveedor solo requiere actualizar STORAGE_PROVIDER

AWS S3 + CloudFront:

100GB videos almacenados = $2.30/mes
50GB transferencia CloudFront/mes = $4.25/mes
Total: ~$6.55/mes

Azure Blob Storage:

100GB videos almacenados = $1.80/mes (LRS)
50GB transferencia de salida/mes = ~$4.50/mes
Total: ~$6.30/mes

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

opciónProsContras
Solo suscripciónIngresos recurrentesBarrera alta para nuevos usuarios
Solo individualBaja barrera de entradaSin ingresos recurrentes
AmbosMaxima flexibilidadMás 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
PlanPreciodescripción
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.

opciónProsContras
i18n (react-intl, etc)Multi-idioma futuroComplejidad adicional
Hardcode SpanishSimple, rápidoSolo español
ParametrizableFlexibleOver-engineering
  1. Mercado objetivo: Hispanohablantes en Latinoamérica
  2. Simplicidad: Menos código, menos bugs
  3. Performance: Sin overhead de i18n
  4. Evolucion: Se puede agregar i18n después si es necesario
app/src/shared/content/es.ts
export const content = {
auth: {
login: "Iniciar sesión",
signup: "Crear Cuenta",
// ...
},
courses: {
catalog: "Catalogo de Cursos",
enroll: "Inscribirme",
// ...
},
};

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

opciónProsContras
Incluir en MVPFeature completaRetrasa lanzamiento
Post-launchLanzamiento rápidoSin comunidad inicial
Terceros (Discord)fácil, gratisFuera de la plataforma
  1. Enfoque: Primero el core (cursos + pagos)
  2. validación: 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.

opciónProsContras
PDF server-sideControl total, profesionalMás código
Imagen estáticaSimpleNo descargable
Servicio terceroMenos códigoCosto adicional, dependencia
LinkedIn certificatesintegración socialRequiere partnership
  1. Control: Diseño personalizado con branding
  2. Sin dependencias: No requiere servicios externos
  3. Descargable: Los usuarios valoran PDFs
  4. Verificable: Se puede agregar URL de verificación
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
  • documentación menos extensa que Next.js/Express
  • Comunidad más pequeña

Usar ShadCN UI (ya incluido en el, template).

  1. Copy-paste: código tuyo, no dependencia
  2. Customizable: fácil 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: fácil de desplegar
  5. Escalable: Maneja el crecimiento
model Course {
@@index([isPublished])
@@index([category])
}
model Lesson {
@@index([courseId, order])
}
model Enrollment {
@@index([userId])
@@index([courseId])
}

ÁreaDecisiónRazón Principal
VideoAWS S3 + CloudFrontYa configurado, pago por uso
PricingIndividual + SuscripciónMaxima flexibilidad
IdiomaHardcode SpanishSimplicidad
ComunidadPost-launchEnfoque en core primero
CertificadosPDF server-sideControl total
FrameworkWaspHeredado, full-stack
UIShadCNCopy-paste, customizable
DatabasePostgreSQLRobusta, Prisma