Chartlek

Every run you've ever done, charted.

A self-hosted running dashboard for your Garmin history. It caches your runs in SQLite and draws them with D3: per-run heart rate zones, wellness data, Strava gear, weather and terrain maps.

View on GitHub

The Overview page: kilometers run, goals, distance per month, trailing 365 day kilometers, pace against distance, streaks, a weekly heatmap and personal records.

Interactive by design

The charts are not pictures. Most of the value is in moving the pointer over them.

Hovering the trailing 365 day line on the Overview: the runs of the year before that day are highlighted in the distance bars and as amber dots in the pace scatter.

Features

The Overview page in the dark theme.

Overview

Pick All time, a year or a month and every widget follows: distance per period, trailing kilometers, pace against distance, streaks, a weekly heatmap and personal records. Light, dark or System theme.

A run page with weather, gear, distance, time, pace, heart rate, a performance index, pace variability wheel and elevation profile.

Run page

Everything about one run: weather, gear, a VDOT performance index with an estimated finish time, notables, workout steps, a pace variability wheel, heart rate zones and one shared cursor across the route map and charts.

The Pro Map: a route coloured by pace, with a distribution of time per pace bucket and a change in pace graph underneath.

Pro Map

A full-page map of one run, coloured by pace, heart rate, grade or cadence. Click a bar to isolate a bucket, or pick the fastest segments and splits.

Pace Trends: runs as dots at their VDOT with a fitted trend, a resting heart rate overlay and a timeline to brush.

Pace Trends

Is your fitness going up? A fitted trend through your best runs, the change in VDOT per week, and an optional overlay of resting HR, HRV or sleep.

PR Progress: every run by distance and pace, with the all-time PR line and a table of PRs per distance.

PR Progress

Every run by distance and pace, your all-time best at each benchmark distance, the PRs you can beat next, and the next round time below each PR.

Wellness: resting heart rate, heart rate variability, sleep and Body Battery charts on one shared timeline.

Wellness

Garmin health data for your whole history on one timeline and one hover cursor: resting HR, HRV, sleep, Body Battery, stress and weight.

Training Bands: weekly training time stacked by pace zone, over all time.

Training Bands

Your weekly training time stacked by pace, heart rate or grade. It answers how much of your running was actually easy.

Gear: a table of shoes with runs, distance and time, plus distance per month and distance over time charts.

Gear

Your Strava shoes, read-only: runs, distance and last used per pair, with distance per month and over time.

A yearly goal: distance done, how far ahead or behind the direct path, needed per day, and a progress chart with a catch-up line.

Goals

Monthly and yearly distance goals with a direct path, the distance needed per day and a catch-up line when you fall behind.

Your data stays yours

Chartlek runs on your own machine. Everything lives in SQLite on your disk. It only reads from Garmin and Strava and never writes back, and there is no analytics.

Get started

You need Docker and your own Garmin Personal API key. Then:

cp .env.example .env   # fill it in
docker compose up -d

Open http://localhost:9295. The README has the variables and the first run.

Chartlek is a personal project. There is no hosted version and there won't be one: you run it yourself, at your own risk, and keep your keys and health data safe. It has no authentication, so keep it on a private network. Read more.