尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗App web (PWA) para iPhone. Lee tus actividades de Strava y muestra: kilómetros de la semana, tendencia de ritmo, tiempos esperados, mejores marcas, desgaste de tenis y tus próximos entrenamientos.
Descomprime el zip y sube todo el contenido al repositorio (en github.com: Add file → Upload files). No subas node_modules ni .env.
STRAVA_CLIENT_ID (el ID de cliente de tu app de Strava)STRAVA_CLIENT_SECRET (el secreto de cliente)algo.vercel.app.Los tokens que Strava muestra en la página de configuración solo tienen permiso básico y no pueden leer actividades ni tenis. Hay que generar uno nuevo:
https:// (por ejemplo algo.vercel.app).https://algo.vercel.app/api/callback, toca Autorizar con Strava y acepta todos los permisos.STRAVA_REFRESH_TOKEN y vuelve a desplegar (Deployments → ⋯ → Redeploy).app/api/callback cuando termines.Abre la dirección en Safari → Compartir → Agregar a pantalla de inicio.
data/config.json: meta semanal de km (weeklyGoalKm) y vida útil de tenis en km (shoeLifeKm; para un modelo en particular usa shoeLifeOverrides, por ejemplo { "Boston": 700 }).data/plan.json: tu carrera objetivo (goal) y tus entrenamientos (sessions). Cada vez que Claude te dé un plan nuevo, se reemplaza este archivo y Vercel republica la app sola.Formato de una sesión:
{
"date": "2026-10-20",
"type": "Rodaje",
"title": "Rodaje suave",
"distance_km": 8,
"pace_target": "6:10",
"expected_time": "0:49:20",
"shoe": "ASICS Nimbus 27",
"notes": "Frecuencia cardiaca en zona 2"
}
Una sesión cuyo type (o title) diga fuerza, core, gym, pesas, movilidad, etc. se trata como fuerza: sin km, ritmo ni tenis, y sin la marca "Sin registro". Ejemplo:
{
"date": "2026-10-21",
"type": "Fuerza",
"title": "Fuerza de piernas y glúteos",
"duration_min": 25,
"url": "https://www.youtube.com/watch?v=XXXX",
"notes": "3 series de 12 repeticiones"
}
"videos": [{ "title": "Core 10 min", "url": "https://..." }, "https://..."]; la sesión se expande con un botón por video.url, link, video o youtube, o simplemente escrito dentro de notes (se convierte en botón). Solo se aceptan direcciones http o https.duration_min es opcional y se muestra como "25 min".En tablet y escritorio la app se acomoda en dos columnas (Inicio y Progreso) y se centra con un ancho máximo.
Tu personaje aparece arriba en Inicio, con un globo de texto, y cambia según tus datos (en este orden):
Al tocarlo salta, y mientras se actualizan los datos corre. Si tu iPhone tiene activado "Reducir movimiento", se queda quieto.
public/mascota/ (una tira de 8 cuadros por animación) y sus duraciones en lib/mascotAnims.ts.decide de components/Mascot.tsx.En la tarjeta del personaje hay un botón discreto ▶ Voy a correr. Al tocarlo:
El estado se guarda en el navegador de ese dispositivo (no se comparte entre tu iPhone y otras pantallas). No usa la API de Garmin: es un aviso manual.
La app puede mandarte una notificación:
Cómo funciona: la campana 🔔 de arriba activa los avisos en ese dispositivo; un servicio de tareas programadas llama a /api/notify a las 5:30 y a las 18:00. En iPhone hace falta iOS 16.4 o más nuevo y abrir la app desde la pantalla de inicio.
Configuración (una sola vez):
KV_REST_API_URL y KV_REST_API_TOKEN.VAPID_PUBLIC_KEY, VAPID_PRIVATE_KEY (par de llaves de los avisos) y CRON_SECRET (una contraseña larga inventada). Opcional: VAPID_SUBJECT (por ejemplo mailto:[email protected]). Vuelve a desplegar.https://TU-DOMINIO/api/notify?slot=amhttps://TU-DOMINIO/api/notify?slot=pm
En cada una agrega el encabezado Authorization: Bearer TU_CRON_SECRET (o, más simple, añade &key=TU_CRON_SECRET a la dirección).https://TU-DOMINIO/api/notify?test=1&key=TU_CRON_SECRET y debe llegar un aviso. Con &dry=1&slot=am (o pm) ves qué enviaría sin mandar nada.Mientras falte alguna de estas piezas, la campana y el botón no aparecen y todo lo demás funciona igual.
Muestra VFC, sueño, pulso en reposo y Body Battery de la API personal de Garmin (GARMIN_PERSONAL_API_KEY en Vercel). Arriba dice de qué día es el dato: "Datos de hoy" o "Último dato: lun 26 oct · aún no hay de hoy (sincroniza tu reloj)", más la hora de la consulta. Garmin solo tiene la VFC y el sueño de hoy después de que el reloj sincroniza con Garmin Connect. El botón de actualizar también refresca esta tarjeta (la app conserva la respuesta solo 1 minuto). Si Garmin rechaza la llave, la tarjeta se oculta.