Hælan

Your health data, kept where you can reach it.

A self-hosted dashboard and a complete local mirror, built on the Google Health API v4. Every day you have recorded, in one SQLite file, long after the API stops handing it back.

Open the demo Read the source

Generated data, no account, nothing to install. The README runs the same thing against your own history.

91 days, every one of them still here 8 June to 6 September 2026 · 4,183 to 15,623 steps · generated data

The mirror

Your whole history, on your disk

One SQLite file, kept past Google's retention windows and surviving you losing access to the API. Intraday samples age out at the source, so a mirror is the only place minute-level history stays at that resolution.

The dashboard

Nine pages that answer something

Dashboard, Records, Activity, Sleep, Recovery, Health, Weight, Nutrition and Notes: sleep with stages, workouts with per-split heart rate, all-time bests over the whole archive, and any reading you know is wrong marked as wrong.

The tools

Answerable by an agent you trust

An MCP server over the same mirror, so a model you choose can ask questions of your own history. The catalogue is generated from what ships, in TOOLS.md.

Why it is self-hosted

Google caps an unverified OAuth client at a hundred users, and clearing verification for health scopes needs a paid third-party security assessment. A hosted dashboard therefore stalls at a hundred signups no matter how good it is. An instance whose only users are the people who own its OAuth client never meets that cap.

The cost is that every household brings its own Google Cloud project. The benefit is that no ceiling exists.

Run it

One compose file

Then open the instance and follow the setup wizard, which walks through the Google Cloud project and the OAuth client it needs. The README is the full account, including a configuration reference for people who disagree with the defaults.

services:
  haelan:
    image: ghcr.io/bardesss/haelan:latest
    ports: ['4235:4235']
    volumes: ['haelan-data:/data']
    restart: unless-stopped
volumes:
  haelan-data: