For years, my lab results have told the same story: total cholesterol in the normal range, but only because my HDL (the good stuff) was too low while my LDL (the bad stuff) was too high. Triglycerides elevated. The kind of numbers that make doctors furrow their brows and mention statins.

About a decade ago, I tried a ketogenic diet for weight loss. It worked—both for the weight and, surprisingly, for my cholesterol. For the first time, my lab results looked almost normal. But life happened, and I couldn’t stick with it.

Now I’m trying again. Not as a New Year’s resolution (I started January 1st, but that’s coincidence), but because I’ve finally decided to take a data-driven approach. If I’m going to do this, I want to understand what’s actually working and what isn’t.

The Problem with Health Data#

Most health tracking apps want you to use their cloud, their interface, their ecosystem. Your data lives on someone else’s servers, locked in proprietary formats. If the company pivots or shuts down, your history goes with it.

Even if you’re okay with that, the data is siloed. Your lab results are in one portal, your food log in another app, your glucose monitor has its own ecosystem, your smart scale talks to a different cloud, and your fitness tracker lives somewhere else entirely. Getting a complete picture of your health means logging into half a dozen services and eyeballing the correlations yourself.

I wanted something different: a system where I own the data, can query it however I want, and don’t depend on anyone else’s infrastructure.

The Stack#

Here’s what I built:

Element/Matrix for Input#

I already use Element as my daily chat client. Rather than building a separate app or using some clunky web form, I set up a Matrix bot that accepts health data via chat. When I check my ketones or blood pressure, I just message the bot: “ketones 1.2” or “bp 118/78 62”. Natural, quick, and I don’t need another app on my phone.

n8n for Routing and Automation#

n8n is a self-hosted workflow automation tool—think Zapier, but running on your own infrastructure. It receives messages from the Matrix bot, parses them, validates the data, and routes it to the right destination. It also handles things like weekly summary notifications and anomaly alerts.

InfluxDB for Storage#

All the metrics land in InfluxDB, a time-series database running in my k3s cluster. Time-series databases are perfect for health data—everything has a timestamp, and you’re usually querying by time range. InfluxDB’s query language makes it easy to calculate rolling averages, compare time periods, and find correlations.

Grafana for Visualization#

Grafana connects to InfluxDB and turns the raw data into dashboards. I can see trends over weeks or months, overlay different metrics to spot patterns, and drill down into specific time periods. When I eventually get new lab results, I’ll be able to correlate them with my daily measurements.

What I’m Tracking#

  • Blood ketones - Morning measurements to verify I’m staying in ketosis
  • Blood pressure and pulse - Morning measurements, watching for improvements
  • Meals - What I ate and when, so I can correlate with other metrics
  • Weight - Weekly, to track the trend without obsessing over daily fluctuations

Early Observations#

It’s only been a few weeks, but having the data in front of me changes my behavior. When I can see that my ketones dropped after a particular meal, I think twice about eating that again. When I notice my blood pressure trending down, it reinforces that the effort is worth it.

The data sovereignty aspect matters too. This is deeply personal information—I don’t want it on someone else’s servers, subject to their privacy policy and business decisions. It stays on my hardware, backed up on my schedule, queryable on my terms.