unsubbed.co

Garmin Grafana

Garmin Grafana handles fetch data from Garmin servers for local storage and visualization as a self-hosted solution.

A self-hosted pipeline that turns your Garmin watch into a full analytics platform. No subscriptions, no data sharing, no limits on what you can see.

TL;DR

  • What it is: A BSD-licensed Docker container that pulls every metric from your Garmin Connect account, stores it in InfluxDB, and renders it as a Grafana dashboard you control [README].
  • Who it’s for: Garmin watch owners frustrated by the app’s limited date ranges, capped chart types, and the fact that all your biometric data lives on Garmin’s servers. Also anyone who wants to export or analyze their health data programmatically [1][README].
  • Cost savings: No direct paid SaaS equivalent — Garmin Connect is free, so the value here is depth and ownership, not bill elimination. The setup runs on a $5–10/mo VPS or a Raspberry Pi you already own [README][1].
  • Key strength: It collects metrics the official Garmin app buries or aggregates away — raw HRV, SpO2 throughout the night, hourly step heatmaps, GPS track overlays — all in a single custom dashboard you can pan across months of data [README][1].
  • Key weakness: This is a personal data pipeline, not a product. Setup requires Docker, Linux comfort, and a willingness to manage InfluxDB and Grafana yourself. If your Garmin login changes or Garmin updates their API, things can break and you’ll need to fix them [README].

What is Garmin Grafana

Garmin Grafana is an open-source project by developer Arpan Ghosh that sits between your Garmin watch and a Grafana dashboard. The flow is: your watch syncs to the Garmin Connect app as usual → a Python script running in Docker authenticates with Garmin Connect’s API and pulls your health metrics → the data lands in a local InfluxDB time-series database → Grafana reads that database and renders it as a dashboard you’ve configured [README].

The project has 3,017 GitHub stars and 189 forks as of this review — unusually high for a personal-use tool, which tells you the pain point is real [merged profile].

A few things are worth being clear about up front. First, this is not affiliated with Garmin or Grafana Labs in any way — the README carries a prominent disclaimer to that effect [README]. Second, it is not a replacement for the Garmin app; your watch still needs to sync through Garmin Connect. What it replaces is the visualization and storage layer — you’re adding a parallel pipeline that keeps a local copy of everything and lets you do more with it.

The sister project for Fitbit users (fitbit-grafana) works identically, by the same author [README][1].


Why people choose it

The XDA Developers review [1] captures the core appeal in one sentence: the official apps let you view metrics for a day or a week at a time, but this setup “lets you view and compare data from months, giving you a better idea of your progress over a long period.”

That temporal limitation is the thing that drives people to this project. Garmin Connect’s charting is oriented around daily summaries and weekly reviews. It doesn’t give you a panel showing six months of resting heart rate with a sleep quality overlay. It doesn’t let you zoom into a specific two-week window and correlate HRV dips with your travel schedule. It doesn’t let you combine arbitrary metrics on a single chart [1][README].

The second driver is data sovereignty. Every Garmin user’s biometric data — sleep patterns, stress levels, body composition, GPS routes, heart rate minute-by-minute — lives on Garmin’s servers. Garmin has a reasonable privacy policy, but it’s still a company with commercial incentives and potential acquisition targets. This project keeps a complete local copy of your data and builds dashboards against that copy. If Garmin’s API changes, shuts down, or you stop paying for a device, your historical data is still there [README][1].

The third driver, less obvious but mentioned in the README, is raw data access. Garmin Connect’s app shows you processed, averaged summaries. InfluxDB stores what the API actually returns — which includes data the app doesn’t surface at all, like minute-by-minute SpO2, breathing rate throughout sleep stages, and full GPS track data (pace, altitude, heart rate overlaid on route) from workouts [README].


Features

Based on the README and what the XDA review describes:

Health metrics collected:

  • Heart rate (resting, throughout the day, during workouts) [README]
  • Hourly steps heatmap [README]
  • Daily step count [README]
  • Sleep data: SpO2, breathing rate, sleep movements, HRV, sleep score [README]
  • Sleep regularity heatmap (your sleep/wake pattern visualized over weeks) [README]
  • Stress data and body battery levels [README]
  • Calories [README]
  • Activity minutes and HR zones [README]
  • Activity timeline (workouts listed chronologically) [README]
  • GPS data from workouts: track, pace, altitude, heart rate [README]

Data pipeline features:

  • Automatic sync at regular intervals — set it once, it updates itself [README][1]
  • Historical data backfill — pull all your old Garmin data on first run [README]
  • Import from Garmin Connect local export files (for the full archive) [README]
  • Multi-user support — documented setup for a second account, e.g., a partner [README]
  • CSV export from Grafana for external analysis in Python or Excel [README]
  • InfluxDB backup tooling documented in the project [README]

