尚未收集儲存庫資訊。
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
Traindía · 🏋️ PWA de entrenamiento offline: rutina, registro de sesiones, progreso y diario. Vanilla JS, sin dependencias, 100% local e instalable.
翻譯準備中
取自儲存庫 README
正在載入完整 README。
檢視完整 README ↗Planifica tu rutina, registra cada sesión, sigue tu progreso y consulta qué te toca comer hoy. Sin cuentas, sin servidores, sin dependencias. Tus datos viven en tu dispositivo.
Las capturas se adaptan al tema claro u oscuro de tu GitHub.
Traindía es una aplicación web progresiva (PWA) para gestionar tu entrenamiento por completo, pensada para usarse en el gimnasio (incluso sin cobertura). Organizas uno o varios planes semanales, registras tus sesiones (en vivo con cronómetro o a mano), analizas tu progreso con gráficas y consultas tu plan de alimentación. Todo queda guardado en local, sin registro ni backend, y puedes exportar/importar para compartir o hacer copias.
Nació como un plan de entrenamiento concreto y evolucionó a una herramienta genérica y reutilizable para cualquier rutina.
Registro en vivo con cronómetro y marcado de series, o manual indicando la duración.
Campos según el tipo de ejercicio: peso + reps, reps (peso corporal) o tiempo.
Soporte de cardio: velocidad (km/h), inclinación (%) y nivel.
🤖 Pregunta a una IA: genera un resumen del ejercicio/serie y lo abre en ChatGPT, Gemini o Claude para resolver dudas al instante.
Volumen (reps × kg) y duración calculados solos; reordena ejercicios y añade notas.
Historial agrupado por día con filtros por año / mes / día y por autor.
index.html); quien ya lo tiene entra directo a la app.WebApplication y FAQPage, Open Graph y Twitter Card.Vanilla JS · sin frameworks · sin build · 0 dependencias. Solo HTML, CSS y JS servidos como estáticos.
flowchart TD
SHELL["index.html + app.js<br/>shell · router · onboarding"]
UIH["ui.js<br/>modales · gráficas SVG · iconos · helpers"]
SEED["data.js<br/>plan semilla + guías"]
DB["db.js<br/>capa IndexedDB + migraciones"]
IDB[("IndexedDB · traindia-db")]
SW["sw.js<br/>service worker · network-first"]
SHELL --> V_PLAN["views-plan.js"]
SHELL --> V_SES["views-sessions.js"]
SHELL --> V_PROG["views-progress.js"]
SHELL --> V_NUT["views-nutrition.js"]
SHELL --> V_DATA["views-data.js"]
V_PLAN & V_SES & V_PROG & V_NUT & V_DATA --> UIH
V_PLAN & V_SES & V_PROG & V_NUT & V_DATA --> DB
DB --> IDB
SEED --> DB
SW -. cachea los assets .-> SHELL
traindia-db)Todos los registros (salvo settings) llevan userId, generado en el primer arranque y persistente.
| Store | Contenido |
|---|---|
settings | Configuración: usuario principal, lugares, versión de datos |
users | Perfiles (principal e invitados): nombre, color |
exercises | Catálogo: nombre, grupo muscular, tipo, suplentes |
routines | Planes: días → bloques → ejercicios |
sessions | Entrenos registrados: ejercicios, series, duración, notas |
progress | Peso corporal y medidas por fecha |
nutrition | Planes de alimentación: variantes de día → comidas → opciones → alimentos, y tus platos |
files | Documentos guardados en el dispositivo (PDF, fotos): nombre, tipo y contenido |
traindia/
├── index.html · shell, presentación, tema (variables CSS), SEO
├── styles.css · estilos de componentes
├── app.js · estado, router, onboarding, perfiles, ajustes, presentación
├── db.js · IndexedDB, semilla y migraciones
├── ui.js · modales, toasts, formularios, selector de color, gráficas SVG
├── data.js · plan semilla + guías
├── views-plan.js · planes, días, lugares, catálogo, guías
├── views-sessions.js · registro en vivo / manual, historial
├── views-progress.js · progreso corporal, por ejercicio, récords, comparativa
├── views-nutrition.js · nutrición: pauta del día, platos, importador por IA
├── views-data.js · importar / exportar
├── manifest.json · metadatos PWA
├── sw.js · service worker (offline)
├── ui-*-light/dark.jpg · capturas de la presentación (y de este README)
├── og-image.jpg · imagen al compartir (1200×630, <300 KB o WhatsApp no la agranda)
├── robots.txt · sitemap.xml · google*.html · SEO y verificación
└── icon*.png · icon.svg · favicon* · iconos (app, maskable, favicon)
Los Service Workers necesitan un servidor (abrir index.html con doble clic no basta):
python3 -m http.server 8000 # o: npx serve
Abre http://localhost:8000.
Publicado con GitHub Pages desde el workflow .github/workflows/pages.yml: cada push a main empaqueta el repositorio tal cual (no se construye nada) y lo publica. También se puede relanzar a mano desde la pestaña Actions.
El último paso del workflow comprueba que la web sirve de verdad el CACHE_NAME recién subido; si en cinco minutos no lo hace, la ejecución sale en rojo. Antes se usaba el despliegue automático de Pages, que se saltaba pushes sin avisar y obligaba a desatascarlo con commits vacíos.
El dominio propio está tanto en los ajustes del repositorio como en el archivo CNAME de la raíz, que viaja en el artefacto.
[!IMPORTANT] Actualizaciones: el service worker es network-first para los archivos propios (con
{cache:'reload'}, para saltarse también la caché HTTP de Pages), así que con conexión siempre sirve lo último y los cambios se ven al recargar. Aun así, subeCACHE_NAMEensw.jsen cada despliegue (traindia-build-N): es lo que descarta la copia offline antigua. Las fuentes externas sí van cache-first.
[!NOTE] Tus datos no se tocan al actualizar. Los archivos viven en Cache Storage y los datos en IndexedDB: son almacenes distintos. Subir
CACHE_NAMEsolo renueva los archivos; el perfil, sesiones y progreso permanecen.
© 2026 Raúl Márquez. Todos los derechos reservados.
Este repositorio es público con fines de demostración y portafolio. Puedes ver el código y la app, pero no está permitido copiarlo, reutilizarlo, redistribuirlo ni publicarlo (total o parcialmente) sin permiso expreso del autor. Al no incluir una licencia de código abierto, se aplican los derechos de autor por defecto (all rights reserved).