Health Connect and Apple Health data and screen time per app in your own Postgres and Grafana: six ready-made dashboards, an MCP server so the AI you choose can read your history, a read-only API and QR pairing. Docker Compose or a Helm chart with CloudNativePG. No cloud. Part of Life Dashboard.
- ✓Open-source license (MIT)
- ✓Actively maintained (<30d)
- ✓Clear description
- ✓Topics declared
- ✓Documented (README)
- !Install pipes a remote script into a shell (curl | sh)
claude mcp add life-dashboard-stack -- uvx life-dashboard-stack{
"mcpServers": {
"life-dashboard-stack": {
"command": "uvx",
"args": ["life-dashboard-stack"]
}
}
}MCP Servers overview
<p align="center">
<img src="docs/readme-icon.png" alt="Life Dashboard icon" width="128" height="128">
</p>
<h1 align="center">Life Dashboard Stack</h1>
<p align="center">
<b>Your phone's health data and screen time in your own Postgres and Grafana.</b><br>
The backend for the Life Dashboard Companion apps: Docker Compose or Kubernetes, six dashboards, an MCP server for the AI you choose, no cloud.
</p>
<p align="center">
<a href="https://github.com/owen282000/life-dashboard-stack/releases/latest"><img src="https://img.shields.io/github/v/release/owen282000/life-dashboard-stack" alt="Latest release"></a>
<a href="docker-compose.yml"><img src="https://img.shields.io/badge/Docker%20Compose-3%20services-2496ED" alt="Docker Compose with three services"></a>
<a href="docs/kubernetes.md"><img src="https://img.shields.io/badge/Helm-chart-0F1689" alt="Helm chart for Kubernetes"></a>
<a href="https://artifacthub.io/packages/search?repo=life-dashboard"><img src="https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/life-dashboard" alt="Artifact Hub"></a>
<a href="https://www.postgresql.org/"><img src="https://img.shields.io/badge/Postgres-18-4169E1" alt="Postgres 18"></a>
<a href="https://grafana.com/"><img src="https://img.shields.io/badge/Grafana-13.2-F46800" alt="Grafana 13.2"></a>
<a href="docs/mcp.md"><img src="https://img.shields.io/badge/MCP-server-6E56CF" alt="MCP server"></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue" alt="MIT license"></a>
</p>
<p align="center">
<a href="#quick-start"><b>Quick start</b></a>
·
<a href="docs/install.md">Setup guide</a>
·
<a href="#dashboards">Dashboards</a>
·
<a href="docs/views.md">SQL views</a>
·
<a href="#ask-your-own-ai-mcp">MCP server</a>
·
<a href="docs/kubernetes.md">Kubernetes</a>
·
<a href="https://owen282000.com/life-dashboard/grafana/">Website</a>
</p>
<p align="center">
<picture>
<source media="(max-width: 600px)" srcset="docs/readme-hero-phone.png">
<img src="docs/readme-hero.png" alt="The Life Dashboard overview in Grafana with sample data: tiles for steps today, last night's sleep, overnight low heart rate, weight, screen time and the last sync, a table of the last 7 days against the 28 before, steps per day with a goal line, sleep stages per night and an hourly heart rate band" width="900">
</picture>
<br><sub>Sample data</sub>
</p>
The [Life Dashboard Companion](https://github.com/owen282000/life-dashboard-companion-app) app sends Health Connect data and screen time per app from an Android phone to a webhook, and its [iPhone version](https://github.com/owen282000/life-dashboard-companion-app-ios) does the same with Apple Health. This repository is the other end. One `docker compose up` starts a receiver, a Postgres database and Grafana with six dashboards on your own machine.
It's for people who want their records in SQL rather than in Home Assistant. Treat it as a starting point you can change: it's offered as-is, not as a finished product.
## What you get
- **Every record, checked and kept once.** The receiver checks the HMAC signature and stores every record in Postgres. A payload that arrives twice is applied once, a late one can't overwrite a newer one, and records you delete on the phone are deleted here too.
- **One table, plain SQL views.** All 33 record types of the Android app and the 28 of the iPhone app fit in one `records` table. The `dash` views turn them into days, nights, hours and apps in your time zone.
- **Six dashboards.** An overview as the home page, then Activity, Sleep, Heart and body, Screen time, and Data and sync. Grafana reads as a user that can only `SELECT`.
- **Ask your own AI.** An optional MCP server lets Claude, a local model in Ollama or any other MCP client answer questions such as "did I sleep better in the weeks I walked more?" from your own history, with read-only tools only. It stays off until you set a token.
- **Pairing with a QR code.** The receiver shows a code that the app scans, so you type neither the address nor the secret.
- **Every phone in your household.** Android phones and iPhones send to the same database, and each shows up as its own **Phone** in the dashboards.
- **Your data back out.** A read-only JSON API for scripts, widgets and home screens, off until you set a token.
- **Images, not a build.** Every part is an image on `ghcr.io` for amd64 and arm64, for Docker Compose or the Helm chart. Within a major version, nothing you build on changes.
<p align="center">
<picture>
<source media="(max-width: 600px)" srcset="docs/readme-screen-time-phone.png">
<img src="docs/readme-screen-time.png" alt="The Screen time dashboard with sample data: tiles for today, yesterday, the daily average, the top app, apps used and the last use, minutes per day stacked by app, the top apps, a table per app, minutes per app per day as a heatmap, and how long before sleep the phone was last used" width="900">
</picture>
<br><sub>Sample data. Minutes per app, per day, in a table you own.</sub>
</p>
## How it works
The phone pushes signed JSON to you. There's no cloud account in between, so there's no login that expires, no token to refresh and no API that changes under you.
<p align="center">
<picture>
<source media="(max-width: 600px)" srcset="docs/how-it-works-phone.png">
<img src="docs/how-it-works.png" alt="Diagram: the Android app (Health Connect and screen time per app) and the iPhone app (Apple Health) send HMAC-signed JSON to the receiver, a webhook that checks every signature. The receiver writes every record once to Postgres, with the dash views. Grafana reads them as grafana_ro and shows six dashboards. The optional read-only API and the optional MCP server read them as dash_ro, and the MCP server gives the AI model you choose eight read-only tools through any MCP client, with a local model or one in the cloud." width="900">
</picture>
</p>
[views.md](docs/views.md) explains how records become days and nights, and [compatibility.md](docs/compatibility.md) lists what stays the same within a major version.
## Part of Life Dashboard
Life Dashboard is four projects, and you only install the parts you need. Put the app on each phone, then pick where the data goes. Both apps send the same payload, so an Android phone and an iPhone can share one Home Assistant or one stack.
<p align="center">
<a href="https://github.com/owen282000/life-dashboard-companion-app"><img src="docs/family/android.png" alt="Android app: Health Connect and screen time" width="400"></a>
<a href="https://github.com/owen282000/life-dashboard-companion-app-ios"><img src="docs/family/ios.png" alt="iPhone app: Apple Health" width="400"></a>
<a href="https://github.com/owen282000/life-dashboard-ha"><img src="docs/family/ha.png" alt="Home Assistant integration: sensors and a year of history" width="400"></a>
<picture><img src="docs/family/stack-here.png" alt="Grafana stack: Postgres and Grafana dashboards (this repository)" width="400"></picture>
</p>
The data can also go to an MQTT broker or a webhook of your own instead. Both apps have that built in, for n8n, Node-RED or a script.
## Quick start
You need Docker with Compose, or Podman, and a phone that can reach this machine (the same network, or a VPN).
<a id="pair-the-app"></a>
1. Run the installer. It puts the release files in `./life-dashboard`, writes `.env` with a random secret and passwords, starts the stack and shows the pairing code:
```bash
curl -fsSL https://github.com/owen282000/life-dashboard-stack/releases/latest/download/install.sh | sh
```
2. In the app, open the **Webhook** card on the **Health** tab, tap **Scan a pairing code** and scan the code in your terminal. Then tap **Sync Now** (on Android, on both tabs) and **Backfill** the last 90 days.
3. Open Grafana on port 3000 and log in as `admin` with `GRAFANA_PASSWORD` from `life-dashboard/.env`. The overview is the home page.
Something wrong? The same line with `-s -- doctor` checks the install and says what to fix. The [setup guide](docs/install.md) has the installer's options, the [install by hand](docs/install.md#by-hand), [a NAS or Portainer](docs/install.md#on-a-nas-or-in-portainer), [Podman](docs/install.md#podman), the [pairing code](docs/install.md#pair-the-app), [setting a phone up by hand](docs/install.md#connect-a-phone-by-hand) and [several phones](docs/install.md#several-phones).
## Try it without a phone
The `demo` profile posts 60 days of made-up data for an Android phone and an iPhone through the real receiver. Run it in a folder of its own, under its own project name and ports, so it never touches your own data:
```bash
mkdir lifedash-demo && cd lifedash-demo
curl -fsSLO https://github.com/owen282000/life-dashboard-stack/releases/latest/download/docker-compose.yml
RECEIVER_PORT=18080 GRAFANA_PORT=13000 docker compose -p lifedash-demo --profile demo up -d
```
Then open `http://localhost:13000` and log in as `admin` with the password `lifedash`. [Try it without a phone](docs/install.md#try-it-without-a-phone) has the full steps and how to remove it again.
## Dashboards
Every dashboard has a **Phone** picker at the top, and every panel an info icon that says where its figure comes from.
| | Dashboard | What it answers |
|---|---|---|
| <img src="docs/screenshots/overview.png" width="240" alt="Overview dashboard"> | **Life Dashboard** (overview, home) | How were today and last night, and how does this week compare with the four before it? |
| <img src="docs/screenshots/activity.png" width="240" alt="Activity dashboard"> | **Activity** | Steps, distance and calories per day, steps by hour, and workout minutes per week next to the WHO guideline of 150. |
| <img src="docs/screenshots/sleep.png" width="240" alt="Sleep dashboard"> | **Sleep** | Last nigWhat people ask about life-dashboard-stack
What is owen282000/life-dashboard-stack?
+
owen282000/life-dashboard-stack is mcp servers for the Claude AI ecosystem. Health Connect and Apple Health data and screen time per app in your own Postgres and Grafana: six ready-made dashboards, an MCP server so the AI you choose can read your history, a read-only API and QR pairing. Docker Compose or a Helm chart with CloudNativePG. No cloud. Part of Life Dashboard. It has 5 GitHub stars and its last recorded update is dated 2026-10-17.
How do I install life-dashboard-stack?
+
You can install life-dashboard-stack by cloning the repository (https://github.com/owen282000/life-dashboard-stack) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.
Is owen282000/life-dashboard-stack safe to use?
+
Our security agent has analyzed owen282000/life-dashboard-stack and assigned a Trust Score of 87/100 (tier: Trusted). See the full breakdown of passed checks and flags on this page.
Who maintains owen282000/life-dashboard-stack?
+
owen282000/life-dashboard-stack is maintained by owen282000. The last recorded GitHub activity is dated 2026-10-17, with 0 open issues.
Are there alternatives to life-dashboard-stack?
+
Yes. On ClaudeWave you can browse similar mcp servers at /categories/mcp, sorted by popularity or recent activity.
Deploy life-dashboard-stack to your cloud
Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.
Maintain this repo? Add a badge to your README
Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.
[](https://claudewave.com/repo/owen282000-life-dashboard-stack)<a href="https://claudewave.com/repo/owen282000-life-dashboard-stack"><img src="https://claudewave.com/api/badge/owen282000-life-dashboard-stack" alt="Featured on ClaudeWave: owen282000/life-dashboard-stack" width="320" height="64" /></a>More MCP Servers
Reverse engineer anything with agents, from app behavior down to native binaries.
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ and follow here for daily tips and tricks: https://x.com/Scrapling_dev