Proyecto
Nauti Test Pro
PWA full-stack para preparación de exámenes náuticos. Construida, desplegada y operada en solitario — cubriendo diseño de producto, backend, pagos e infraestructura desde el inicio.
En producción Producto propio — en producción Fundador e Ingeniero (Full Stack — Producto, Backend, Infraestructura) Público
Proyecto propio. En producción en nautitestpro.com desde febrero de 2025.
Stack
Vue 3Ionic 7Capacitor (iOS/Android)TypeScriptViteFirebase HostingFirestoreFirebase AuthCloud FunctionsStripeResendWorkbox (PWA)GA4SentryGCP
Impacto
- Desarrollé y mantuve una plataforma SaaS en producción en solitario, cubriendo cada capa desde la UI hasta la infraestructura cloud.
- Monetización por tokens integrada con Stripe Checkout y webhooks, con historial de pagos por usuario.
- PWA con service worker Workbox — instalable en iOS y Android sin depender de ninguna tienda de apps.
- SMS MFA (autenticación multifactor de Firebase) aplicada en el login, con enrolamiento por usuario e incentivo de tokens.
- Banco de preguntas encriptado con scripts AES de pre-build para proteger el contenido propietario del examen.
- Dashboard de administración con mensajería broadcast, seguimiento de lectura por usuario, gestión de tokens y métricas de adopción de PWA.
- Audité los bancos de preguntas contra la normativa fuente y apliqué 29 de 37 correcciones documentadas — 134 ediciones sobre seis bancos en inglés y sus seis gemelos en español. En preparación de exámenes, una clave equivocada enseña lo equivocado.
Lo que hice
- Motor de tests con evaluaciones cronometradas, sets aleatorios, feedback por pregunta e historial de resultados.
- Economía de tokens: los usuarios ganan tokens verificando correo y SMS, y compran más vía Stripe.
- Cloud Functions manejan webhooks de Stripe, otorgamiento de tokens, validación de MFA y mensajes de bienvenida automáticos.
- Emails transaccionales (reseteo de contraseña, verificación de correo) enviados vía Resend con plantillas HTML personalizadas.
- Seguimiento de instalación PWA por usuario (isPWA / hasEverUsedPWA / platform) almacenado en Firestore y visible en el dashboard.
- Dominio propio (nautitestpro.com) con Firebase Hosting, Google Search Console, sitemap y meta tags SEO.
- Reglas de seguridad de Firestore que fuerzan escrituras solo de admin en subcolecciones sensibles.
- Dos correcciones se rechazaron a propósito en vez de aplicarse: una habría roto una pregunta que ya estaba bien, y otra citaba una opción que no existía bajo STCW VIII/1, así que se reescribió la opción en lugar de mover la clave.
- Toda la identidad visual se genera desde un único vector — favicon, íconos de PWA, splash, logo de correo, BIMI, imágenes para redes y el logo en Stripe —, lo que sustituyó cuatro marcas desincronizadas y un PNG de 2.2 MB que no se podía poner sobre ningún fondo.
Arquitectura
- SPA Vue 3 + Ionic, build con Vite, desplegada en Firebase Hosting con PWA (Workbox autoUpdate)
- Firestore: subcolecciones members/{uid}, messages, tokenLogs, payments, userLogs
- Firebase Auth con email/contraseña + SMS MFA (enrolamiento multifactor por usuario)
- Cloud Functions (Node.js): webhook Stripe, otorgamiento de tokens (bonus email/teléfono), triggers de ciclo de vida de miembros, envío de emails vía Resend
- Sesiones de Stripe Checkout creadas server-side; webhook fulfills saldo de tokens atómicamente vía transacción Firestore
- Script de encriptación pre-build (AES) empaqueta el banco de preguntas como .encrypted.ts — desencriptado client-side en tiempo de ejecución
Etiquetas
PWASaaSFirebaseStripeEducationMobileFull Stack
