Life Dashboard

com.owen282000.lifedashboard
by Zapstore _@zapstore.dev

Health Connect and screen time to Home Assistant, MQTT or webhooks. No cloud.

Republished from GitHub / F-Droid by the Zapstore main account.

Send Health Connect and screen time from your Android phone to Home Assistant, MQTT or your own server. No cloud in between, no account, no analytics or tracking SDKs. Pair with Home Assistant by scanning one QR code, and get 33 Health Connect types and up to a year of history. Works with any app that writes to Health Connect, such as Samsung Health, Google Health (Fitbit and Pixel Watch), Garmin Connect, Oura, Withings and Gadgetbridge. Your data goes only to the addresses you enter: your Home Assistant, your MQTT broker or your own webhook. The app contacts no other server. Home Assistant: - The Life Dashboard integration, installed through HACS. Scan the QR code it shows and you're paired, with no broker and no YAML. Every synced day lands in Home Assistant's long-term statistics on its own date, so a backfill becomes a year of history. - Receive, with the integration: a scale or blood pressure monitor connected to Home Assistant sends its readings to the app, which writes them into Health Connect (weight, height, body composition, blood pressure). Samsung Health and Google Health pick up the weight and body fat from there. You switch it on per type. - MQTT Discovery, for a setup that already runs a broker and only needs the latest values. 24 of the 33 data types plus screen time appear as sensors under one device. TLS and a username and password are optional. Health Connect: - 33 types: steps, sleep with stages, heart rate, HRV, blood pressure, blood glucose, VO2 max, skin temperature, cycle tracking and more. - Every raw record carries its source app and a stable ID, so your server can drop a record that arrives twice. Daily totals come from Health Connect itself, so a walk recorded by both phone and watch counts once. - Each sync sends only what changed since the last one, per data type. - Optional data resolution: send heart rate and other dense series as one summary per 1, 5 or 15 minutes, or per hour, instead of every sample. - Backfill of up to a year runs in the background and picks up where it left off. Screen time: - Time per app, with a day boundary you choose (handy if you stay up past midnight). - Send every app, every app except the ones you select, or only the ones you select. An app left out never leaves the phone, though the day's total still counts its time. Webhooks: - A webhook of your own gets every record in full, including single meals, cycle tracking entries and workout details. Neither MQTT nor the integration turns those into sensors, because they're events rather than values. - Several URLs, custom headers, optional HMAC-SHA256 signing so your server can verify the sender, and client certificates (mTLS) for a server behind a reverse proxy. - Automatic retries, plus an outbox that keeps undelivered syncs (a week of them at the 15-minute interval) until your server is back. - A delivery log in the app, with the payload of each sync. Automation: - Syncs on its own at an interval of 15 minutes or longer, or at fixed times, on the days you pick, with quiet hours. - Home screen widget and Quick Settings tile. - A broadcast intent that Tasker and MacroDroid can use to start a sync. - A notification when syncs fail several times in a row (you pick 3, 5 or 10). Also: settings backup and restore (password-encrypted when secrets are included), and an English, Dutch and German interface. Releases are built by public CI, signed, and carry verifiable build provenance. The project holds the OpenSSF Best Practices badge. Health data needs Android 9 or newer with Health Connect, which is built into Android 14 and later and is a free app from Google Play on Android 9 through 13. Screen time works on Android 8.0 and newer. For households with iPhones too, an iOS app sends the same payload and pairs with the same Home Assistant integration.

First release: Oct 21, 2026, 1 total release.

Most recent release: Oct 21, 2026.

Repo

Appears in 0 app stacks.

0 sats / 0 zaps received in the past year.

Sats Received

Underlying data available via MCP: app_zaps, app_releases.

Zap Count

Underlying data available via MCP: app_zaps, app_releases.

