Nico Bodmer

Back to work

Morning check-in

My sports watch data as my own morning page, local and read-only.

Year
2026
Role
Setup, hardening and design of the page
Type
Tool
Technology
MCP, Python, SQLite, Jinja2, Playwright, scheduled tasks
Detail with greeting, the week's weather and a readiness score of 82, sample data
Top detail, with sample data

Starting point

The sports watch collects health data every day, and it stays locked inside the manufacturer's app.

Goal

A page of my own every morning with what matters for the day, without handing the data over.

Approach

  1. Access: A local open-source MCP server for Garmin data. I set it up and limited it to read-only access with an allowlist.
  2. Page: From it, a morning page is generated automatically with a greeting, the weather for Zurich, a suggestion for the day, a readiness ring and figures for sleep, HRV trend, Body Battery and stress.
  3. Schedule: A scheduled task rebuilds the page every morning.

Decisions

  • Local instead of cloud. The data stays on my device.
  • Read-only. The allowlist permits no write access.
  • A page instead of an app. HTML from a template is enough and opens anywhere.

Privacy

The data stays local and the server may only read. Only sample data is shown here, never real health values.

Result

A morning page that appears without me doing anything. Below is a small replica with sample data to try out.

Morning check-in with sample data

Sample data

82
Readiness
Sleep 64 / 100

HRV 57 ms

Body Battery 36 / 100

Stress 20 / 100

Images

Technology

MCP, Python, SQLite, Jinja2, Playwright, scheduled tasks

What I learned

With personal data, I set the permissions first: read only, stay local. Only then do I build.