English · Español
A personal health dashboard that connects to Garmin Connect and displays your daily metrics in a clean, mobile-first interface. Works with demo data if no credentials are configured.
Auto-updates: deploying with this button connects your Vercel project directly to this repository. When a new version is released, Vercel redeploys your instance automatically — no action needed on your end.
| Dashboard | Sleep & HRV | Strain & Stress |
|---|---|---|
![]() |
![]() |
![]() |
| Sleep Detail | Strain Detail |
|---|---|
![]() |
![]() |
| Screen | Metrics |
|---|---|
| Dashboard | Recovery score, HRV, Sleep, Body Battery, Strain, Stress, Steps, Calories |
| Sleep | Sleep stages (Deep / REM / Light / Awake), SpO₂, overnight HRV, 7-day trend |
| Strain | Daily strain (0–21 scale), ACWR load ratio, activities breakdown |
| Trends | 7 / 14 / 30-day sparklines, weekly AI summary (optional), PDF export |
| Profile | BMI, VO2max estimate, training zones, weight log |
Key features
- 🌐 English / Spanish toggle (auto-detects browser language)
- 🤖 AI weekly summary via Claude Haiku (optional — requires Anthropic API key)
- 📱 Installable PWA (iOS Safari & Android Chrome)
- 🔔 Body Battery push notifications
- 🎭 Full demo mode — works without Garmin credentials
- 🔒 No database — all personal data stays in your browser (localStorage)
- Framework: Next.js 14 (App Router) + TypeScript
- Styling: Tailwind CSS
- Charts: Recharts
- Garmin:
garmin-connectnpm package - AI: Anthropic Claude Haiku (optional)
Click the Deploy with Vercel button above. You'll be prompted for:
| Variable | Required | Description |
|---|---|---|
GARMIN_USERNAME |
No | Your Garmin Connect email |
GARMIN_PASSWORD |
No | Your Garmin Connect password |
ANTHROPIC_API_KEY |
No | For AI weekly summary (Claude Haiku) |
Leave credentials empty to run in demo mode.
Keeping your instance up to date
Since your Vercel project points directly to this repository, new releases deploy to your instance automatically. If you deployed before v1.5.0 (i.e. you have your own forked GitHub repo), you can enable auto-sync by activating the included workflow:
- Open your forked repo on GitHub
- Go to Actions tab → enable workflows if prompted
- Find "Sync fork with upstream" → click Run workflow
From that point on, every Monday your fork syncs automatically and Vercel redeploys.
# 1. Clone
git clone https://github.com/cggmx/garmin-health-dashboard.git
cd garmin-health-dashboard
# 2. Install dependencies
npm install
# 3. Configure environment
cp .env.example .env.local
# Edit .env.local with your credentials (all optional)
# 4. Run locally
npm run dev
# → http://localhost:3000
# 5. Deploy to Vercel
npx vercel deploy --prodnpm run build
npm start
# Runs on port 3000 by default# Garmin Connect (optional — uses demo data if not set)
GARMIN_USERNAME=your@email.com
GARMIN_PASSWORD=yourpassword
# Garmin OAuth tokens — use these if your account has MFA/2FA enabled (see below)
GARMIN_OAUTH1={"oauth_token":"...","oauth_token_secret":"..."}
GARMIN_OAUTH2={"access_token":"...","refresh_token":"...","expires_at":...}
# AI weekly summary (optional — feature hidden if not set)
ANTHROPIC_API_KEY=sk-ant-...
# Push notifications (optional — generated with npm run generate-vapid)
NEXT_PUBLIC_VAPID_PUBLIC_KEY=...
VAPID_PRIVATE_KEY=...
VAPID_EMAIL=mailto:your@email.comCopy .env.example for the full template.
If Garmin sends you a verification code by email when you sign in, you need to generate OAuth tokens once using the included script:
node scripts/get-garmin-tokens.jsThe script will:
- Ask for your Garmin email and password
- Detect that MFA is required and wait for you to enter the email code
- Automatically add
GARMIN_OAUTH1andGARMIN_OAUTH2to your Vercel project - Redeploy the app
Token expiry: tokens last ~90 days. Re-run the script when they expire. When
GARMIN_OAUTH1/GARMIN_OAUTH2are set,GARMIN_USERNAME/GARMIN_PASSWORDare still needed for display purposes but not for authentication.
Is there an APK or Play Store version? Not at this time. The app is self-hosted by design — your Garmin credentials never leave your own server. A Play Store version would require a central server storing everyone's credentials, which has significant privacy and cost implications incompatible with the open-source, zero-cost nature of this project.
The good news: the app is installable as a PWA directly from your browser — no app store needed, full-screen experience, home screen icon, and push notifications included.
| Platform | Steps |
|---|---|
| iPhone / iPad | Open in Safari → tap Share → "Add to Home Screen" |
| Android | Open in Chrome → tap menu (⋮) → "Add to Home Screen" or "Install app" |
- Garmin credentials are stored only in your server environment (Vercel env vars or
.env.local) - Health data is fetched server-side and never persisted
- Profile, weight log, and preferences are stored in your browser's localStorage only
- No analytics, no tracking, no third-party data collection
MIT © 2025 — free to use, modify, and distribute. See LICENSE.
This project is free and open-source. If it's useful to you and you'd like to say thanks, you can buy me a coffee ☕
This project is free and open-source. If it's useful to you and you'd like to support its development, you can buy me a coffee — completely optional, always appreciated. ☕
Contact: etxt.me/
- garth by @matin — the MFA token script uses Garmin's mobile JSON API, an approach discovered and documented in the garth project.
Dashboard personal de salud que se conecta a Garmin Connect y muestra tus métricas diarias en una interfaz móvil limpia. Funciona con datos demo si no hay credenciales configuradas.
Actualizaciones automáticas: al desplegar con este botón, tu proyecto Vercel queda conectado directamente a este repositorio. Cuando se lanza una nueva versión, Vercel redespliega tu instancia automáticamente — sin que tengas que hacer nada.
| Dashboard | Sueño & HRV | Esfuerzo & Estrés |
|---|---|---|
![]() |
![]() |
![]() |
| Detalle de Sueño | Detalle de Esfuerzo |
|---|---|
![]() |
![]() |
| Pantalla | Métricas |
|---|---|
| Dashboard | Recuperación, HRV, Sueño, Body Battery, Esfuerzo, Estrés, Pasos, Calorías |
| Sueño | Fases del sueño (Profundo / REM / Ligero / Despierto), SpO₂, HRV nocturno, tendencia 7d |
| Esfuerzo | Esfuerzo diario (escala 0–21), ratio ACWR, desglose de actividades |
| Tendencias | Sparklines 7 / 14 / 30 días, resumen IA semanal (opcional), exportación PDF |
| Perfil | IMC, estimación VO2max, zonas de entrenamiento, registro de peso |
Características principales
- 🌐 Toggle inglés / español (detecta el idioma del navegador automáticamente)
- 🤖 Resumen semanal IA con Claude Haiku (opcional — requiere API key de Anthropic)
- 📱 PWA instalable (iOS Safari y Android Chrome)
- 🔔 Notificaciones push de Body Battery
- 🎭 Modo demo completo — funciona sin credenciales de Garmin
- 🔒 Sin base de datos — todos los datos personales quedan en tu navegador (localStorage)
- Framework: Next.js 14 (App Router) + TypeScript
- Estilos: Tailwind CSS
- Gráficas: Recharts
- Garmin: paquete npm
garmin-connect - IA: Anthropic Claude Haiku (opcional)
Haz clic en el botón Deploy with Vercel de arriba. Se te pedirán:
| Variable | Requerida | Descripción |
|---|---|---|
GARMIN_USERNAME |
No | Tu correo de Garmin Connect |
GARMIN_PASSWORD |
No | Tu contraseña de Garmin Connect |
ANTHROPIC_API_KEY |
No | Para el resumen IA semanal (Claude Haiku) |
Deja las credenciales vacías para ejecutar en modo demo.
Mantener tu instancia actualizada
Al usar este botón, tu proyecto Vercel queda conectado directamente a este repositorio y las nuevas versiones se despliegan solas. Si desplegaste antes de v1.5.0 (es decir, tienes tu propio repositorio fork en GitHub), puedes activar la sincronización automática así:
- Abre tu fork en GitHub
- Ve a la pestaña Actions → activa los workflows si te lo pide
- Busca "Sync fork with upstream" → haz clic en Run workflow
A partir de ahí, cada lunes tu fork se sincroniza solo y Vercel redespliega.
# 1. Clonar
git clone https://github.com/cggmx/garmin-health-dashboard.git
cd garmin-health-dashboard
# 2. Instalar dependencias
npm install
# 3. Configurar variables de entorno
cp .env.example .env.local
# Edita .env.local con tus credenciales (todas opcionales)
# 4. Ejecutar localmente
npm run dev
# → http://localhost:3000
# 5. Desplegar en Vercel
npx vercel deploy --prodnpm run build
npm start
# Corre en el puerto 3000 por defecto# Garmin Connect (opcional — usa datos demo si no está configurado)
GARMIN_USERNAME=tu@correo.com
GARMIN_PASSWORD=tucontraseña
# Tokens OAuth de Garmin — úsalos si tu cuenta tiene MFA/2FA activado (ver abajo)
GARMIN_OAUTH1={"oauth_token":"...","oauth_token_secret":"..."}
GARMIN_OAUTH2={"access_token":"...","refresh_token":"...","expires_at":...}
# Resumen IA semanal (opcional — la función se oculta si no está configurado)
ANTHROPIC_API_KEY=sk-ant-...
# Notificaciones push (opcional — genera con npm run generate-vapid)
NEXT_PUBLIC_VAPID_PUBLIC_KEY=...
VAPID_PRIVATE_KEY=...
VAPID_EMAIL=mailto:tu@correo.comCopia .env.example para la plantilla completa.
Si Garmin te envía un código por correo al iniciar sesión, necesitas generar tokens OAuth una sola vez con el script incluido:
node scripts/get-garmin-tokens.jsEl script:
- Pide tu correo y contraseña de Garmin
- Detecta que se requiere MFA y espera a que ingreses el código del correo
- Agrega automáticamente
GARMIN_OAUTH1yGARMIN_OAUTH2a tu proyecto de Vercel - Redespliega la app
Expiración: los tokens duran ~90 días. Vuelve a ejecutar el script cuando expiren. Con
GARMIN_OAUTH1/GARMIN_OAUTH2configurados,GARMIN_USERNAME/GARMIN_PASSWORDsiguen siendo necesarios para mostrar tu nombre, pero no para autenticarse.
¿Hay una APK o versión en la Play Store? Por el momento no. La app es self-hosted por diseño — tus credenciales de Garmin nunca salen de tu propio servidor. Una versión en la Play Store requeriría un servidor central que almacene las credenciales de todos los usuarios, lo que implica responsabilidades de privacidad y costos incompatibles con la naturaleza open-source y gratuita de este proyecto.
La buena noticia: la app se puede instalar como PWA directamente desde el navegador — sin pasar por ninguna tienda, con experiencia en pantalla completa, ícono en el home y notificaciones push incluidas.
| Plataforma | Pasos |
|---|---|
| iPhone / iPad | Abre en Safari → toca Compartir → "Agregar a pantalla de inicio" |
| Android | Abre en Chrome → menú (⋮) → "Agregar a pantalla de inicio" o "Instalar app" |
- Las credenciales de Garmin se almacenan solo en tu entorno de servidor (variables de entorno de Vercel o
.env.local) - Los datos de salud se obtienen del lado del servidor y nunca se persisten
- El perfil, registro de peso y preferencias se almacenan solo en el localStorage de tu navegador
- Sin analíticas, sin rastreo, sin recolección de datos de terceros
MIT © 2025 — libre de usar, modificar y distribuir. Ver LICENSE.
Esta app es gratuita y de código abierto. Si te es útil y quieres agradecerlo, puedes invitarme un café ☕
Este proyecto es gratuito y de código abierto. Si te resulta útil y quieres apoyar su desarrollo, puedes invitarme un café — completamente opcional, siempre agradecido. ☕
Contacto: etxt.me/




