¿Qué es el IVI?
El Índice de Vulnerabilidad Inmune es un número diario que resume cuánta carga está soportando el sistema inmune en ese momento. No es un diagnóstico ni una orden — es una señal de apoyo para tomar mejores decisiones sobre entrenamiento, alimentación y actividad.
El IVI cruza datos de distintas fuentes:
| Fuente | Qué aporta |
|---|---|
| Garmin (CSV) | SpO₂ nocturna, VFC, FC reposo, respiración, temperatura piel, puntuación sueño, duración |
| Intervals.icu | VFC nocturna real (la única fuente de VFC — el CSV de Garmin trae media semanal, no se usa), CTL/ATL/TSB, actividades ejecutadas, DFA α1 (Garmin Edge 1030+) |
| Eventos clínicos y de contexto | Vacunas, procedimientos, diarrea, bloque enfermedad, esfuerzo no deportivo, dolor lumbar... |
| Analítica mensual | Neutrófilos, linfocitos, hemoglobina, inmunoglobulinas... |
| Medicación activa | fármacos activos y su aporte diario |
| Fuerza y composición corporal | Resumen de sesiones de fuerza (catálogo de ejercicios) y báscula — no puntúan el IVI, aportan contexto |
IVI vs IVI entreno (IVI_p)
La app calcula dos números distintos, y es importante no confundirlos:
| Número | Incluye | Para qué se usa |
|---|---|---|
| IVI total | Fisiología + eventos + analítica + medicación crónica + carga de entrenamiento (TSB) | Visión clínica global del día — el que enseñarías a tu equipo médico |
| IVI entreno (IVI_p) | Solo fisiología + eventos + carga de entrenamiento — sin analítica ni medicación crónica | El único que manda para decidir si entrenar hoy |
La razón de separarlos: las condiciones estructurales o la medicación habitual son un fondo fijo que no cambia día a día. Si entraran en el número que decide el entreno, bloquearían sesiones en días con buenas sensaciones sin motivo real. Por eso toda la parte de entrenamiento de la app (planificador nutricional, recomendación de hoy, evaluación de sesión, .zwo adaptado) usa siempre IVI_p, nunca el IVI total.
Entrenamiento libre. Plan nutricional estándar.
Intensidad capada al 65% FTP como techo obligatorio.
Entrenamiento no recomendado. Alternativas: paseo suave, movilidad, descanso activo.
El IVI total sigue teniendo su propio semáforo de 4 niveles (ver sección siguiente) y es el que ves en el gráfico principal y en el panel de detalle del día.
El semáforo IVI (total)
El valor IVI total se traduce en cuatro niveles de riesgo:
Señales fisiológicas normales. Sin eventos activos relevantes. Entrena con normalidad.
Una o varias señales elevadas. Reduce intensidad ~20–30%. Evita Z4 o intervalos. Z2 y fuerza moderada son aceptables.
Varias señales simultáneas o evento de peso alto activo. Solo actividad muy suave: paseo, movilidad. Vigila síntomas.
Señal de alarma real. Reposo absoluto. Contactar equipo médico si persiste más de 2 días.
Gráficos
La columna de salud tiene cuatro gráficos y la de entrenamiento dos más. Haz clic en cualquier punto para ver el detalle de ese día en el panel lateral; doble clic sobre un gráfico abre el modo foco.
IVI Timeline
Muestra la evolución diaria del IVI total. Cada punto tiene el color del nivel (verde/amarillo/rojo/morado). Las líneas verticales finas marcan la fecha de los eventos clínicos registrados. Las bandas de color de fondo indican las zonas de riesgo.
SpO₂ nocturna y VFC
La SpO₂ (azul) tiene una línea de umbral roja en el 94% — por debajo de ese valor el IVI empieza a penalizar de forma significativa. La VFC (lila) viene siempre de Intervals.icu (media nocturna real), nunca del CSV de Garmin.
Puntuación sueño y FC reposo
El score de sueño (verde) y la frecuencia cardíaca en reposo (naranja). Un score inferior a 40 genera penalización fuerte. Una FC en reposo por encima de 65 bpm es señal de recuperación incompleta.
ATL / CTL / TSB
Carga de entrenamiento desde Intervals.icu. ATL = fatiga acumulada reciente. CTL = forma a largo plazo. TSB = forma del día (CTL - ATL). Un TSB muy negativo (por debajo de -15) suma puntos al IVI.
Eficiencia aeróbica y Decoupling — tendencia 7d vs 28d
Compara la media móvil de 7 días con la de 28 días de dos métricas por sesión: eficiencia (W/lpm) y decoupling (deriva cardíaca %). Si ambas medias divergen de forma sostenida — eficiencia cayendo o decoupling subiendo varios días seguidos — la app lo señala como alarma precoz: este patrón puede preceder a una infección antes de que aparezcan síntomas claros. Debajo del gráfico hay una leyenda fija con los umbrales exactos (verde/amarillo/rojo) para EF y Decoupling — los umbrales son un suelo (p. ej. "hasta 3% peor" incluye estar igual o mejor), no una banda simétrica. También aclara que el decoupling de una sesión suelta (panel del día) solo es fiable en esfuerzo estable — en tests tipo ramp/progresivos el número se distorsiona.
Filtro de rango
Encima del gráfico IVI hay botones para filtrar el período visible:
- 30d — último mes
- 90d — últimos tres meses
- Todo — todos los datos disponibles
- Desde / Hasta — rango personalizado con fechas
Todos los gráficos se sincronizan con el mismo rango seleccionado.
Detalle del día
Al hacer clic en cualquier punto de un gráfico, el panel lateral muestra el análisis completo de ese día. El botón ⤢ Ampliar (o doble clic en cualquier gráfico) abre el mismo contenido en una ventana grande — el modo foco — más cómoda para revisar en detalle.
Panel de señales
Seis celdas con semáforo individual para SpO₂, VFC, FC reposo, respiración, temperatura piel y puntuación de sueño. El color de cada celda indica si esa señal está dentro de lo normal (verde), elevada (amarillo) o en zona de alerta (rojo/morado).
Breakdown IVI
Barras que muestran cuántos puntos aporta cada componente al IVI total: fisiología (desglosada por señal), eventos clínicos, analítica, medicación y carga de entrenamiento. Útil para entender por qué el IVI está en ese nivel.
VFC
El valor mostrado es siempre el dato nocturno real de Intervals.icu. Su color (verde/amarillo/rojo) refleja internamente la caída porcentual respecto al baseline fijo de enero-febrero 2026 — no se muestra el porcentaje como texto, pero es lo que determina si penaliza al IVI.
Si el valor de SpO₂ de una noche cae de forma sospechosa respecto a tus últimos días (umbral configurable en ⚙ Sensibilidad SpO₂), aparece un aviso amarillo sugiriendo revisar si el reloj estaba bien ajustado. Puedes corregir el valor manualmente con el botón ✎ Corregir con pulsioxímetro — introduces una medición puntual y el IVI usará ese valor en vez del de Garmin para ese día.
Noche no fiable / artefacto del sensor
Si una noche completa (reloj mal puesto) o solo alguna señal concreta parece un artefacto, puedes marcarla como no fiable desde el propio panel de detalle — esas señales dejan de puntuar en el IVI ese día, sin perder el resto de datos de la noche. La app también detecta automáticamente desviaciones extremas de respiración/VFC/FC frente a tu media reciente y sugiere marcarlas.
Analítica del día
Si hay una analítica registrada anterior o igual a esa fecha, se muestra en el detalle con los valores y sus colores de alerta. La analítica vigente es siempre la más reciente disponible.
Cocina hoy
Al final del detalle aparece una recomendación de alimentación adaptada al nivel IVI de ese día. Ver sección Cocina hoy para más detalle.
Panel de estado
El botón ⓘ Estado en el header abre un panel de diagnóstico útil si algo no cuadra:
- Versión de la app y estado de conexión con la nube
- Última sincronización con la nube y con Intervals.icu
- Conteo local vs. nube de eventos, medicación, analíticas, sueño y peso
- Estado de Intervals: ✓ con hora de la última descarga correcta, o ✗ con el error y la hora de los últimos datos buenos
- Cola de cambios pendientes de subir (con opción de limpiarla)
- Cambios que se descartaron tras varios intentos fallidos
Cuando hay una versión nueva de la app publicada, aparece un aviso en la parte inferior de la pantalla con un botón para recargar.
Tabs (columna de salud)
Eventos
Lista de eventos clínicos y de contexto registrados. Ver sección Eventos clínicos y de contexto para el detalle de tipos disponibles.
El botón ✎ permite editar un evento ya registrado. El botón × lo elimina.
Alterna entre Recientes (últimos 14 días) y Todos.
Medicación
Fármacos activos con su contribución diaria al IVI. El botón ■ marca un fármaco como finalizado sin eliminarlo del historial. Alterna entre Activas y Todas.
Analítica
Registro de analíticas mensuales. Cada analítica es válida desde su fecha hasta la siguiente registrada. Los campos disponibles son: neutrófilos, linfocitos, hemoglobina, plaquetas, PCR, creatinina, IgG, IgA, IgM, calcio, albúmina, LDH, ferritina, cadenas ligeras kappa y lambda, y eGFR.
Peso
Composición corporal (peso, IMC, grasa, masa muscular esquelética, masa ósea, agua corporal) importada desde el CSV de la báscula. No puntúa el IVI — es una covariable útil para tu propio seguimiento. Haz clic en un punto del gráfico para ver o editar el detalle de ese día.
Stats
Resumen estadístico del período: IVI medio, IVI máximo y su fecha, SpO₂ mínima y su fecha, distribución de días por nivel de riesgo, y valores del baseline.
Importar CSV Garmin
Cómo exportar desde Garmin Connect
Abre Garmin Connect en el navegador (no en la app móvil).
Ve a Salud → Sueño.
Selecciona el rango de fechas (mínimo 7 días, recomendado 28 días).
Haz clic en el botón de exportar CSV.
En IVI Tool, pulsa el botón ⬆ CSV en el header y selecciona el archivo descargado.
La app acepta múltiples archivos a la vez. Si una fecha ya existe en los datos, el CSV importado la sobreescribe (salvo la corrección manual de SpO₂, que se conserva). Los datos se sincronizan automáticamente con la nube si hay conexión. El botón ↶ Deshacer revierte la última importación.
VFC: solo Intervals
El CSV de Garmin incluye la media semanal de VFC, un dato demasiado poco sensible. La app la ignora por completo y usa siempre el VFC nocturno real de Intervals.icu. Para forzar la sincronización con Intervals, usa el botón ↺ junto al gráfico ATL/CTL/TSB.
Importar CSV báscula
El botón ⬆ CSV Peso en el header importa el export de composición corporal de tu báscula (peso, IMC, grasa, masa muscular esquelética, masa ósea, agua corporal). Solo se importan fechas desde el 1 de enero de 2026 en adelante.
Estos datos no afectan al cálculo del IVI — se guardan aparte y se muestran en la pestaña Peso.
Exportar CSV
El botón ⬇ CSV genera un archivo con todos los datos del rango seleccionado, pensado para análisis externo riguroso (hoja de cálculo, Python, R...). Incluye, entre otras columnas:
- IVI total y IVI entreno (IVI_p) por separado, con su zona de semáforo
- Desglose fisiológico por señal (SpO₂, VFC, sueño, FC, respiración, temperatura)
- Eventos activos ese día, analítica, medicación activa, carga de entrenamiento
- Todas las actividades del día (no solo la primera si hubo varias), nivel de sesión, cumplimiento
- Recuperación calculada del día siguiente (ΔVFC, ΔFC de reposo)
- Resultado real de la sesión y chequeo clínico pre-sesión
- Resumen de fuerza (series, volumen, fatiga estimada, impacto en ciclismo)
- Composición corporal del día
- Analítica ampliada: calcio, albúmina, LDH, ferritina, cadenas ligeras kappa/lambda, eGFR
CSV detalle sesión
Junto al botón anterior, ⬇ CSV detalle sesión genera un archivo distinto: una fila por actividad (no por día), pensado para el análisis semanal de entrenamiento. Incluye nombre, nivel estimado, TSS, duración, FC media/máx, decoupling, eficiencia, NP, IF/intensidad, cumplimiento y, si el dispositivo es un Garmin Edge 1030+, DFA α1 medio y los umbrales VT1/VT2 (y VT2' experimental, marcado como no validado en la cabecera). Si algún día del rango no tiene el DFA calculado todavía, la app lo pide a Intervals.icu en el momento de exportar — puede tardar unos segundos la primera vez; las siguientes exportaciones reutilizan lo ya calculado.
Planificador nutricional
Disponible en la columna de entrenamiento → 🍽️ Alimentación entrenamiento. Calcula la estrategia de hidratación y alimentación para una sesión concreta, adaptada al IVI_p del día.
Chequeo clínico pre-sesión
Si hay un evento clínico activo ese día (diarrea, bloque enfermedad, entreno en enfermedad), el planificador pide primero un chequeo subjetivo: Bien / Regular / Mal. Un "Mal" fuerza la sesión a no recomendada aunque el número de IVI_p sea bajo; un "Regular" fuerza como mínimo el capado al 65%. Un "Bien" deja el cálculo numérico tal cual.
Capado y override
En zona amarilla, los bloques se capan automáticamente al 65% FTP y se recalculan kJ, hidratación y gummies. Si te encuentras bien y quieres mantener la sesión íntegra, el botón ✅ Me encuentro bien → mantener sesión desactiva el capado para ese día (queda registrado como evento auditable, para poder correlacionarlo después con tu recuperación).
Descargar ZWO
Dos botones, con propósitos distintos — no los confundas:
- ⬇ ZWO reducido (según IVI) — solo aparece si el planificador redujo bloques por IVI_p elevado. Recorta/capa la potencia del entreno real.
- ⬇ ZWO con avisos (comida/hidratación) — siempre disponible. Genera un
.zwocon la misma estructura de potencia original (sin recortar nada) pero con un<textevent>por cada trago/gummy de la timeline de nutrición, para que aparezca como popup en pantalla al minuto exacto.
.zwo se pierdan al pasar por esa conversión antes de llegar a MyWhoosh, aunque MyWhoosh sí soporta mensajes en su propio formato nativo. Pendiente de probar creando una nota de texto directamente en el editor nativo de Intervals (no subiendo el .zwo) para ver si esa vía sí sobrevive.
Qué calcula el planificador
| Dato | Cómo se calcula |
|---|---|
| kJ estimados | Simulación segundo a segundo con potencia × duración de cada bloque |
| Hidratación | Base 600ml/h + ajuste por temperatura de la habitación + ajuste por peso |
| Gummies | Solo si hay bloques ≥88% FTP y kJ ≥380. Se programa su toma 5 minutos antes del bloque intenso |
| Timeline | Recordatorios de hidratación cada 20 minutos con cambio de bidón a mitad de sesión |
Registro de sesión y recuperación
Bajo el entreno del día (panel lateral) hay un bloque Registro de sesión. Tras entrenar, marca el resultado real: Completo / Reducido / Cancelado / Sustituido. Si cancelas, se pide el motivo (fatiga, dolor, trabajo, falta de tiempo, otro). Si hubo más de una sesión el mismo día, se registra el resultado de cada una por separado.
Recuperación calculada
La app compara automáticamente tu VFC y FC de reposo del día siguiente a la sesión frente al día de la sesión, y clasifica la recuperación como Normal, Estable, Lenta o Muy lenta. "Estable" indica que apenas hay cambio respecto al día de la sesión (VFC y FC de reposo prácticamente iguales) — antes esos casos se etiquetaban igual que "Lenta", lo cual era confuso porque un valor sin cambios no es una recuperación lenta. Es un cálculo puramente fisiológico (solo VFC/FC), sin mezclar eventos clínicos ni carga de entrenamiento — si ese día siguiente hay un evento clínico activo o medicación relevante, se muestra como aviso de contexto aparte, sin alterar el número.
Recomendación y evaluación de sesión
El bloque 🧭 Recomendación de hoy cambia de comportamiento según si tienes una sesión planificada en Intervals para hoy:
Sin sesión planificada
La app busca, entre tus días pasados, los más parecidos al de hoy por estado fisiológico (IVI_p, caída de VFC, sueño, TSB, eventos activos...) y comprueba cuántos de ellos terminaron bien al día siguiente. Con eso estima un beneficio esperado (ALTO/MEDIO/BAJO) y propone una sesión libre de duración e intensidad ajustadas.
Con sesión planificada
La app no propone otra cosa — evalúa la sesión concreta que ya tienes planificada, comparándola contra tu histórico de sesiones del mismo tipo (mismo nivel: Z1/Z2/Z2S/Sweetspot/Umbral/VO2, o niveles cercanos si no hay suficientes casos exactos). El resultado incluye:
- Beneficio esperado — ALTO / MEDIO / BAJO / MUY_BAJO, según cuántos casos similares mejoraron al día siguiente
- Veredicto — mantener, reducir volumen, reducir intensidad, reducir ambos, sustituir por un nivel más suave, o cancelar
- Descarga .zwo adaptado — cuando aplica, genera un archivo que ejecuta exactamente ese veredicto (recorte de duración y/o techo de potencia, o un entreno sustituto sintético)
Si ya hay una actividad registrada hoy en Intervals, este bloque no evalúa nada nuevo — remite al bloque Registro de sesión. De momento el veredicto es solo informativo, sin botones de "registrar decisión".
Fuerza
El botón 🏋️ Registrar fuerza hoy anota tu rutina estándar en el día actual. Si sigues una rutina distinta, puedes 📂 Importar JSON fuerza con el catálogo de ejercicios de esa sesión (nombre, grupo muscular, repeticiones, peso, tiempo) — los ejercicios nuevos se dan de alta automáticamente en tu catálogo local.
Tras registrar una sesión, aparece un resumen automático en el panel del día:
- Duración, número de ejercicios y series, volumen externo total (kg)
- Distribución muscular trabajada (pierna, core, espalda, pecho, hombro, brazos)
- Patrones de movimiento (squat, hip hinge, push/pull...)
- Fatiga estimada e impacto esperado sobre el ciclismo (Mínimo → Muy alto)
- Recuperación estimada recomendada antes de la siguiente sesión intensa
Puedes editar cualquier sesión ya registrada (añadir/quitar ejercicios o series, cambiar peso/repeticiones) con el botón ✎ Editar.
Cocina hoy
Al seleccionar un día en el gráfico, al final del panel lateral aparece una recomendación alimentaria basada en el nivel IVI de ese día.
Eventos clínicos y de contexto
Los eventos son la forma de decirle al IVI "hoy (o desde hoy) está pasando esto". Cada uno tiene un peso en puntos y un período de decaimiento en días — pasado ese período, deja de afectar al IVI. Se registran con el botón + Evento.
Tipos clínicos
Vacuna, aspirado de médula ósea, diarrea (4 variantes según gravedad: >6 episodios, 3-6, 1-2 leve, o crónica diaria), bloque de enfermedad, entrenamiento en enfermedad, entreno cortado/modificado (con % de cumplimiento manual), cena tardía, visita médica (0 puntos, nota libre) y personalizado (puntos y decaimiento libres).
Período de trabajo activo
Evento sostenido pensado para marcar etapas laborales sin tener que abrir un evento cada día. Se abre una vez, al reincorporarte, y queda activo todos los días (festivos sueltos entresemana no lo interrumpen) hasta que lo cierras explícitamente con el botón ■ en la lista de eventos, indicando el último día trabajado. 0 puntos — es solo contexto visual para comparar analítica/IVI antes y después de esa etapa, no afecta al cálculo.
En los eventos de diarrea puedes anotar además consistencia (líquida, puré, blanda-rota) y sospecha de causa (alimentario, cambio de medicación, dolor/estrés, entreno, desconocido) — son campos de contexto, no puntúan aparte, pero quedan en el historial y en el CSV para buscar patrones.
Esfuerzo no deportivo
Limpieza intensa, jardinería, bricolaje, viaje largo, caminata prolongada u otro esfuerzo — cargas físicas reales que no son "entrenamiento" pero sí exigen al cuerpo. Admiten duración e intensidad, y sus puntos/decaimiento son ajustables (botón 💾 Guardar como valor por defecto para no reconfigurarlos cada vez).
Contexto adicional (no puntúa)
Dolor lumbar/sacro, lengua sucia, hinchazón/gases — se registran a 0 puntos por defecto. Sirven para buscar correlaciones con el tiempo, sin asumir todavía que deban afectar al IVI.
Uso offline y actualización
Botón 💾 HTML
El botón 💾 HTML en el header genera una copia del archivo HTML con todos los datos de sueño embebidos. Esto permite usar la app en cualquier dispositivo sin conexión a internet — útil en viajes o en consulta médica.
Sincronización con la nube
Los datos (eventos, medicación, analíticas, sueño manual, peso) se guardan primero en el almacenamiento local del navegador y se sincronizan con la nube en segundo plano. El indicador en el header muestra el estado:
- ● cloud — sincronizado con la nube
- ● local — guardado en local, pendiente de sync
- ● offline — sin conexión, datos guardados localmente
Si hay cambios pendientes sin sincronizar, aparece un badge naranja con el número — puedes abrir el panel de estado para ver el detalle o limpiar la cola si hay operaciones bloqueadas.
PWA (app instalable)
La herramienta se puede instalar como app en Chrome/Edge (botón de instalación en la barra de direcciones). Una vez instalada, carga más rápido y funciona sin abrir el navegador. Para actualizar a una versión nueva, desinstala la PWA y vuelve a instalarla desde el enlace de Netlify.
index.html al panel de Netlify.