Profe AI es una aplicación web interactiva diseñada para ayudar a estudiantes a aprender español mediante lecciones estructuradas, práctica de pronunciación (TTS), cuestionarios y conversaciones dinámicas impulsadas por Inteligencia Artificial.
🚀 Prueba la aplicación aquí: profeai.onrender.com
| Estudio (Frases) | Evaluación (Quiz) | Diálogos AI |
|---|---|---|
![]() |
![]() |
![]() |
| Generador AI | Chat Interactivo | Perfil Estudiante |
![]() |
![]() |
![]() |
- Tutoría con IA: Conversación fluida y natural impulsada por Google Gemini.
- 📚 Lecciones Dinámicas: Contenido gestionado en Firestore que permite actualizaciones sin redesepliegue.
- 🗣️ Texto a Voz (TTS) Premium: Prioriza Amazon Polly y ElevenLabs para una voz natural, con fallback automático a Google Cloud y Web Speech API.
- 🤖 Tutor de IA (Roleplay): Practica situaciones reales (ej. "En el restaurante") con un tutor de IA que se adapta a tu nivel.
- 👨⚕️ Doctor Gramática: Análisis gramatical con validación robusta (Zod).
- 🔄 Contenido Fresco Automático: Script robusto (Github Actions) que genera nuevas frases y quizzes cada 2 semanas usando Gemini 2.0, con estrategias de fallback y backoff para maximizar la disponibilidad en cuentas gratuitas.
- 🔒 Seguridad Reforzada: Protección con Helmet.js (CSP), HTTPS automático (Let's Encrypt), y gestión de vulnerabilidades vía Snyk con actualizaciones de dependencias y overrides a nivel monorepo.
- 💬 Modo Conversación Híbrido: Chat de texto y voz fluido.
- ✅ Seguimiento de Progreso: Visualiza tu avance por semanas y niveles (con opción de reinicio completo).
- ♿ Accesibilidad y Heurística (UX):
- Navegación por Teclado: Uso completo sin ratón (Tab, Enter, Escape).
- Lectores de Pantalla: Etiquetas ARIA descriptivas en todos los botones.
- Indicadores de Estado: Animaciones de "Pensando..." durante la generación de IA para reducir la espera percibida.
- ⚡ Rendimiento Avanzado:
- Lazy Loading: Carga progresiva de páginas para un inicio instantáneo.
- AI Model Reporting: El sistema informa en consola exactamente qué modelo está respondiendo (ej: "Gemini 2.5 Flash Lite").
- Estrategia Accionable: Uso de Gemini 2.5 Flash Lite con Sequential Fallback a Gemini 2.5 Flash y Gemini 1.5 para maximizar la disponibilidad y ahorrar cuota.
- 📱 Diseño Mobile-First: Interfaz totalmente adaptativa con navegación optimizada (menú lateral) y visuales centrados para una experiencia premium en dispositivos móviles.
- 🎙️ Widget de IA Mejorado: Widget de ElevenLabs perfectamente integrado en el header, optimizado para no obstruir el contenido y garantizando visibilidad total durante la conversación.
- 🔐 Autenticación Profesional (Sincronizada):
- Estado Global (Unified Auth): Implementado con Context API para asegurar una sesión única en toda la app.
- Recuérdame: Soporte real para persistencia de sesión (
LOCALvsSESSION). - Recuperación de Contraseña: Flujo completo de recuperación vía email.
- Login con Google: Acceso rápido y seguro con un solo clic.
- Validación Estricta: Registro seguro y detección inteligente de cuentas existentes.
El proyecto está organizado como un npm workspace para separar claramente las responsabilidades:
- Frontend (
/frontend): React, Vite, Tailwind CSS. - Backend (
/backend): Node.js, Express, Helmet.js, Genkit.
- Base de Datos: Firebase Firestore & Authentication.
- IA & Servicios: LangChain, Genkit, OpenAI, Gemini 2.5, Amazon Polly, Google Cloud TTS, ElevenLabs, Tavily.
- Calidad: Sentry, Playwright, Vitest, Lighthouse.
-
Instalar dependencias (desde la raíz):
npm install
-
Configurar variables de entorno: Crea un archivo
.enven la raíz (ver.env.example). -
Ejecución con Scripts de Workspace:
npm run dev: Lanza frontend y backend simultáneamente.npm run frontend:dev: Inicia solo el cliente web.npm run frontend:build: Compila la aplicación para producción.npm run frontend:preview: Sirve la versión compilada enhttp://localhost:3001(útil para E2E).npm run backend:dev: Inicia solo el servidor API.
-
Cargar Contenido (Seed): Sube las lecciones iniciales desde los archivos JSON locales a Firestore.
[!IMPORTANT] Requiere un archivo
service-account.jsonen la raíz que pertenezca al mismo proyecto configurado en el frontend.# Sincroniza lecciones locales a Firestore node backend/scripts/seedLessons.js -
Actualizar Contenido con IA (Opcional): Para generar contenido fresco usando Gemini:
npx tsx backend/scripts/refresh-content.ts
npm run devAccede a http://localhost:5173.
Para probar características que requieren SSL (como el micrófono en algunos navegadores):
- Generar certificados:
./init-local-https.sh
- Acceder a
https://localhost.
El proyecto está optimizado para desplegarse como un Web Service en Render usando Docker:
- Repo: Conecta tu repositorio de GitHub a Render.
- Runtime: Selecciona Docker.
- Dockerfile Path:
Dockerfile(en la raíz). - Build Context:
.(raíz del proyecto). - Docker unificado: Un único
Dockerfileen la raíz que compila el frontend (React/Vite) y lo sirve estáticamente desde el backend (Express/Node.js). El Dockerfile incorpora hardening medianteapk upgradey actualizaciones denpmpara mitigar vulnerabilidades base. - Inyección de variables en Build-time: Debido a que Vite embebe las variables
VITE_*durante el empaquetado, el Dockerfile crea un archivo.envdinámico usandoARGpasados por Render. - Gestión de Transitorias: Uso de
overridesen elpackage.jsonraíz para forzar versiones seguras de dependencias indirectas (ej:qs) identificadas por Snyk. - Optimización de arranque: Uso de
tsxen el backend para ejecutar directamente TypeScript en producción, simplificando el flujo de compilación. - Seguridad Adaptativa: Configuración de Helmet ajustada para permitir WebSockets de ElevenLabs y Popups de Firebase Auth (
Cross-Origin-Opener-Policy). - Variables: Configura todas las claves de API como variables de entorno.
[!IMPORTANT] Las variables
VITE_*deben pasarse como Build-time environment variables en Render (o mediante el Dashboard de Secretos), ya que Vite las embebe durante el paso de compilación (npm run build). Las variables de backend (ej:FIREBASE_SERVICE_ACCOUNT) pueden ser de Runtime. - Firebase: Recuerda añadir el dominio de Render a la lista de Dominios Autorizados en la consola de Firebase Authentication.
- Unitarios:
npm test - E2E:
npm run test:e2e(Ejecuta tests con Playwright. Por defecto intenta conectar ahttp://localhost:3001. Asegúrate de tener el servidor de preview o Docker corriendo si pruebas localmente). - Linting:
npm run lint - Seguridad:
npm run test:security(Snyk) - Documentación:
npm run doc(Genera documentación técnica con TypeDoc endocs/api)
Este proyecto sigue una estrategia de calidad pragmática:
- Servicios de Dominio (100%): La lógica de negocio pura (
src/services/) se mantiene con cobertura total. - Cobertura Global (~46%): Enfocada en los flujos principales. No se sobre-testean hooks complejos de navegador (como
useTTS) para evitar fragilidad en los tests. - UI & Storybook: Los componentes visuales se verifican vía Storybook y sus tests de interacción.
- Verificación Automática: Ejecuta
npm testantes de cada push para asegurar que no se introducen regresiones.
¡Las contribuciones son bienvenidas! Para mantener la calidad del proyecto, hemos automatizado parte del proceso:
- Issues: Al abrir un error o propuesta, utiliza nuestras plantillas para proporcionar toda la información necesaria.
- Pull Requests: Asegúrate de completar la lista de verificación (checklist) que aparecerá automáticamente en la descripción de tu PR.
- Guía de Estilo: Revisa nuestro CONTRIBUTING.md y sigue los estándares de código existentes.
Un bot de bienvenida te guiará una vez que abras tu primera contribución.
Para entender mejor por qué tomamos ciertas decisiones técnicas, puedes consultar nuestros registros de diseño:
- ADR 001: Adopción de Storybook
- ADR 002: Optimización de Rendimiento
- ADR 003: Estrategia de Testing
- ADR 011: Variables de Entorno en Build-time
- ADR 012: Onboarding de Contribuidores Automatizado
Este proyecto está bajo la Licencia MIT.






