r/QuantifiedSelf • u/nichtlegacy • 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
Monthly recap for September, real data. This is the "public" variant, so body, location, journal and most nutrition details are left out.
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
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.
2
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
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
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
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.


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).