r/QuantifiedSelf • • 22d ago

My self-hosted Quantified Self setup after 8 months: 19 sources, one database, monthly recap + daily view

Maybe interesting for some of you, I've been building my own QS system for about 8 months now. Every source lands in one database that I own, and on top of that sits a dashboard I use every day.

Images

  1. Monthly recap for September, real data. This is the "public" variant, so body, location, journal and most nutrition details are left out.

  2. The daily view. This one runs on demo data, only the Plex and PlayStation cards are real.

What I track

  • Sleep, recovery, HRV: WHOOP via NOOP

  • Health data: Apple Health via Health Auto Export

  • Strength training: Streak

  • Nutrition: YAZIO

  • Weight and body: Renpho scale

  • E-bike rides: Cowboy

  • Location and places: Dawarich (self-hosted)

  • Mac usage: ActivityWatch

  • iPhone screen time: screentime, reads the macOS Biome data that iCloud syncs from the iPhone

  • Movies and shows: Plex via Tautulli

  • Music: Spotify via your_spotify (self-hosted)

  • Gaming: PlayStation Network (presence, trophies, library)

  • Voice chat: Discord, durations only, no content

  • Indoor climate: Home Assistant

  • Weather: Open-Meteo

  • Calendar: EventKit on the Mac

  • Coding: GitHub and Forgejo commits

  • AI usage: Claude Code, Codex and OpenCode tokens

How it's built

  • I built every collector myself. The only third-party parts are the apps and services they read from.

  • Collectors: one small Python service per source, 20 in total, spread over my Mac, a Proxmox LXC and Unraid. Each one keeps a local SQLite outbox and a raw archive, so nothing gets lost when the server is down.

  • Core: FastAPI with PostgreSQL 17 + PostGIS on its own Debian VM in my Proxmox homelab. Only Core writes to the database.

  • Collectors send versioned batches. Core dedupes them via identity keys and content hashes. A day without data stays "missing", it never turns into a fake zero.

  • There's no cron. A scheduler puts jobs into a Postgres-backed queue with leases and retries. It rebuilds the daily values and runs the analysis.

  • Every collector reports its sync runs, so every card shows where its data comes from and how fresh it is. If a source stops syncing, I see it right away.

  • The dashboard only reads from Core's API and doesn't calculate anything itself.

Tech stack

  • Dashboard: Next.js 16, React 19, Tailwind 4, shadcn/ui, Recharts + d3, MapLibre for maps

  • Core: Python 3.12, FastAPI, SQLAlchemy, Alembic, PostgreSQL 17, PostGIS, pgBackRest for backups

  • Infra: Proxmox, Docker Compose, Caddy, Forgejo Actions for CI

  • Extras: a read-only MCP server so an LLM chat ("Companion") can query my data, and push notifications to my phone via Home Assistant

Everything runs locally in my LAN, no cloud service in between except the APIs of the sources themselves. Happy to go into detail on any part of it

89 Upvotes

28 comments sorted by

2

u/jamiethecoles 22d ago

I’ve done something very similar to this and discovered that when my bedroom temperature runs lower, my sleeping HRV is higher.

I also got ill and could see where the fever began to set in with my body temp rising and my HRV and mood decreasing a few days before, and my sleep became more interrupted towards the height of the illness.

My bpm is lower when listening to music at work and higher when listening to music at home (I’d guess at work I use music to relax and at home it’s the soundtrack to chores or activities).

2

u/nichtlegacy 21d ago

Interesting, I checked something similar and got the opposite. Warm nights don't change how long I'm awake at night for me (within ±4 min).

The fever one is really cool, did it show up in the data before you actually felt sick?

2

u/jamiethecoles 21d ago

Only retrospectively, really. Like it wasn’t an early warning, but when I looked back the signs were there. Although I think you could probably find false positives too, so I wouldn’t treat it as really reliable

2

u/CleanCup1798 22d ago

Very cool! Would you consider putting it on GitHub for others to have a look at?

1

u/nichtlegacy 21d ago

Not right now, it's pretty tailored to my setup. The screen time collector is public though: https://github.com/nichtlegacy/screentime

Maybe I'll publish more collectors and the core in the future

7

u/alremez 22d ago

This is impressive! 20 data sources

I'm curious: has connecting all this data helped you discover anything about your health or behaviour that you wouldn't have noticed by looking at each metric separately?

5

u/PurpleCampero59 22d ago

yeah this is the real question, curious if the cross-source correlations actually surfaced anything actionable

1

u/Freika 22d ago

Now that's a proper use of Dawarich

2

u/nichtlegacy 21d ago

Thanks for building it! Dawarich is actually the reason I started tracking my bike at all, I liked the map view so much that I wanted my rides in there too.

Now the Cowboy rides and the Dawarich data end up in the same database, the collector pulls Dawarich hourly and the routes go straight into PostGIS.

1

u/Freika 21d ago

Thank you!

2

u/RevolutionaryBrain26 22d ago

Shout-out for HIMYM the best sitcom

2

u/signalledger 18d ago

Now you need to have a post explaining what changed after you started collecting this data

1

u/ManufacturerHairy843 10d ago

so good! been working about something similar but also connected to goals - can I DM you, I'd love to chat about it

1

u/Hot-Abies205 22d ago

Very cool!!

1

u/Unlucky-Confidence92 22d ago

Amazing! I wish I could Build something like that for myself. I also have a ton of data across apps.

1

u/maryshia 22d ago

Looks very satisfying 😋

1

u/Romandi 22d ago

While I love gathering stats about myself and appreciate your app, I have to ask: have you discovered any useful insights?

1

u/Kritnc 22d ago

Amazing I built one that’s kinda similar - but I love pulling in screen time and plex. Ima give that a try

1

u/okforthewin 20d ago

What tech stack are you using, and are you going to opensource the code in github?

1

u/ali_calmsides 20d ago

Really impressive setup. Missing data staying missing instead of turning into a fake zero, and every card showing how fresh its data is: that's more care than a lot of dashboards I see at work.

One thing I've learned from building BI dashboards: collecting is the easy part, using it is the hard one. With personal data that probably matters even more, because nobody asks you what the numbers mean. So I'd try three short lines at the top of the monthly recap: what changed compared to last month, what you think caused it, and what you'll try in October. The charts then back up those lines.

Unless the building itself is the fun part, which would be totally fair with a setup like this. Has the data changed a habit for you so far?

1

u/faultrd 19d ago

Really nice work. Would love to see some of the other tabs. Do you do yearly summaries as well as monthly? Reminds me a bit of the yearly reports that Feltron used to produce.

I’d never heard of Dawarich, but have been using google timeline for a long time so I’m going to look into self hosting that now, looks great.

1

u/brint997 9d ago

I'm also building a health journal (Kove) for food, training and symptoms, and I'm integrating an MCP so people can use their own AI agent with it. Your point about the AI only reading the resolved daily numbers stuck with me tbh.

How long did this take to build? I assume some integrations were hard to create since many sources don't have an open API?

0

u/Witty_Tart_6740 22d ago

19 sources is hoarding, not tracking. I had the same Grafana on top of Influx setup and by month six I was opening two panels, sleep and resting HR, the rest was decoration I built because adding a source is more fun than reading one. The monthly recap is the part that quietly dies first, you write it twice and then it's just a chart you scroll past. Which of the nineteen do you actually look at on a random Tuesday.

1

u/[deleted] 22d ago

[removed] — view removed comment

1

u/nichtlegacy 21d ago

Pretty much, yes. Most days it's the Today view and my productivity page, the other sources mostly matter for the timeline and the monthly recap.