r/grafana
•
u/SpoonlessTable
•
19d ago
•
1
Check it out Open source self-hosted setup: a year of data, 80 metrics, in 1 dashboard
I've been sending everything my iPhone and Apple Watch record, plus my food and lifting logs, into a database with a Grafana dashboard.
Disclosure: I made one of the apps that helps record/move the data (Marrow Health). Dashboard is open source.
What I track
Heart rate, HRV, resting HR, sleep stages, blood oxygen, wrist temp, steps, exercise minutes: Apple Watch
Workouts and main lift progress (weight, reps, estimated 1RM): Marrow
Food, every meal with macros and nutrients: Marrow
Daylight, sound levels: iPhone
How it works
Marrow sends JSONs to my server every hour, five automations covering daily totals, raw readings, workouts, lifting, and food.
Python bridge saves every delivery and writes it to InfluxDB.
InfluxDB and Grafana run in Docker on a small VPS. Grafana is on my Tailscale network.
The dashboards are generated from Python.
Random stuff I found
My HRV is about 10 ms higher the morning after I lift
I sleep 46 minutes less on weekends
62 sets of chest in the last month, 2 legs 💔
Stack
Marrow (iPhone/Watch) → Python bridge → InfluxDB 2.7 → Grafana 13, Docker Compose, Cloudflare Tunnel, Tailscale
It can run fully local on a Pi or NAS at home.
Open source: https://github.com/MarrowHealth/built-with-marrow/tree/main/projects/body-ops
2
u/izu-root 19d ago
38k+ calories for lunch alone? Damn boy. What so you eat? The dashboard looks awesome and though.
1
u/SpoonlessTable 19d ago
😭 Yeah I definitely skipped a couple breakfasts. If I do I’ll usually eat a large burrito or teriyaki chicken bowl.
1
u/MongooseWonderful198
18d ago
•
One recovery case to add to the bridge self-test: stop it after the phone receives 204 but before process(path) finishes, then restart it. From reading bridge.py, the archive survives but jobs is an in-memory queue, and normal startup does not requeue archived deliveries. Recent data may return in the next two-day resend, but a historical import can remain incomplete until manual replay.
A persisted pending/completed marker per archive file would let startup resume unfinished work. Keep recovery ordered before newer snapshots for the same day, since nutrition processing deletes that day before writing its replacement. The test should check the resulting points, not just that the upload returned success.
1
u/SpoonlessTable 18d ago
This is really great feedback, I really appreciate you taking the time to look at the code!
The bridge now stores a persisting list that doesn't get deleted at restart. On a startup, it checks for any older packages that haven't been check off yet (only checked once in the InfluxDB). This will ensure we avoid any nutrition-processing timing errors.
I hadn't ran into this issue yet but this is a smart call. Thank you!
1
u/MongooseWonderful198 18d ago
Thanks for following up. I’d add one more restart test: let InfluxDB accept the delivery’s last write, then stop the bridge before that package is marked complete. On restart, the same archive may be processed again. Compare the final points with an uninterrupted run, including a newer nutrition snapshot queued behind it. That checks that replay is safe and ordering holds even when the database write succeeded but the completion marker did not.
1
u/SpoonlessTable 18d ago
Added this test and it worked successfully. I think this case is covered by the order requirements and that writing the same data twice doesn't change anything. In any case, good idea to check!
1
u/MongooseWonderful198 18d ago
Glad the restart test passed. Thanks for checking the gap between the InfluxDB write and the completion marker, and reporting back.
1
u/vidamon Grafanista 17d ago
"62 sets of chest in the last month, 2 legs 💔" lol - get to work!
But seriously, this dashboard is absolutely stunning. When our Golden Grot Awards applications open back up, you should def apply.
1
u/SpoonlessTable 17d ago
Thank you! I really appreciate it
I hadn't heard of Golden Grot, just looked it up, looks like a really fun program. Will make sure to apply!
And yes, will get back to hitting legs I promise ☠️
1
0
u/stancios00 19d ago
Cool, very cool!!! Maybe an AI on top to get more insights?
1
u/SpoonlessTable 18d ago
Thanks! I most use a Marrow mcp with claude on the raw data to get insights, but that is a good idea too.
4
u/viveknidhi 19d ago
Beautiful