Deployment options:

  • Automated shell script installer (recommended for less technical users) [README]
  • Manual Docker Compose setup [README]
  • Kubernetes via Helm chart with a Makefile for minikube testing [README]
  • Synology NAS deployment guide in the GitHub Discussions [README]

Pricing: SaaS vs self-hosted math

This is where the Garmin Grafana value prop differs from most tools on this site. Garmin Connect is free. You’re not replacing a SaaS bill — you’re extending a free service with deeper analytics you can’t get anywhere else.

The closest paid alternative is something like Runalyze, a German sports analytics platform aimed at endurance athletes, which runs roughly €4–8/month. But Runalyze is a different product — it’s focused on training load and race predictions, not raw biometric dashboards across all health metrics [data not available for direct comparison].

The real cost of Garmin Grafana is infrastructure:

  • Raspberry Pi at home: ~$0/month ongoing after hardware cost. Works if your home network stays up.
  • Small VPS (Hetzner CX22, Contabo VPS): $4–8/month. Runs continuously, accessible remotely.
  • Docker Desktop on a local machine: $0/month but only runs when the machine is on.

Recommended minimum specs: 1GB RAM (Grafana + InfluxDB are not demanding), 10–20GB storage for a year of health data.

The stack you’re running: Grafana (free open source), InfluxDB (free open source under MIT for InfluxDB 2.x community edition), the garmin-grafana Python container (BSD-3-Clause, free). Total software cost: $0 [README].

If you’re a Garmin watch owner already paying $0 for Garmin Connect, the honest math is: $0 saved, but you gain data access you can’t buy anywhere at any price.


Deployment reality check

The README offers two install paths: an automated shell script (explicitly labeled “recommended for less techy people”) and manual Docker Compose. The XDA review [1] confirms that “the entire setup is containerized, so you need to use Docker to set up the dashboard.”

What you actually need:

  • Docker and docker-compose (Linux, macOS, or Windows WSL)
  • A machine that stays running (VPS, Raspberry Pi, NAS, home server)
  • Garmin Connect credentials (the script handles OAuth token management) [README]
  • A domain and reverse proxy (optional, only needed if you want to access the dashboard remotely with HTTPS)

The automated installer handles the Docker setup, prompts you for credentials, and configures the initial data pull. The README notes it’s for first-time setup only — you don’t re-run it to update [README].

First sync: historical backfill is a separate step from ongoing sync. On first run, you tell it how far back to pull. For a user with three years of Garmin data, this will take a while depending on the API’s rate limits [README].

What can go sideways:

  • Garmin’s API is unofficial and undocumented (the project uses the garminconnect Python library). Garmin has changed authentication flows before — the project’s issues page is the place to watch for this. The README suggests ChatGPT for debugging, which is a candid acknowledgment that the maintainer can’t support everyone [README].
  • InfluxDB 2.x vs 1.x: the project targets InfluxDB 2.x. If you already have an InfluxDB 1.x instance running, that’s a separate migration.
  • The Kubernetes path via Helm is available and documented, but it’s genuinely unnecessary for a personal health dashboard. Don’t go that route unless you’re already running a home Kubernetes cluster [README].
  • Multi-factor authentication on Garmin Connect has historically caused issues with tools that use the unofficial API — worth checking the issues tab before assuming this will work seamlessly if you have MFA enabled.

Realistic time estimate: 30–60 minutes on a clean VPS for someone comfortable with Docker Compose. 2–3 hours for someone following a guide for the first time, including figuring out InfluxDB’s web UI and Grafana’s data source setup.


Pros and cons

Pros

  • Full data ownership. Your health metrics stay on your hardware. No third party sees your sleep patterns, stress data, or GPS routes [README][1].
  • Temporal depth Garmin Connect doesn’t offer. View and filter months or years of any metric. Zoom, overlay, correlate [1][README].
  • Metrics the app doesn’t surface. Raw HRV, SpO2 throughout sleep stages, minute-by-minute data that Garmin averages away in their UI [README].
  • Truly set-and-forget after setup. Syncs automatically on a schedule; no manual data exports [README][1].
  • Historical backfill works. Pull years of existing Garmin data on first run, not just data going forward [README].
  • Multi-user. If you and a partner both use Garmin watches, there’s a documented path to a shared instance [README].
  • BSD-3-Clause license. Permissive — use it, fork it, embed it, no commercial restrictions [merged profile].
  • Kubernetes + Helm. Overkill for personal use, but if you’re running a homelab cluster, there’s a clean deployment path [README].
  • Active community. 3,017 stars, 189 forks, 252 commits, active discussions including NAS-specific guides [merged profile][README].