Releases

  • Oct 21, 2026 1.28.0
    ### Highlights - Every webhook address has its own signing secret and headers, so pairing the Life Dashboard stack no longer breaks Home Assistant, or the other way round. After the update each address keeps what its section had; nothing a receiver gets changes. - Backfill reaches back to all your history: 30 days up to 5 years, or **All history** from your oldest record. Asked for by @ADeliciousMan in [life-dashboard-stack#23](https://github.com/owen282000/life-dashboard-stack/issues/23). - A card says when Android's battery optimization holds syncs back, with a one-tap fix, and the app's language can be set in Android's own App languages. ### Added - Backfill reaches back further, asked for by @ADeliciousMan in [life-dashboard-stack#23](https://github.com/owen282000/life-dashboard-stack/issues/23): besides 30 and 90 days it offers 6 months, 1, 2 and 5 years, and **All history**, which starts at the oldest record of the enabled types and sends
    More…
    everything Health Connect has. The dialog lists the lengths with what each covers, names the month All history starts in, and leaves out the lengths that reach back past your oldest record (once it has history access to see that far). A stopped backfill of any length continues where it was, as before. In English, Dutch and German. - A card on the Health and Screen Time tabs while Android's battery optimization is on for the app, which can hold scheduled syncs back for hours. **Fix** asks Android to let the app run in the background (the Google Play build, which may not ask, opens the app's settings instead, where Battery goes to Unrestricted). On Samsung, Xiaomi and Huawei a second button opens the phone's own battery list, which can put an app to sleep regardless. The card goes away once the setting is changed, or for good with **Don't show again**. In English, Dutch and German. - The app's languages show in Android's own App languages setting (Android 13 and later), so the app can be in Dutch or German on a phone in another language. - A webhook address with a credential in it is refused when it is added or edited: a user name or password before the host, or a `password`, `token`, `access_token`, `apikey`, `api_key`, `secret` or `auth` query parameter. Addresses are stored as plain text and end up in backups and the logs, so the message says to put the credential in a header of that address. An address saved before keeps working, and a Google Apps Script URL keeps its token, since Apps Script cannot read headers. In English, Dutch and German. ### Changed - Every webhook address has its own signing secret and custom headers (P2-13). A section used to have one secret for all its addresses, and pairing replaced it, so a Life Dashboard Stack paired before Home Assistant, or the other way round, answered 401 from then on without a word, because the other address still took the payload. Pairing now writes the secret to the paired address alone, and the dialog says the other addresses keep their own. On the Webhook card, tap an address to set its headers and secret, copy them from another address, or correct the address itself: a new scheme, port or path keeps both, another host starts without them. After the update every address has the secret and headers its section had, and an address QR pairing added still has no headers, so nothing a receiver gets changes. While the secure storage cannot keep secrets, right after a reboot, a save, a pairing or an import changes nothing and says to try again in a moment, instead of storing an address without its secret. In English, Dutch and German. - A settings backup carries a `destinations` block with each address's headers and secret. The section keys are still written for the iPhone app and older versions, with headers and a secret only when every address has the same ones, so an older reader gets a 401 instead of sending one receiver's key to another; see [docs/settings-backup.md](docs/settings-backup.md#file-format). ### Fixed - A payload the receiver accepted stays delivered when its log row cannot be written, for example on a full disk. Until now that turned it into a failure that was queued and sent again, which a receiver that only inserts counted twice. The receiver's answer alone decides delivered or failed. - The setup wizard keeps what was typed and scanned when the phone turns. A scanned pairing code stays a scanned code after the turn, so finishing still writes its address only where the pairing dialog put it. The secret and the MQTT password stay out of the saved screen state. - The status bar no longer gets a colour of its own before Android 15. It was the one deprecated window call Google Play's pre-launch report pointed at, and it now looks the same on every version: the screen shows through it. <!-- Release notes generated using configuration in .github/release.yml at 1.28.0 --> ## What's Changed ### Features * feat: Every webhook address has its own signing secret and headers, and pairing signs only its own (P2-13) by @owen282000 in https://github.com/owen282000/life-dashboard-companion-app/pull/167 * feat: Backfill reaches back to all history, with lengths from 30 days to 5 years by @owen282000 in https://github.com/owen282000/life-dashboard-companion-app/pull/179 ### Fixes * fix: A delivered payload stays delivered when its log fails, the wizard survives a turn, and a card says when battery optimization holds syncs back by @owen282000 in https://github.com/owen282000/life-dashboard-companion-app/pull/166 ### Dependencies * build(deps): Bump trufflesecurity/trufflehog from 3.97.9 to 3.99.2 by @dependabot[bot] in https://github.com/owen282000/life-dashboard-companion-app/pull/171 * build(deps): Bump actions/setup-java from 6.0.1 to 6.1.0 by @dependabot[bot] in https://github.com/owen282000/life-dashboard-companion-app/pull/172 * build(deps): Bump com.hivemq:hivemq-mqtt-client from 1.4.0 to 1.4.1 by @dependabot[bot] in https://github.com/owen282000/life-dashboard-companion-app/pull/173 ### Other changes * ci: Every CodeQL step moves to v4.39.0 together, and Dependabot groups them from now on by @owen282000 in https://github.com/owen282000/life-dashboard-companion-app/pull/177 **Full Changelog**: https://github.com/owen282000/life-dashboard-companion-app/compare/1.27.0...1.28.0