Seguridad y privacidad
Cómo protege MaiTeach tu cuenta y los datos que tratas, con el detalle de las medidas técnicas que existen hoy. Complementa la Política de privacidad; no la sustituye.
1. Introducción
La Política de privacidad explica qué datos trata MaiTeach y con qué finalidad y base legal. Esta página explica el cómo: qué protege el acceso a tu cuenta, cómo se aíslan los datos de cada profesor, qué protege las APIs y qué ocurre con los datos temporales. Solo se describen medidas que existen de verdad hoy en el código o la infraestructura de MaiTeach; nada de lo que sigue es un objetivo futuro presentado como si ya estuviera implementado.
2. Principios de seguridad y privacidad desde el diseño
- Minimización. Pedimos y guardamos solo lo necesario para que cada función trabaje; cuando un dato no hace falta (por ejemplo, la identidad del alumno en el análisis por respuestas), no se envía.
- Aislamiento por defecto. Los datos que un profesor guarda en servidor solo son accesibles para ese mismo profesor (ver sección 4).
- Sin publicidad ni tracking de terceros. MaiTeach no instala Google Analytics, Vercel Analytics, Hotjar, Clarity, Mixpanel, Plausible ni ninguna herramienta equivalente, ni publicidad. La única analítica que usamos (PostHog) mide el uso de la aplicación, nunca su contenido, y está desactivada hasta que la aceptas explícitamente (ver también Cookies).
- Analítica de uso, no de contenido. MaiTeach mide CÓMO se usa la aplicación (qué herramienta se abre, si una acción tiene éxito, cuánto tarda), no QUÉ contenido educativo contiene. Se aplica en el propio código: los eventos solo admiten una lista cerrada de propiedades cortas, y antes de cada envío se eliminan los parámetros y fragmentos de todas las direcciones web, que es donde podría colarse texto libre (por ejemplo, una pregunta del Consultorio) o un token de acceso.
- Transparencia sobre lo pendiente. Cuando un dato jurídico o contractual no está confirmado, esta página y el resto de páginas legales lo marcan de forma visible en vez de darlo por supuesto.
3. Protección de cuentas y autenticación
El inicio de sesión y el registro los gestiona Supabase Auth (correo y contraseña; el acceso con Google está preparado en la interfaz pero no operativo todavía).
- Política de contraseña. Toda contraseña nueva debe tener al menos 12 caracteres e incluir una mayúscula, una minúscula, un número y un símbolo.
- Protección frente a enumeración de cuentas. El formulario de registro responde siempre con el mismo mensaje («revisa tu correo»), tanto si el correo es nuevo como si ya tiene cuenta: la respuesta nunca revela si una dirección de correo está ya registrada en MaiTeach.
- Cookies de sesión seguras. En producción, las cookies de sesión se marcan como
Secure(solo se envían por HTTPS).
4. Protección de datos y aislamiento por usuario
Las tablas que guardan contenido de un profesor (clases guardadas, Biblioteca de materiales y exámenes, imágenes generadas, sesiones del Escáner, traspasos temporales, feedback de la beta) tienen definida en las migraciones del proyecto Row Level Security (seguridad a nivel de fila) de PostgreSQL: una política exige que el identificador del usuario autenticado coincida con el propietario de la fila, de modo que un profesor no puede leer ni modificar los datos de otro directamente contra la base de datos. Las ilustraciones generadas se guardan en un espacio de almacenamiento privado con la misma regla. La aplicación no usa en ningún punto la clave de servicio de Supabase, que saltaría esas políticas.
Pendiente de completar: aplicación en producción de la migración de endurecimiento de las tablas heredadas classes y exams (deja solo políticas por propietario y retira los permisos del acceso anónimo) y comprobación posterior en el panel de Supabase. Las migraciones no se aplican de forma automática.
La aplicación, además, siempre filtra por el usuario autenticado en el propio código antes de leer o escribir nada (defensa en profundidad: dos capas independientes en vez de confiar en una sola).
5. Seguridad de la infraestructura
MaiTeach se ejecuta sobre Vercel, que sirve toda la aplicación exclusivamente por HTTPS. Reforzamos esto con HSTS (Strict-Transport-Security, 2 años, incluidos subdominios), que indica al navegador que nunca intente cargar MaiTeach por HTTP sin cifrar.
Toda la aplicación aplica además estas cabeceras de seguridad:
X-Content-Type-Options: nosniff— evita que el navegador reinterprete un archivo como un tipo distinto al declarado.X-Frame-Options: DENYyContent-Security-Policy: frame-ancestors 'none'— impiden que MaiTeach se cargue dentro de un<iframe>de otra web (protección frente a clickjacking).Referrer-Policy: strict-origin-when-cross-origin— limita qué información de la URL de origen se envía a otros sitios al salir de MaiTeach.Permissions-Policy— la cámara solo puede activarse desde el propio dominio de MaiTeach (la usa el Escáner); el micrófono y la geolocalización están bloqueados por completo, al no usarse en ningún punto de la aplicación.
6. Protección de APIs y rate limiting
- Sesión obligatoria. Las rutas de servidor que tocan datos de un profesor exigen una sesión válida; sin ella, responden sin acceder a ningún dato.
- Límite de peticiones (rate limiting). Las funciones que usan IA, y otras rutas sensibles, limitan cuántas veces puede llamarlas un mismo usuario y una misma IP en una ventana de minutos, mediante Upstash (Redis). El límite por IP es más permisivo que el de usuario, pensado para que varios profesores del mismo centro compartiendo wifi no se bloqueen entre sí. Upstash solo recibe un hash del identificador de usuario y de la IP, nunca esos valores en claro.
- Tolerancia a fallos sin dejar de proteger el dato. Si Upstash no responde a tiempo, la petición se permite en vez de bloquear al profesor (para no depender por completo de un servicio externo), pero el incidente se registra en el servidor.
- Límite de tamaño. Las peticiones que suben imágenes o documentos tienen un tamaño máximo aceptado; una petición mayor se rechaza de forma explícita en vez de aceptarse parcialmente.
7. Tratamiento temporal de documentos y escáner
El Escáner rápido y el traspaso temporal de materiales/exámenes entre dispositivos se describen con su alcance exacto en Política de privacidad (secciones 3 y 9). En resumen: ambos caducan a las 48 horas, nunca almacenan imágenes y un trabajo programado en la base de datos borra físicamente las filas caducadas, sin depender de que el profesor vuelva a abrir la aplicación.
8. Inteligencia artificial y proveedores externos
MaiTeach usa OpenAI para sus funciones de IA. Las peticiones de texto y de análisis de imágenes se envían con la opción store: false (verificable en el código); la generación de ilustraciones usa otra API de OpenAI que no admite esa opción. Qué se envía en cada función está en la sección 5 de la Política de privacidad. El detalle completo —qué depende de MaiTeach y qué depende de OpenAI— está en la página de uso responsable de la IA. Los otros proveedores que intervienen (Supabase, Vercel, Upstash) y qué tratamiento hace cada uno están descritos en Política de privacidad (sección 6). MaiTeach no presenta los resultados de la IA como decisiones educativas definitivas: son propuestas que el profesor revisa y decide.
PostHog (analítica de uso, solo con tu consentimiento) recibe lo descrito en la sección 6 de la Política de privacidad: eventos con una lista cerrada de propiedades cortas, direcciones de página sin parámetros y datos técnicos del navegador. Medidas en el código:
- La aplicación no carga ni inicializa PostHog hasta que aceptas la analítica; los eventos anteriores a tu aceptación no se recuperan.
- Antes de cada envío se eliminan los parámetros y fragmentos de todas las direcciones web que añade PostHog (página actual, de procedencia, de inicio de sesión y primera visita).
- Sin grabación de sesión, captura automática de clics, mapas de calor, clics «muertos», encuestas, métricas de rendimiento automáticas ni petición de feature flags.
- Te identifica con el identificador técnico (UUID) de tu cuenta, nunca con tu nombre, tu correo ni otros atributos.
- Si retiras el consentimiento, PostHog deja de capturar de inmediato y olvida el identificador de ese navegador.
Sentry (detección de errores técnicos) está configurado para no recoger automáticamente cookies, cabeceras HTTP (incluye Authorization), parámetros de consulta, cuerpos de petición/respuesta, consultas a la base de datos, variables locales de la pila ni datos de usuario —incluida la dirección IP, que el SDK no adjunta con esta configuración—; y para no capturar prompts ni respuestas de integraciones de IA. Además, antes de enviar cualquier error o medición de rendimiento (se envía una muestra en torno al 10 %), el código de MaiTeach:
- elimina la información de la petición y los datos adicionales;
- conserva como máximo un identificador técnico del usuario (hoy MaiTeach no lo establece), nunca su nombre, su correo ni su IP;
- oculta las direcciones de correo electrónico;
- quita los parámetros y fragmentos de todas las direcciones web (mensajes, pantallas, peticiones medidas);
- descarta el texto de los elementos de la interfaz que se pulsan (el SDK lo tomaría de atributos como la etiqueta accesible);
- recorta los textos largos.
Sentry no tiene activada la grabación de sesión (Session Replay): ese módulo no se integra en el código, así que no puede grabar lo que ves en pantalla. Estas medidas reducen mucho el riesgo, pero no permiten garantizar que un mensaje de error técnico no contenga nunca un dato personal.
Pendiente de completar: confirmar en el panel de Sentry (no en el código) que está activada «Prevent Storing of IP Addresses» como segunda capa, y la región del proyecto.
9. Datos de alumnado y minimización
Pedimos al profesorado introducir solo los datos de alumnado que cada función realmente necesita, y varias funciones están diseñadas para no necesitar ninguno (por ejemplo, el análisis por respuestas no recibe el nombre ni el grupo que asocias en MaiTeach). En las herramientas de texto (Materiales, Rúbricas, Adaptaciones, Consultorio, Nueva clase e Informe de progreso), el servidor retira además correos, teléfonos, DNI/NIE e IBAN antes de enviar nada a la IA; los nombres propios no se detectan, así que no es una anonimización. El alcance exacto, función por función, está en las secciones 5 y 8 de la Política de privacidad.
10. Almacenamiento local
«Mis grupos» (tus clases y la lista de alumnos de cada una), «Seguimiento» (evaluaciones, fortalezas y dificultades por alumno) y la Agenda (tareas y fechas) se guardan únicamente en el almacenamiento local (localStorage) de tu navegador. MaiTeach no los envía a sus servidores; puedes borrarlos en cualquier momento desde las propias pantallas o desde las opciones de tu navegador. Más detalle en Cookies.
Cuando has iniciado sesión, estos datos se guardan por separado para cada cuenta: en un mismo navegador, una cuenta no ve los de otra. Al cerrar sesión dejan de mostrarse al momento (se conservan para cuando vuelvas). Si no se puede comprobar tu sesión, MaiTeach no permite crear ni editar estos datos, para no guardar nada sin saber de quién es. Los datos guardados en este navegador antes de que MaiTeach los asociara a una cuenta solo se asignan a la tuya si confirmas que son tuyos, y no se borran.
11. Eliminación de datos temporales
- Sesión temporal del Escáner: borrado físico automático a las 48 horas.
- Traspaso temporal de materiales y exámenes entre dispositivos: borrado físico automático a las 48 horas.
- Imágenes generadas para materiales (estilo «Visual»): se borran al eliminar el material que las usa. Las que llevan más de 30 días sin usarse en ningún material guardado se eliminan en la siguiente limpieza, que hoy se ejecuta cuando el profesor vuelve a usar la generación de ilustraciones o el traspaso temporal; todavía no hay un borrado programado independiente para ellas.
En los dos primeros casos puedes descartar el contenido manualmente antes de ese plazo desde la propia pantalla.
12. Gestión de incidentes de seguridad
MaiTeach revisa su propio código y configuración para detectar y corregir problemas de seguridad (algunas de las medidas descritas en esta página, como el aislamiento por fila o las cookies seguras, nacieron precisamente de esas revisiones). Desde la beta, además, los errores técnicos de producción se capturan con Sentry (ver sección 8), lo que nos permite detectar fallos sin depender de que un profesor nos escriba para avisar. Pendiente de completar: reglas de alerta concretas en el panel de Sentry (errores nuevos, repetidos, picos o fallos 5xx) y un programa formal de monitorización 24/7: hoy la captura de errores existe, pero las alertas automáticas requieren configuración manual en el panel de Sentry que todavía no se ha hecho. No podemos prometer certificaciones ni auditorías externas porque hoy no existen.
13. Comunicación de vulnerabilidades
Si detectas una vulnerabilidad de seguridad en MaiTeach, puedes comunicárnosla a hola@maiteach.com. La analizaremos y, si procede, la corregiremos según su naturaleza y gravedad.
Pendiente de completar: procedimiento formal de comunicación de vulnerabilidades (canal dedicado, compromiso de acuse de recibo y plazos concretos de respuesta). Hoy no existe un procedimiento así definido.
14. Actualizaciones y mejora continua
Las medidas descritas en esta página evolucionan junto con el producto. Si cambia algo relevante, actualizaremos esta página y, cuando corresponda, la Política de privacidad.
15. Contacto
Para cualquier cuestión sobre seguridad o privacidad: hola@maiteach.com. Para derechos sobre tus datos personales, consulta también Política de privacidad y Contacto.
¿Dudas sobre este documento? Escríbenos a hola@maiteach.com.