Cons

  • Depends on an unofficial Garmin API. Not documented or supported by Garmin. Has broken before when Garmin updates auth. Will break again [README].
  • Requires technical setup. Docker is the minimum bar. Setting up InfluxDB data sources in Grafana and configuring dashboards requires reading documentation. The installer script reduces friction but doesn’t eliminate it [README][1].
  • Not a commercial product. No support contract, no uptime SLA, no bug tracker you can file a ticket in and expect resolution. The maintainer is one person [README].
  • Grafana customization is on you. The project ships a sample dashboard, but making it look exactly how you want requires learning Grafana’s query builder and panel configuration [1].
  • Limited third-party reviews. This is a personal project with a strong community but no independent in-depth reviews beyond the XDA writeup [1]. “Works for most people” is the honest quality bar, not “production-validated.”
  • No push notifications out of the box. Grafana supports alerts, but configuring them (email, Telegram, PagerDuty) is a separate project [README].
  • InfluxDB retention and backup is your problem. If your disk fills up or the database corrupts, that’s on you. The README documents backup procedures but doesn’t automate them [README].

Who should use this / who shouldn’t

Use Garmin Grafana if:

  • You own a Garmin watch and have ever wanted to see six months of sleep quality in one chart.
  • You’re comfortable running Docker containers, or you’re willing to spend an afternoon learning how.
  • You care about keeping your biometric data off third-party servers.
  • You want to export raw health data for analysis in Python, Excel, or a BI tool.
  • You have a Raspberry Pi, NAS, or cheap VPS sitting around doing nothing.

Skip it if:

  • You don’t own a Garmin device. (For Fitbit, use the sister project instead [README].)
  • You’ve never touched a terminal and don’t want to learn. The automated installer reduces friction, but you’ll still need to troubleshoot something eventually.
  • You want a polished product with support. This is a community project. When it breaks at 2am, you’re fixing it yourself.
  • You use a different fitness ecosystem (Apple Health, Polar, Suunto) — there’s no support for those here.
  • You primarily care about training analytics (race prediction, training load, VO2max trends) rather than raw biometric visualization. Tools like Runalyze or Intervals.icu serve that need better.

Alternatives worth considering

  • Garmin Connect (official app): Free, no setup, limited chart depth and date ranges. Works for casual users. Insufficient for data-obsessed users [1].
  • Runalyze: Web-based sports analytics platform, ~€4–8/month, focused on endurance training load and race predictions. Richer training analytics, less raw biometric visualization, your data on their servers. Data not available on exact feature overlap.
  • Intervals.icu: Free for basic use, strong on training load and cycling/running power data. Connects to Garmin via sync. Not a visualization tool in the same sense.
  • fitbit-grafana: The sister project by the same author, identical architecture, for Fitbit devices [README].
  • Grafana + custom data sources: If you’re already running Grafana for other infrastructure monitoring, you could build this yourself. This project saves you the work of figuring out the Garmin Connect API and InfluxDB schema.
  • Home Assistant with Garmin integration: If you’re already running Home Assistant, there are community integrations that pull some Garmin metrics into HA. Less depth than this project, but fewer moving parts if you’re already in that ecosystem.

Bottom line

Garmin Grafana solves a specific, real problem: the official Garmin app gives you a narrow window into your own data. This project busts that window open. You get everything — raw metrics, arbitrary date ranges, custom dashboard layouts, programmatic export — on hardware you control, at whatever VPS cost you’re already paying.

The catch is proportional to how non-technical you are. This is not a web app with a sign-up button. It’s a Docker pipeline that requires you to care enough to set it up and maintain it. For someone comfortable with Linux containers, it’s an afternoon project. For someone who has never touched a terminal, it’s a steeper investment.

If you’re a Garmin user who has ever opened the Connect app and wished you could see your resting heart rate trend across the past year, or wanted to know if your sleep quality actually tracks with your training load, this is the tool that shows you that. It won’t save you money — Garmin Connect is already free. What it gives you instead is access to data that’s technically yours but practically inaccessible until you run this.


Sources

  1. Sumukh Rao, XDA Developers“If you use a Fitbit or Garmin smartwatch, you need to set up this Grafana dashboard” (May 10, 2025). https://www.xda-developers.com/if-you-use-fitbit-or-garmin-smartwatch-you-need-to-set-up-this-grafana-dashboard/

Primary sources:

Features

Authentication & Access

  • Single Sign-On (SSO)
  • Two-Factor Authentication

Integrations & APIs

  • Plugin / Extension System
  • REST API

Analytics & Reporting

  • Charts & Graphs
  • Metrics & KPIs