Skip to main content

Changelog


Novedades de Vetta Trainer. Las fechas son del deploy a producción.


2026-05-28 — 🚀 VETTA TRAINER ENVIADA A GOOGLE PLAY STORE (Closed Alpha)


Hito

Renso completó la configuración Play Console y envió Vetta Trainer a

review de Google. Status: "Cambios en revisión" con 13 cambios.


Lo que se envió

  • AAB 1.0.0 (701 kB) generado por PWABuilder.
  • 28 países/regiones (LATAM + EU + US + AR).
  • Lista de testers "Vetta Alpha Testers".
  • Ficha Play Store es-419 completa (nombre + descripción + assets).
  • Clasificación: PEGI 3 / All ages.
  • Categoría: Salud y bienestar.
  • Audiencia: 18+.
  • Política de privacidad: `https://vettatrainer.com/privacy`.
  • Data Safety form completo (10 tipos de datos).
  • URL eliminación cuenta: `https://vettatrainer.com/eliminar-cuenta`.

  • Cambio de código

  • `80e4288` — Endpoint público `/eliminar-cuenta` con instrucciones
  • GDPR para eliminar cuenta (requisito Google Play Data Safety).


    Próximo

  • Esperar review Google (1-7 días, TWA suele ser 1-2).
  • Cuando aprueben, los testers reciben mail opt-in.
  • Empieza ventana 14 días mínimo de closed testing.
  • Renso suma testers (objetivo 12+) durante esos 14 días.
  • Después → promover a Production track.

  • 2026-05-28 — ✅ PROD RECUPERADA (causa raíz: SyntaxError Python 3.11)


    Causa raíz confirmada

    Railway "Diagnose" AI identificó: SyntaxError en `vetta_server.py` —

    backslash dentro de f-string. PEP 701 (Python 3.12) lo permite,

    Python 3.11 lo prohíbe. El server crasheaba en startup → healthcheck

    siempre fallaba → 502 perpetuo desde 25-05 23:25.


    Fix raíz (1 línea)

  • `b70ce8e` — `Dockerfile`: `FROM python:3.11` → `FROM python:3.12`.

  • Bonus fix incluido en la sesión

  • `461aee9` — `/healthz` ahora acepta `HEAD` además de `GET` (Railway
  • healthcheck usa HEAD; antes respondía 405 Method Not Allowed).


    Verificación post-recovery

  • `/healthz` → 200 OK.
  • `/api/v1/version` → boot `2026-05-28T03:40:46Z`.
  • `/api/v1/twa-status` → `sha256_fingerprints_set:true`.
  • `/.well-known/assetlinks.json` → SHA256 cargado.
  • Landing → 200 OK.

  • TWA 100% listo

    Renso puede ir a Play Console → "Revisar version" → "Iniciar

    lanzamiento a Prueba cerrada" → empieza ventana 14 días mínimo

    de closed testing.


    Lección durable

    Mi env Python local (3.12) ocultaba SyntaxErrors que Python 3.11

    expone. Alinear siempre versión Python local con prod. Railway

    Diagnose AI: usar primero antes de iterar fixes ciegos.


    2026-05-28 — Recovery Railway en autónomo (parcial — sigue 502)


    Intentado (4 commits pusheados, ninguno desbloqueó)

  • `3e1d82a` — Crear `Dockerfile` explícito con `python:3.11-slim` +
  • `railway.json` con `builder: DOCKERFILE`.

  • `a02adf2` — Eliminar `nixpacks.toml`, `runtime.txt`, `.python-version`
  • para que Railway no dude sobre qué builder usar.

  • `7ebf840` — Simplificar Dockerfile: `python:3.11` full (sin slim),
  • sin `EXPOSE`, `CMD` JSON con `sh -c` para expandir `$PORT`.

  • `cdc71c0` — Print `[docker-cmd] PORT=...` + uvicorn `--access-log`
  • para que los logs del deploy sean diagnosticables.


    Diagnóstico ejecutado

  • Local `python -c "import vetta_server"` → OK.
  • Local `uvicorn vetta_server:app` → `/healthz` 200 OK.
  • Railway status global → fully operational.
  • Conclusión: el problema es 100% infra Railway / build Docker.

  • Handoff

  • Doc nuevo `RAILWAY_RECOVERY.md` con instrucciones step-by-step
  • para Renso: dashboard Railway → ver logs del último deploy →

    identificar caso (Build falla / Deploy falla / Healthz timeout)

    → compartir error → fix en 5 min.


    2026-05-25 — Hito Play Store en curso + bloqueo Railway


    En proceso (bloqueado al cierre)

  • Cuenta Play Console creada y verificada (USD 25 pagados, identidad aprobada).
  • AAB generado por PWABuilder con package `com.vettatrainer.app`.
  • AAB subido a track "Prueba cerrada - Alpha" en Play Console.
  • SHA256 de Play App Signing obtenido: `4C:3C:84:4D:3D:AD:AE:83:E3:0B:5D:69:5F:8A:F9:8D:8B:DF:F6:41:7C:96:FC:E0:31:1F:E0:2E:06:F4:1D:11`.
  • Env vars `VETTA_TWA_SHA256` y `VETTA_TWA_PACKAGE` cargadas en Railway.

  • Bloqueado

  • Railway redeploy fallando con `Could not find a version that satisfies pandas>=2.0`.
  • 2 intentos de fix: pin pandas<3.0/numpy<3.0 (commit `bd4c25c`) + pin Python 3.11 via runtime.txt + .python-version + nixpacks.toml (commit `8316d11`).
  • Estado al cierre: prod no responde (timeout en todos los endpoints).

  • 2026-05-25 — Hito Play Store (bloque autónomo): assets + /descargar + copy + Data Safety


    Agregado

  • Manifest avanzado con 4 shortcuts (Mi semana, Calendario,
  • Herramientas, Mi perfil) y 4 screenshots referenciadas.

  • 6 assets PIL generados dinámicamente para Play Console:
  • `/play-store/feature-graphic.png` (1024×500), `/play-store/icon-1024.png`,

    `/play-store/screen-{1,2,3,4}.png` (1080×1920 cada uno).

  • Página `/descargar` pública en es/en/de/fr con badge Google Play
  • inline, 6 features, 4 screenshots, nota iOS. Aliases `/download` (302

    → en) y `/app` (302 → es).

  • Endpoint `/api/v1/twa-status` para diagnóstico del setup TWA.
  • PLAY_STORE.md expandido con 4 anexos: URLs assets, copy 4
  • idiomas (ES + EN completos 4000 chars), Data Safety form pre-armado

    (~15 preguntas Play Console respondidas), diagnóstico TWA en vivo.

  • `/descargar` sumado al sitemap (priority 0.8) y al footer global
  • 4 idiomas (columna Producto).


    2026-05-25 — Hito Play Store: pre-requisitos de código aplicados


    Agregado (habilitadores TWA)

  • `/.well-known/assetlinks.json` endpoint nuevo. Habilita TWA
  • (Trusted Web Activity) — sin esto, la app Android del Play Store

    muestra la barra de URL del navegador. Lee `VETTA_TWA_SHA256` (lo da

    Play Console al subir el primer AAB) y `VETTA_TWA_PACKAGE` (default

    `com.vettatrainer.app`).

  • Manifest TWA-friendly: agregados `id`, `dir`, `display_override`
  • (standalone, minimal-ui fallback), `prefer_related_applications:false`.

    Mejora score de PWABuilder.


    Documento nuevo

  • `PLAY_STORE.md` — playbook completo de 7 pasos para lanzar Vetta
  • en Google Play Store via TWA. USD 25 one-time, 5-6 hs activas

    distribuidas. iOS NO entra en este hito.


    2026-05-25 — Fix Sentry: Pillow faltaba en requirements (4 endpoints PNG en 500)


    Arreglado (infraestructura)

  • `Pillow>=10.0` agregado a `requirements.txt`. 4 endpoints PNG estaban
  • devolviendo 500 "PIL no disponible" en prod desde que se agregaron

    (`/og/blog/{slug}.png`, `/og/{slug}.png`, `/share/semana.png`,

    `/share/week.png`). Impacto: las previews OG cuando se comparte el link

    en redes (WhatsApp, Twitter, IG) no mostraban imagen.

  • Reportado por Sentry el 24-05 22:16 UTC. Bug latente desde el bloque 9
  • (sistema OG dinámico) — local funcionaba porque mi entorno tenía Pillow

    instalado; Railway no lo bajaba nunca porque no estaba declarado.


    2026-05-24 — /admin hub completo (vistas usuario + páginas + endpoints)


    Mejorado (UX admin)

  • /admin ahora tiene acceso directo a TODO desde un solo lugar.
  • Pasó de 14 cards a 14 + 6 nuevas + ~80 links en 2 details colapsables.

  • Nueva sección "🧪 Mis vistas como usuario" (6 cards): Dashboard,
  • /training, /calendario, /coach, /onboarding, /demo. Crítico para QA

    end-to-end del flujo coach.

  • Nueva sección "🌐 Todas las páginas públicas" (collapsible):
  • marketing (12) + disciplinas SEO (4) + producto (6) + contenido (2)

    + auth (4) + legal x4 idiomas (6).

  • Nueva sección "🔧 Endpoints técnicos & APIs" (collapsible):
  • salud/version + SEO + datos del usuario + APIs públicas contenido

    + APIs motor + APIs predicciones + admin restringido.


    2026-05-24 — Figuras+viento en /training


    Cambiado

  • `/training` ahora tiene las siluetas laterales runner+cyclist con
  • viento + halo pulsante (igual que landing/informativas/dashboard).

    Antes estaba `side_figs=False` por decisión "foco máximo en el plan";

    Renso pidió revertir esto en producción. Aplicado a las 2 routes:

    vista principal + caso "todavía no hay semana".

  • GO_LIVE.md: nueva sección "🧪 QA end-to-end" con flujo COACHING
  • (11 steps para probar end-to-end usando tu correo como coach + alias

    Gmail como atleta de prueba).


    2026-05-24 — Bug fix detector post-carrera (Coros sin Strava)


    Arreglado (motor)

  • `_detect_carrera_reciente` ahora tiene 2 señales: parquet (Strava) +
  • `profile.objetivos` con fecha en los últimos 3 días. Antes solo miraba

    parquet, por lo que atletas con reloj Coros (sin vincular a Strava)

    no disparaban el auto-taper y el motor les prescribía carga normal al

    día siguiente de una carrera. Ahora si declaraste el objetivo con la

    fecha de hoy y la fecha es pasada, el motor asume que corriste y

    fuerza `fase=taper` la próxima semana. TSS estimado ~8 TSS/km trail.


    2026-05-24 — 3 fixes XSS + validación fecha (audit forms)


    Arreglado (seguridad)

  • XSS en `/api/contacto`: el campo `name` se interpolaba sin escape en el
  • HTML del email a Renso. Fix: `html.escape()` aplicado a `name`, `email` y

    `message` antes de interpolar.

  • XSS en `/api/propuestas`: mismo problema en `tipo`, `name`, `email` y
  • `message`. Fix: escape de los 4 campos.

  • `/api/objetivo` sin validación de formato fecha: aceptaba cualquier
  • string como fecha. Fix: `datetime.fromisoformat()` con `HTTPException 400`

    si el formato es inválido.


    Sin features nuevas

    Verificación adicional sin hallazgos en `/api/waitlist`, `/signup`,

    calculadoras (VDOT/zonas/TSS/altitude) y `/api/regenerar`.


    2026-05-24 — Auditoría + fixes seguridad/eficiencia + figuras dashboard


    Arreglado (dashboard)

  • Figuras laterales con viento ahora se ven en el dashboard. El bug raíz era
  • que las URLs background-image eran `/static/figures/runner-trail` y `/cyclist`

    sin extensión `.png` → 404 silencioso → divs invisibles. Fix: extensión

    agregada + 3 chevrons de viento por figura (animación diagonal) + opacity

    visible subido 0.20 → 0.45 + threshold display bajado 1620px → 1340px (más

    pantallas ahora ven las figuras).


    Mejorado (seguridad)

  • Cookies de sesión en `/login` y `/signup` ahora usan `secure=true` en
  • producción (antes solo `/supabase` callback). Inconsistencia resuelta.

  • Upload Strava ZIP: validación path-traversal en `z.extract` (verifica
  • que el target resuelto esté dentro de `raw_dir` antes de extraer; bloquea

    ZIPs maliciosos con `../`).

  • Webhook Strava POST: defensa adicional — si `STRAVA_WEBHOOK_SUB_ID`
  • está configurado, exige matching del `subscription_id` del body; valida

    tipo `dict` del body y tipo `int|str` del `owner_id`.


    Mejorado (eficiencia)

  • `_load_users()` cachea `users.json` con TTL 5s (antes cada request
  • parseaba JSON desde disco en 58+ call sites). El cache se invalida en

    `_save_users` para no devolver datos stale tras escritura.

  • `/api/v1/posts`, `/api/v1/glossary`, `/api/v1/archetypes` ahora
  • devuelven `Cache-Control: public, max-age=3600` (contenido 100% estático,

    cambia solo en deploys).

  • `/api/v1/archetypes` ya no recarga el módulo `workout_engine` en cada
  • call: cache módulo-level `_ARCHETYPES_CACHE` poblado en primera invocación.


    Sin features nuevas

    Regla durable `feedback-vetta-stop-features` respetada: solo bugs/auditoría.


    2026-05-24 — B63-65 reactivados (docs + endpoints + posts)


    Nuevo

  • 3 páginas /docs públicas más (a 10 total):
  • - `/docs/predicciones` — modelo Daniels, corrección por altitud, dónde pierde precisión.

    - `/docs/strava` — OAuth flow, qué se importa y qué no, privacidad y GDPR.

    - `/docs/coach` — modelo coach, anti-fraude, qué ve y qué no ve el coach.

    - 4 idiomas (es/en/de/fr).

  • 5 endpoints `/api/v1/` nuevos (a 30+ total):
  • - `/api/v1/blog-tags` — tags únicos con conteo (filtro lang opcional).

    - `/api/v1/health` — uptime + git sha + boot_time, ideal para UptimeRobot.

    - `/api/v1/predict-batch?vdot=X` — predicciones para 6 distancias en una llamada.

    - `/api/v1/disciplines-detail` — info por disciplina (arquetipos, filosofías, zone_mode).

    - `/api/v1/changelog-rss` — RSS 2.0 del CHANGELOG.md para feedly/Inoreader.

  • 4 posts blog ES nuevos:
  • - `vert-training-para-trail` — entrenamiento de desnivel específico.

    - `pacing-mental-en-ultras` — Marcora + Noakes, estrategias mentales.

    - `recuperacion-activa-real` — sueño, hielo, sauna, foam roller con evidencia.

    - `lesiones-it-band-runners` — IT band syndrome, prevención y tratamiento.


    2026-05-24 — Cierre final: consistencia pricing/onboarding


    Arreglado (consistencia pricing ↔ código)

  • Predicciones de carrera ahora ocultas en Free (soft paywall + CTA).
  • El pricing decía solo Pro/Coach pero el dashboard de Free las mostraba.

  • Detección de debilidades ahora oculta en Free (mismo soft paywall).
  • Idem mismatch: ahora coincide con el card del pricing.

  • Reportes PDF ahora son solo Coach (gate cambiado de `motor` a
  • `pdf_reports`). El botón en `/training` muestra "📥 PDF · Coach" en gris

    para Pro, normal para Coach.

  • "Plantillas de entrenamiento" (feature que no existía en código)
  • reemplazada por "Notas por sesión con tus atletas" (que sí existe).

    4 idiomas.


    Mejorado (onboarding)

  • Sección "Tu objetivo principal" ahora muestra los objetivos ya
  • cargados (antes solo se veía el botón "Agregar"). Lista con badge

    prioridad A/B + nombre + distancia + fecha + tiempo objetivo.

  • Sección "Mis lugares": el grid de inputs ya no se desborda del
  • card. Responsive @640px (pasa a 2 columnas, botón × debajo).

  • Ancho general del onboarding: 720px → 920px para que la fila de
  • lugares tenga aire.


    Cambiado

  • "Hasta 30 atletas" → "Hasta 80 atletas" en el card Coach (4 idiomas).

  • 2026-05-24 — Cierre features + reorganización + go-live focus


    Mejorado

  • /herramientas reorganizada en 4 secciones temáticas (las 31
  • calculadoras ya no son un mar plano):

    - Pace y ritmos (9): VDOT, ritmos Daniels, easy-pace-vdot, etc.

    - Zonas FC, esfuerzo y carga (9): zonas, karvonen, fcmax, tss…

    - Trail, altitud y clima (6): altitud, vk-pace, descenso-trail…

    - Nutrición, cuerpo y ciclismo (7): calorías, race-weight…

    - Headers con título + subtítulo + contador en es/en/de/fr.

  • GO_LIVE.md reescrito con estado real al 2026-05-24. 3 items
  • bloqueantes (Lemon, welcome mail, GSC), 5 alto ROI (crons, R2,

    IndexNow, Plausible, outreach), 4 estratégicos. Total ~1.5-4 hs de

    acción humana de Renso para empezar a cobrar real.


    Bloqueado por decisión humana (no requiere más código)

  • Lemon Squeezy aprobación → 4 variant IDs en Railway.
  • Welcome mail verificación (signup test).
  • Google Search Console submit.
  • 4 crons en cron-job.org.
  • Cloudflare R2 bucket + 5 env vars.
  • IndexNow key + 1 env var.
  • Plausible Analytics + 1 env var.
  • Outreach a 5-10 coaches AR en IG.

  • 2026-05-24 — 2da pasada autonoma (bloques 55-60)


    Nuevo

  • 4 posts blog EN más (15 → 19): carbs-durante-ultra,
  • estres-cronico-y-rendimiento, pared-del-maraton, trail-nocturno

    (copy nativo, no traducción literal).

  • 3 calculadoras nuevas (24 → 27): /herramientas/negative-split
  • (pacing con 2a mitad más rápida), /herramientas/maf-180 (Maffetone

    aerobic max), /herramientas/watts-per-kg (W/kg + nivel Coggan + VAM

    estimado).

  • 3 docs públicas más (3 → 6 en 4 idiomas): /docs/filosofias
  • (las 13 filosofías del motor con contexto para elegir), /docs/inventario

    (sistema temporal con 4 casos de uso reales), /docs/api (intro al

    catálogo /api/v1 con ejemplo JS).

  • Glosario expandido a 36 términos x 4 idiomas (era 28). Nuevos:
  • HRV, lactato, capilarizacion, MAF, sliding_filament, mitocondria,

    plasma_volume, fast_twitch.

  • Landing /running de calle dedicada en 4 idiomas (era una sub-niche
  • no cubierta). Más 2 sub-niches: /running/marathon, /running/half-marathon.


    Mejorado

  • Total sub-niches SEO: 13 → 15.
  • /api/v1/sub-niches actualizado a 15 entries.
  • Comentario en api_v1_sub_niches actualizado.

  • 2026-05-24 — sesion autonoma "termina todos los puntos" (bloques 49-54)


    Nuevo

  • 6 posts blog en EN con copy nativo (no traducción literal):
  • plan-sub-40-10k, vdot-vs-ftp-vs-css, zonas-fc-vs-ritmo, tapering-avanzado,

    ftp-sin-potenciometro, nutricion-trail-running. Total EN: 9 → 15.

  • 4 calculadoras nuevas (a 24 total): /herramientas/vk-pace
  • (vertical km pace), /herramientas/cho-fueling (carbs/h race),

    /herramientas/tsb-recovery (Banister projection), /herramientas/carb-load

    (pre-race CHO loading).

  • 4 detectores de debilidades nuevos en classify.py (a 20 total):
  • monotonia_foster (Foster Training Monotony Index), strain_foster

    (Foster Strain Index), descenso_volumen (deconditioning 4+ semanas),

    easy_too_fast (rodajes easy corridos cerca del umbral).

  • 3 páginas /docs públicas en 4 idiomas (es/en/de/fr):
  • /docs/motor (cómo funciona el motor — arquetipos, filosofías,

    periodización, ramp_seguro), /docs/zonas (FC Karvonen, ritmo Daniels,

    potencia Coggan, CSS), /docs/tss-ctl-atl (TSS, CTL, ATL, TSB, ACWR).

    Plus /docs index.

  • 5 endpoints /api/v1/ nuevos (a 25+ total): weakness-detectors,
  • docs, zones-spec (fórmulas completas para integraciones),

    glossary-search, engine-info.


    Notas

  • Los textos EN/DE/FR de las nuevas páginas siguen la regla de copy
  • nativo: cómo lo escribiría un nativo, no una traducción literal del ES.

  • /api/v1/zones-spec expone las fórmulas exactas (Karvonen, VDOT, FTP,
  • CSS, Banister) para que terceros puedan replicar el cálculo.


    2026-05-24 — ultra-sesion autonoma (bloques 34-47)


    Nuevo

  • Hub /admin rediseñado: hero card destacado a /admin/control-center
  • + 12 quick links organizados en 3 secciones (Operación, Captación,

    Infraestructura).

  • Auditoría de seguridad del panel admin: 27 rutas /admin/*
  • protegidas con doble guarda (cookie firmada + email whitelist).

  • 4 calculadoras nuevas (a 20 total): Karvonen FC, peso de carrera,
  • conversor min/km↔min/mi con tiempos por distancia, aclimatación al

    calor con heat index.

  • 10 posts blog nuevos: 4 en español (estrés crónico, carbs durante
  • ultra, pared del maratón, trail nocturno) + 6 traducciones nativas

    (DE x3, FR x3): VDOT, polarizado vs piramidal, primer ultra UTMB.

  • 4 sub-niches SEO (a 13 total): /trail/ultra-100k, /trail/ultra-160k
  • (100 millas), /ciclismo/gravel, /triatlon/sprint.

  • Página /casos-uso pública en 4 idiomas con 4 personas: Diego
  • (sub-40 10K), Sole (UTMB OCC), Pablo (granfondo cycling), Vale (70.3).

  • Glosario expandido a 28 términos (era 16) en es/en/de/fr:
  • supercompensación, mesociclo/microciclo/macrociclo, taper, deload,

    Z2, fartlek, EPOC, sleep_debt, RMR, ramp_seguro.

  • 5 endpoints API v1 nuevos: /methods, /sub-niches, /personas,
  • /tools-search, /seo-pages.

  • 4 detectores nuevos de debilidades (a 16 total): terreno_monotono,
  • gym_zero, long_run_insuficiente, balance_disciplinas.

  • /admin/marketing-helper: posts IG/Twitter/LinkedIn copy-paste,
  • calendario editorial 4 semanas, hashtags por plataforma + idioma.

  • PDF export: /api/training/export.pdf abre el plan en versión
  • imprimible con dialogo PDF nativo del browser auto-disparado.


    Mejorado

  • Eliminadas TODAS las menciones a competidores por nombre
  • (TrainingPeaks, Runna) en /comparar, /pricing y FAQ multi-idioma.

    Cambiadas a categorías genéricas ("apps premium", "apps solo running").


    2026-05-22


    Nuevo

  • Landings por nicho: `/trail`, `/ciclismo`, `/triatlon` con copy
  • propio por disciplina. Bajamos también sub-niches: `/trail/ultra-50k`,

    `/trail/maraton-de-montana`, `/ciclismo/granfondo`, `/ciclismo/ftp`,

    `/triatlon/ironman`, `/triatlon/olimpico`.

  • Comparativa: `/comparar` con tabla Vetta vs TrainingPeaks vs Runna.
  • FAQ: `/faq` multilingüe es/en/de con JSON-LD para Google.
  • Legales: `/privacidad` + `/terminos` en 3 idiomas. GDPR Art. 17/20:
  • exportá un ZIP con todos tus datos o eliminá tu cuenta desde Ajustes.

  • Recovery de contraseña: pedís reset desde `/forgot`, recibís un
  • link por email (vive 1 hora) y elegís nueva.

  • Card "sin reloj GPS" en signup y onboarding: te invita a usar
  • Strava mobile si todavía no tenés reloj.

  • Indicador de calidad de datos en `/training`: te avisa cuando tu
  • VDOT/CTL se calculan con muy pocas actividades o datos muy viejos.

  • Entrenos manuales: si entrenás sin Strava, podés loguear un entreno
  • con duración + RPE y el motor lo suma a tu historial (TSS por Foster).

  • Comentarios del coach por sesión: el coach puede dejar una nota
  • pegada a una sesión específica del motor.

  • Inventario con plazos finitos: además del "no lo tengo hasta X",
  • ahora podés marcar "solo lo tengo hasta X" o "solo desde X" (bici

    prestada, equipo que llega más adelante).

  • Taper afinado para ciclismo (-38% volumen) y natación (-35%).
  • Open Graph + Twitter Cards: cuando compartas el link de Vetta
  • por WhatsApp/IG/Twitter aparece con título, descripción e imagen.

  • Sitemap.xml + robots.txt con hreflang es/en/de para Google.

  • Mejorado

  • Header del dashboard rediseñado a Cielo Alpino (fondo oscuro + figuras
  • laterales de runner/cyclist con animación al scroll).

  • Copy de la landing en inglés y alemán reescrito por copywriter nativo
  • (no traducción literal del español).

  • Página de login con link a "¿Olvidaste tu contraseña?".

  • 2026-05-21


    Lanzamiento de la versión SaaS

  • Multi-tenant con login email + Google (vía Supabase Auth).
  • Multi-idioma: español, inglés, alemán (detección por
  • Accept-Language).

  • Multi-moneda: ARS para Argentina, EUR para DACH, USD para resto.
  • Pagos: Mercado Pago (ARS) + Lemon Squeezy (USD/EUR).
  • Motor de entrenamiento: 56 arquetipos paramétricos x 12
  • filosofías (Daniels VDOT, Lydiard, Kilian montaña, Coggan potencia,

    sweet-spot, polarizado, MTB XC, natación CSS, triatlón clásico, etc.).

  • Disciplinas: trail, running de calle, ciclismo de ruta, MTB,
  • natación, triatlón (con día de brick).

  • Resolución de zonas: ritmo (Daniels), FC (Karvonen), potencia
  • (Coggan FTP) o CSS (natación) según `zone_mode`.

  • Predicción de carrera: VDOT del top-3 de los últimos 28 días
  • proyectado a 5K, 10K, 21K, 42K con corrección por altitud.

  • Plan Coach: el coach gestiona N atletas en su `/coach`, con
  • invitación por email y vínculo coach↔atleta.

  • PWA: instalable en Android/iOS, funciona offline lo visitado.
  • Auto-sync de Strava: OAuth + webhook + sync background cada 6h.
  • Panel admin con KPIs de usuarios, cuentas comp y waitlist.

  • Cómo te enterás de los próximos cambios


  • Mirá esta página de vez en cuando.
  • Si das de alta tu cuenta y dejás `subscribe_news=true`, te avisamos
  • por email cuando hay novedades grandes.

  • Seguinos en Instagram (proximamente).