Voltio · cómo construí un motor de progresión que decide serie a serie
Caso técnico de una aplicación web progresiva en producción, con suscripción de pago. Qué decisiones tomé, qué problemas me encontré y cómo los resolví. El producto está en voltioapp.es ↗; esta página es lo que hay por dentro.
Voltio es una aplicación web progresiva de entrenamiento de fuerza desarrollada por Rocío F. Peral que automatiza la sobrecarga progresiva serie a serie. Su motor de progresión decide, para cada serie individual, si subir, mantener o bajar la carga en función del rendimiento de la sesión anterior, y redondea el resultado al escalón real del material disponible en el gimnasio. Está construida sobre PHP 8.3, MariaDB y JavaScript sin dependencias externas, funciona sin conexión y se distribuye como PWA instalable, sin pasar por las tiendas de aplicaciones. Está en producción con usuarios de pago desde julio de 2026.
El problema
La sobrecarga progresiva es el principio número uno del entrenamiento de fuerza y todo el mundo lo conoce. El problema no es entenderlo: es aplicarlo serie a serie, semana a semana, sin equivocarse.
¿Subiste lo suficiente? ¿Te pasaste? ¿Esa serie fue mala o es que llevas tres semanas estancado? ¿Toca descargar?
Las apps que existían resolvían el registro —apuntar peso y repeticiones— pero no la decisión. Y el registro no te hace progresar: solo documenta lo que ya pasó.
El posicionamiento salió de ahí: «Voltio no te da la rutina. Exprime la que ya tienes.» No compite con quien te programa el entrenamiento; se pone encima de tu rutina y decide la carga.
Cómo decide el motor
El caso base:
Tu rutina: Press banca · 4 series · rango 8-10 repeticiones
Trabajas con: 60 kg
Registras: 10 · 10 · 10 · 9
Voltio programa: 62,5 kg la próxima sesiónarrow_upwardRepeticiones por encima del rango → sube un 5%
arrow_downwardRepeticiones por debajo del rango → baja un 5%
horizontal_ruleRepeticiones dentro del rango → mantiene
La decisión es por serie individual, no por ejercicio. Si la cuarta serie no acompañó, esa no sube y las otras tres sí.
Los cinco problemas que hubo que resolver
1 · Un 5% no siempre existe
Un 5% sobre 20 kg son 1 kg. Sobre 12 kg son 0,6 kg. Ese disco no existe. Si el motor programa 12,6 kg, el usuario abre la app, mira la barra y no sabe qué hacer.
La solución fue redondear al escalón real del material, que además cambia según el ejercicio: no es lo mismo una barra, una mancuerna o una polea. El motor detecta el tipo de material por el nombre del ejercicio y aplica el incremento mínimo que existe de verdad en cada caso.
Y una regla que parece obvia y no lo es: una subida nunca puede ser cero. Al subir, el redondeo va hacia arriba; al bajar, hacia abajo. Si el cálculo se quedaba en el mismo peso, se fuerza un escalón. Un motor de progresión que programa el mismo peso durante seis semanas no es conservador: está roto.
2 · Falta de dato no es lo mismo que fallo
Si un usuario apunta el peso pero se olvida de las repeticiones, un motor ingenuo interpreta cero repeticiones y baja la carga. Le está castigando por no rellenar un campo.
Voltio distingue las dos cosas. Sin repeticiones registradas no toca el peso, y busca hacia atrás la última semana que sí tenga datos reales de esa serie para usarla como referencia. La nota que ve el usuario lo dice con esas palabras: «Sin repes registradas la semana pasada → mantengo el peso».
3 · Hay ejercicios que no llevan peso
Dominadas, rueda abdominal, fondos. No se les puede subir la carga.
En esos casos el motor progresa en la otra variable: cuando el usuario supera el rango de repeticiones, lo que sube es el objetivo de repeticiones, no el peso.
4 · El histórico se destruía al empezar un mesociclo nuevo
Este fue el problema más difícil, y el más caro de descubrir. Cuando un usuario subía una rutina nueva, los ejercicios se creaban como registros nuevos en la base de datos. El press banca del mesociclo 2 era, para el sistema, un ejercicio distinto del press banca del mesociclo 1. Resultado: el progreso se reseteaba cada vez que cambiabas de bloque, que es justo cuando más te importa ver la evolución.
La solución fue introducir un linaje de ejercicios: cada ejercicio arrastra la referencia a su antecesor, y las consultas de histórico siguen esa cadena en lugar de mirar solo el identificador actual. El progreso continúa entre mesociclos, y el usuario puede confirmar a mano con qué ejercicio anterior enlaza cada uno cuando la correspondencia no es evidente.
5 · Cuándo descargar, sin que lo decida el usuario
El deload es necesario, y también es lo primero que la gente se salta. Voltio lo programa automáticamente, pero con criterio conservador: solo cuando el volumen real no progresa durante varias semanas normales seguidas, y nunca dos descargas consecutivas. Durante la descarga, los objetivos bajan al 60% del peso manteniendo las mismas series y repeticiones — se reduce la carga, no el estímulo técnico.
Y el detalle que hace que funcione: al cerrar la descarga, la progresión retoma las cargas de antes de ella. Si no, el usuario perdería un mes de progreso cada vez que descarga, y no volvería a hacerlo nunca.
El usuario también puede convertir su semana en descarga a mano, respondiendo a un cuestionario de señales de fatiga: ánimo, sueño, energía, apetito y rendimiento.
Las decisiones de arquitectura
PHP 8.3, MariaDB y JavaScript sin dependencias
Sin framework de front, sin bundler, sin proceso de build. Es una decisión deliberada y contracorriente, así que conviene explicarla: en un proyecto de una sola desarrolladora, cada dependencia es una deuda futura. Sin build, el ciclo es git push y funciona. No hay una cadena de herramientas que se rompa dos versiones más tarde, ni una actualización de framework que obligue a reescribir la mitad de la interfaz. La complejidad que no introduces es la única que no tienes que mantener.
PWA en lugar de app nativa
Se instala desde el navegador en móvil y escritorio, funciona sin conexión —imprescindible en sótanos de gimnasio sin cobertura, donde el entrenamiento se guarda en local y sube solo al recuperar la red— y evita la comisión de las tiendas de aplicaciones.
Migraciones versionadas
El esquema de base de datos evoluciona en migraciones numeradas y aplicadas en orden, con un vigilante que detecta desviaciones entre el esquema esperado y el real, y ofrece repararlas desde el panel de administración.
Copias de seguridad automáticas y verificadas
No basta con hacer copia: hay que comprobar que la copia sirve.
Añadir aquí el caso del backup que se corrompía a sí mismo y cómo se resolvió la verificación automática de restaurabilidad.
IA donde aporta, no donde luce
La API de Anthropic se usa en dos sitios concretos: interpretar rutinas que el usuario sube en Excel, PDF, foto o texto plano y convertirlas en entrenamientos estructurados, y generar el análisis semanal de rendimiento. La decisión de qué peso poner no la toma un modelo: la toma un motor determinista y comprobable. En un producto donde una recomendación equivocada puede lesionar a alguien, eso importa.
Galería del Sistema Voltio en Funcionamiento
Capturas reales de la aplicación web progresiva instalada en producción (voltioapp.es). Haz clic en cualquiera para abrir el visor en alta resolución.
Qué hay en producción
Añadir aquí cifras actualizadas: usuarios activos, series registradas, entrenamientos procesados en producción.
Preguntas frecuentes
7 RESPUESTAS¿Qué es Voltio?
expand_more
¿Cómo decide Voltio cuánto peso poner?
expand_more
¿Por qué está desarrollada sin framework de JavaScript?
expand_more
¿Usa inteligencia artificial para decidir las cargas?
expand_more
¿Qué es el linaje de ejercicios?
expand_more
¿Se puede probar?
expand_more
¿Quién ha desarrollado Voltio?
expand_more
Voltio está disponible en voltioapp.es con cuatro semanas de prueba gratuita
¿Necesitas construir algo con esta clase de lógica de negocio, o estás evaluando a alguien que pueda hacerlo? Hablemos.