Rasmus MäkinenBiomedical engineering · Turku
BlogPosts on health tech and training AboutWho I am, what I'm looking for ProjectsWhat I've built and worked on TrainingRunning, triathlon, my training data 43bpmResting HR · 7-day avg 67msHRV · 7-day avg 4h 25minTraining · last 7 days

Baseline

A training and health dashboard I built on top of my own Garmin data.

Role
Everything, design to code
Built with
Python, SQLite, React
Status
Private, in daily use
Screenshots
Synthetic demo data

My watch collects a lot of data. The apps around it mostly turn that into scores: readiness, recovery, a number out of 100. I wanted to see the actual numbers instead, where each one comes from, and how they change over weeks and months.

So I built Baseline. It’s a local app that reads the files my Garmin sync already writes, and shows training, sleep and recovery side by side.

A single run in Baseline: route, pace and heart rate streams, heart rate zones and best efforts.
One run: route coloured by pace, linked pace and heart rate charts, and best efforts ranked against every other run.

Decisions that shaped it

No scores. There are no readiness scores, streaks, badges or traffic lights. They feel helpful, but they hide how the number was made, and they’re easy to over-trust.

Every number explains itself. Each value has a small “how calculated” note: the inputs, the time window, how many days of data it had and which device recorded it. If two devices disagree, it says so instead of averaging them.

Not a medical device. Baseline describes, it doesn’t diagnose or predict injuries. That’s a product choice and a regulatory one: staying a training log keeps it clearly outside medical device rules.

My data stays on my computer. The app runs locally. I also built a browser-only version where you drop in your whole Garmin export and nothing is uploaded anywhere. On my own export (about three years of data), the summaries are ready in about a second and all 12,461 workout files are read in about a minute.

Comparing three interval sessions rep by rep in Baseline.
Comparing similar interval sessions rep by rep: pace, heart rate and how fast the heart rate drops between reps.

What I learned

  • Data quality took most of the time. Device changes, time zones when travelling and half-synced days all show up in real data, and the app has to show them honestly instead of hiding them.
  • The default view mattered more than adding features. I ended up showing the most useful thing first and putting everything else one click away.
  • Building with AI coding agents is fast, but it needs clear rules, tests and small steps. The project has a test suite and a written decision log for that reason.
Trends view in Baseline with aligned charts.
Trends: aligned charts with a shared cursor, so training, sleep and recovery can be read together.

The code isn’t public yet. Screenshots on this page use synthetic demo data, not mine.